Android:オンドローは絶えず呼びかけたり、アニメーションが元の位置にスナップします
-
28-10-2019 - |
質問
だから、私の質問はこれらの2つの質問に多少似ています。
rotateanimationを適用するカスタムクラスを拡張するImageViewがあります。アニメーションは、入力X-coordinatesを使用して最後の角度から次の角度への回転を実行するため、ユーザーは必要に応じて-360度から360度にYamageViewを回すことができます。このコードをondraw()に使用すると、すべてが画面上で完璧に見えます(アニメーションは以下のコードのように設定されています):
@Override
protected void onDraw(Canvas canvas) {
Log.d(TAG, "It is drawn again!");
this.setAnimation(anim);
super.onDraw(canvas);
}
これに関する問題は、言及された他の投稿と同じように、アニメーションは、おそらくロータアニメーションクラスのInvalidate()を介してアニメーションなどを呼び出すオンドローを呼び出すことです。これは正しく観察されていますか? 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を手放すと、ゼロ角度に戻ります。ユーザーが入力を提供しない場合、変数Current_AngleでImageViewを常に回転させたいと考えられています。
anim.setFillafter(true)、anim.setFillenabled(true)、nivalidate()、およびthis.startanimation(anim)のさまざまなバージョンを試しましたが、この問題に何の影響もないようです。
これを呼び出すのに最適な場所はどこですか。
解決
使用しないことをお勧めします Animation
静的変換をビューに適用するためのフレームワーク。新しいものを適用したときにリセットすることによって引き起こされる問題に対処する必要がないように Animation
毎回。
あなたが回転させたい内容に画像が含まれている場合は、あなたの画像を包むことを検討してください RotateDrawable
それをあなたの内容として設定します ImageView
. 。これにより、レベル値を設定することにより、描画可能な回転がどのように回転するかを制御できます。 Drawable.setLevel()
また ImageView.setImageLevel()
トリックを行う必要があります)と変換は固執します。アニメーションを一定期間自動化する必要がある場合は、 Handler
それは更新を頻繁に投稿します。
別のオプションは、カスタムを作成することです ViewGroup
そして、使用します getChildStaticTransformation()
任意の子ビューに回転を適用する方法(必ず有効にするか、すでに有効になっているサブクラスをオーバーライドしてください)。 Transformation
何ですか Animation
フレームワークは、ビューの外観を変更するためにも使用します。この場合、あなたはまだ電話する必要があるでしょう invalidate()
ユーザー入力が変更されたときに、再ドローを強制するために。同じ Handler
変更を定期的に自動化する場合は、ルールが適用されます。
回転可能な例
回転したい画像がres/drawable/wheel.pngで、res/drawable/wheel_rotate.xmlで簡単なxmlファイルを作成します。
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/wheel"
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:pivotY="50%" />
あなたの画像をaに巻き付ける RotateDrawable
. 。次に、javaコードで、そのコンテンツとして描画可能なセット ImageView
:
ImageView wheel;
//You only do this once
wheel.setImageResource(R.drawable.wheel_rotate);
//Adjust the progress any time you need to by adjusting the drawable's level
wheel.setImageLevel(500);
デフォルトでは、レベルの範囲は0〜10,000です。そのため、0レベル= from Degreesと10,000レベル= Todegreesにマップします。
Hth