7

プロパティ アニメーションハードウェア アクセラレーションについて読みましたが、アニメーター クラスを使用する最も効率的な方法は何なのかまだわかりません。(この質問のために、ハニカムの前にデバイスをサポートする必要はありません。したがって、アニメータークラスを使用したいと思います。)

たとえば、ビューがあるとします。このビューには、フェードインしたい BitmapDrawable があります。ビュー内には、変更されない他の多くの要素もあります。

アニメーターで使用するのに最適なプロパティまたはオブジェクトはどれですか? ドローアブル?onDraw でビットマップを描画しているペイントですか? 他の何か?

ハードウェアアクセラレーションで最も効率的にするにはどうすればよいですか? これには、アニメーションの各ステップで無効化を呼び出す必要がありますか?それとも、アニメーションの各ステップでビューの残りの部分を完全に再描画せずに、ドローアブルのみをアニメーション化する方法はありますか?

最適なケースは、ビューの残りの部分をソフトウェアで完全に再描画する必要はなく、ハードウェア アクセラレーションがドローアブルを効率的にフェードすることだと思います。

推奨されるアプローチへの提案や指針はありますか?

ありがとう!

4

3 に答える 3

4

オブジェクト プロパティ アニメーターを使用すると、基本的には、「N」が変更するプロパティである X ミリ秒ごとに「setN()」メソッドを繰り返し呼び出す単なる数学関数になります。

アルファの場合に提供された例では、両方とも、invalidate()アニメーション化しているビューを再描画するために を呼び出す必要があります。違いはsetAlpha()Viewオブジェクトを呼び出すとき、それがあなたを呼び出すinvalidate()ことです。ターゲット オブジェクトをPaint、ドローアブルの描画に使用されるオブジェクトに設定する場合でも、新しいパラメータで再描画invalidate()されるように を呼び出す必要があります。ViewPaint

理想的には、アニメーション化するビューでのみ再描画が行われるように、ターゲットを可能な限り最高レベルの子に設定する必要があります。たとえば、ターゲットをルート ビューに設定すると、invalidate()ViewGroup 全体のすべての子が呼び出さdraw()れ、ViewGroup のすべての子が呼び出されます。最上位に設定するとImageView、 のみImageViewが再描画されます。

ハードウェアを最大限に活用するには、レイヤー プロパティを使用する必要があります。最初に、アニメーション化する最上位の親ビューを決定する必要があります。のみをフェードしたい場合はDrawableDrawableまたは を含むになりViewます。すべてをフェードしたい場合は、ルート ビューになります。アニメートすることを決定したViewものはすべて、一度に全体に適用されます。

setLayerType()Animator を開始する直前に、親ビューで使用します。に設定しView#LAYER_TYPE_HARDWAREます。次に を設定し、アニメーターの完了時にAnimationListenerLayerType をView#LAYER_TYPE_SOFTWAREまたはにリセットします。View#LAYER_TYPE_NONE

myParentView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
myObjectAnimator.addListener(new ViewAnimator.AnimatorListener() {
  public void onAnimationEnd(Animator animation) {
    myParentView.setLayerType(View.LAYER_TYPE_NONE);
  }
  public void onAnimationRepeat(Animator animation) {
  }
  public void onAnimationStart(Animator animation) {
  }
  public void onAnimationCancel(Animator animation) {
    myParentView.setLayerType(View.LAYER_TYPE_NONE, null);
  }
}
myObjectAnimator.start();

この場合、プロパティmyParentViewを使用して変換すると、レイヤーとそのすべての子が 1 つの平面に配置されます。ハードウェアメモリに入れます。ビュー全体を一度に翻訳します。次に、完了したら、メモリから削除します。translateXmyParentViewmyParentView

編集:

最後に、Alpha は CPU に大混乱をもたらします。ハーフ アルファの何かをビュー全体で翻訳すると、ビューを単純に翻訳する場合よりもレンダリングが難しくなります。控えめに使用してください。

于 2012-11-02T15:03:24.623 に答える
1

質問を確認した後、適切な使用方法を理解できるようにきちんとしたこの標準ドキュメントinvalidate()を確認することをお勧めします。次に、さまざまな状況でアニメーションを操作するために、Android API によって既に提供されているさまざまな方法があります。

ここで、あなたの疑問のほとんどが解消されることを願っています。サブセクションと関連するブログに記載されている内容を確認してください。

これがあなたを助けることを願っています。

于 2012-11-08T10:45:28.667 に答える
1

おそらく、新しいビュー (アニメーターのみを含む) を元のビューに重ねることができます。透明に設定された新しいビュー。

あなたがすべきリセットは、元のビューのない新しいビューでは無効です。

于 2012-11-08T01:59:40.370 に答える