だから、元の位置に戻ってスナップ:私はカスタムクラス拡張ImageViewのを持ってアンドロイド:onDraw常に呼ばやアニメーションは私の質問は、これら2つの質問に少し似て、
Custom View onDraw is constantly called
android: onDraw is called constantly
たI RotateAnimationをに適用します。このアニメーションでは入力x座標とy座標を使用して最後の角度から次の角度への回転を実行するので、ユーザーは必要に応じて-360度から360度までImageViewを回すことができます。私はonDraw()のために、このコードを使用すると、すべてが(アニメーションは、さらに以下のコードのように設定されている)画面上で完璧に見える:
@Override
protected void onDraw(Canvas canvas) {
Log.d(TAG, "It is drawn again!");
this.setAnimation(anim);
super.onDraw(canvas);
}
これで問題がある
、他の記事と同様に、アニメーションは、おそらくRotateAnimationクラスのinvalidate()によってアニメーションなどを呼び出すonDrawを呼び出します。これは正しく観察されていますか? ImageViewは常に現在の計算された角度にとどまっているため、出力は完璧ですが、アニメーションの計算はそのまま継続され、多くの電力と容量を消費します。
これを修正するには、アニメーションのパラメータが計算されるメソッドでthis.setAnimation(anim)を移動しようとしました(isClockWise()、calculateAngleToMove()およびその他のアンドロイド以外のものは無視してください) ):
private void turnWheel(){
float angle = 0;
if (isClockWise()){
angle = calculateAngleToMove();
anim = new RotateAnimation(current_angle, angle, center_x, center_y);
anim.setFillAfter(true);
anim.setFillEnabled(true);
current_angle += angle;
}
else{
angle = - calculateAngleToMove();
anim = new RotateAnimation(current_angle, angle, center_x, center_y);
anim.setFillAfter(true);
anim.setFillEnabled(true);
current_angle += angle;
}
if (current_angle > 360){
current_angle = current_angle - 360;
}
if (current_angle < -360){
current_angle = current_angle + 360;
}
this.setAnimation(anim);
this.invalidate(); //Calls onDraw()
}
これはonDrawが常に呼び出されると、問題を解決するが、それは別のものを作成します。ユーザーが押したとき、保持し、ImageViewのターン、それは前後にゼロ角度と現在の角度の間にスナップします。ユーザーがImageViewを離れると、ゼロ角度に戻ります。ユーザーが入力を提供していない場合でも、ImageViewを変数current_angleで常に回転させたいと考えています。
私は(真)(真)anim.setFillAfter、anim.setFillEnabledの異なるバージョンを試してみましたが、無効()とthis.startAnimation(アニメーション)、しかし、彼らはこの問題に影響を持っているように見えることはありません。
this.setAnimation(anim)を呼び出す場所はどこですか?
RotateDrawableを使用すると、良い解決策のように思えますが、これをプログラマチックに行う方法がわかりません。あなたは例を教えてくれますか? –
必要なすべてのフックを提供する簡単な例が提供されています。 – Devunwired
うまく動作します、ありがとう! :) –