2012-01-15 15 views
0

だから、元の位置に戻ってスナップ:私はカスタムクラス拡張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)を呼び出す場所はどこですか?

答えて

0

Animationフレームワークを使用してビューに静的な変換を適用しないようにして、毎回新しいAnimationを適用したときのリセットによる問題に対処する必要はありません。

回転するコンテンツに画像が含まれている場合は、画像をRotateDrawableにラップして、ImageViewのコンテンツとして設定することを検討してください。これにより、レベル値(Drawable.setLevel()またはImageView.setImageLevel()のいずれかを行う必要があります)を設定することによってドロアブルがどのように回転するかを制御することができ、変換がスティックされます。ある期間アニメーションを自動化する必要がある場合は、更新を頻繁にポストするHandler内のレベル設定コードを呼び出すだけで済みます。

別のオプションは、カスタムViewGroupを作成し、getChildStaticTransformation()メソッドを使用してローテーションをすべての子ビューに適用することです(有効にするか、既に有効にしているサブクラスを上書きするようにしてください)。 Transformationは、Animationフレームワークがビューの外観を変更するために使用するものです。この場合、再描画を強制するためにユーザー入力が変更された場合でも、invalidate()に電話する必要があります。定期的に変更を自動化する場合は、同じHandlerルールが適用されます。

RotateDrawable例

のは、RES /描画可能/ wheel_rotate.xmlで、単純なXMLファイルを作成し、あなたが回転して欠けている画像は、RES /描画可能/ wheel.pngであるとしましょう:

<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%" /> 

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レベル= fromDegreesと10,000レベル= toDegreesにマップされます。

HTH

+0

RotateDrawableを使用すると、良い解決策のように思えますが、これをプログラマチックに行う方法がわかりません。あなたは例を教えてくれますか? –

+0

必要なすべてのフックを提供する簡単な例が提供されています。 – Devunwired

+0

うまく動作します、ありがとう! :) –

関連する問題