8

カスタム ビューをゼロから作成しました。拡張Viewおよび上書きonDraw()。ビューをアニメーション化するときに、オフセットを使用してカスタム アニメーションを生成します。例えば。

while(!isOnTop){
mOffset++;

//draw the component a a it higher using the offset

if(position == 0)
isOnTop==true;
invalidate();

}

私のフレームはそれ自身を無効にすることから来ているという考えです。問題は、同じ画面でリストビューをスクロールするだけで、このビューが無効になる可能性があることです。

この「共有された無効化()」は、私のアニメーションに遅れを引き起こします。その遅れから抜け出す方法はありますか?

その共有環境でアニメーションを実行するための他の提案はありますか? オフセットを計算する別のスレッドを使用してアニメーションを作成するには、アニメーションを表示するために強制的な invalidation() 呼び出しも必要です (間違っている場合は修正してください)。

たとえば、より大きなステップで10回の無効化リクエストでアニメーションを実行する唯一の解決策はありますか? ラグアウトは緩和されますが、別のアプローチを使用できると思います。

4

2 に答える 2

22

もちろん、「何が最善か」は、あなたが何をしようとしているのかによって大きく異なります。あなたは何を達成しようとしているのかを語っていないので、私たちはあなたにとって何が最善であるかを推測することしかできません.

ここにいくつかの簡単なものがあります:

  • ビットマップ フレームをアニメーション化する場合は、AnimationDrawable を使用します: http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html

  • 階層内のビューの動きをアニメーション化する場合は、ビュー アニメーション フレームワークを使用します: http://developer.android.com/guide/topics/graphics/view-animation.html

  • 新しいより一般的なアニメーション フレームワークは、より多くのことを実行でき、多くの場合、使いやすくなっています: http://developer.android.com/guide/topics/graphics/animation.html。これは Android 3.0 以降でネイティブに使用できますが、サポート v7 ライブラリを使用して Android API レベル 7 でも使用できます。

  • ビュー階層の統合部分であり、独自のアニメーション描画を手動で行うカスタム ウィジェットを作成する場合は、Handler を使用して更新の時間を計ることができます (通常、それぞれの invalidate() の間に 60fps または 20ms が必要です)。次に、 onDraw() メソッドで、 SystemClock.uptimeMillis() に基づいてビューの状態をアニメーションの開始時からのデルタとして描画します。

以下は、Handler を使用した単純な無効化の繰り返しです。

long mAnimStartTime;

Handler mHandler = new Handler();
Runnable mTick = new Runnable() {
    public void run() {
        invalidate();
        mHandler.postDelayed(this, 20); // 20ms == 60fps
    }
}

void startAnimation() {
    mAnimStartTime = SystemClock.uptimeMillis();
    mHandler.removeCallbacks(mTick);
    mHandler.post(mTick);
}

void stopAnimation() {
    mHandler.removeCallbacks(mTick);
}
于 2011-10-16T22:28:28.337 に答える