私の活動では、3つのカスタムビューがスタックされています。 下位のものはSurfaceViewフルスクリーンで、中間のものはGridViewから派生し、onDrawをオーバーライドしてカスタムグラフィックを追加します。カスタムビューでinvalidate()を呼び出すと、onDraw(Canvas c)が呼び出されません。
トップビューは直接ビューから派生し、画面の一角にあり、他の2つのビューを制御するノブとして機能します(これは問題のあるビューです)。アニメーション保留がある場合は、各描画サイクルの後にビューが自動無効化すべきで、理想的
public class StubKnobView extends View{
private Drawable knob;
private Point knobPos;
private float rotation;
private boolean needsToMove;
public void moveKnob(){
/* ...various calculations... */
this.needsToMove=true;
invalidate(); //to notify the intention to start animation
}
private void updateAnimation(){
/* ........... */
this.needsToMove= !animationComplete;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
int saveCount=canvas.getSaveCount();
canvas.save();
canvas.rotate(this.rotation, this.knobPos.x, this.knobPos.y);
this.knob.draw(canvas);
canvas.restoreToCount(saveCount);
if(this.needsToMove){
updateAnimation();
}
}
}
:このビューにカスタムアニメーションを追加する
は、私はこのパターンを使用していました。
今、これは動作しません。アニメーションを強制するために、画面にタッチしてonDrawサイクルを発生させる必要があります。 Devツールの "show screen updates"の使用画面をクリックすると、画面の無効化/更新サイクルが発生しないことがわかります。 汚れた矩形を指定しても効果はありません。
したがって、この無効化/描画サイクルがなぜ機能しないのかを知るためには、どのようなアイディアが必要ですか?
最後に、私が使用した解決策はこれと似ていました – andijcr