Object Property Animatorsを使用すると、基本的には、「N」が変更するプロパティである「Xミリ秒」ごとに「setN()」メソッドを繰り返し呼び出す数学関数に過ぎません。
アルファの場合に提供される例では、アニメーション化しているビューを再描画するには、どちらもinvalidate()
を呼び出す必要があります。相違点は、をView
オブジェクトに呼び出すときです。invalidate()
が呼び出されます。描画オブジェクトの描画に使用するPaint
オブジェクトに対象オブジェクトを設定する場合は、をView
に呼び出して、新しいPaint
パラメータで再描画する必要があります。
理想的には、できるだけ上位レベルの子にターゲットを設定したいので、再描画はアニメーション化するビューでのみ行われます。たとえば、ターゲットをルートビューに設定すると、ViewGroup内のすべての子に対してinvalidate()
が呼び出され、ViewGroup内のすべての子に対してdraw()
が呼び出されます。それをトップレベルImageView
に設定すると、ImageView
だけが再描画されます。
ハードウェアを最大限に活用するには、レイヤープロパティーを使用する必要があります。まず、アニメートする最上位の親ビューがどのようになるかを決定する必要があります。 Drawable
だけを消したい場合は、Drawable
またはView
を含むでしょう。すべてを消したい場合は、それがルートビューになります。あなたがアニメートすることを決めたものは、一度に全体としてView
に適用されます。
Animatorを起動する直前に親ビューでsetLayerType()
を使用してください。 View#LAYER_TYPE_HARDWARE
に設定します。次に、AnimationListener
を設定し、アニメーターの完了時にレイヤータイプをView#LAYER_TYPE_SOFTWARE
またはView#LAYER_TYPE_NONE
にリセットします。あなたがtranslateX
プロパティを使用してmyParentView
を翻訳した場合
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
と、すべてのそれの子を配置します。それをハードウェアメモリに入れてください。ビュー全体を一度に翻訳します。完了したら、メモリから
myParentView
を削除します。
EDIT:
最後の注意点、アルファは、CPUに大混乱を天下。ハーフアルファに何かがあり、それをビュー全体に翻訳すると、単にビューを翻訳するよりもレンダリングが難しくなります。それは控えめに使用してください。
これは問題を引き起こしているので、これを尋ねていると思います。アニメーションはおそらくすべてを無効にしていますが、私たちにあなたが持っているビュー階層を表示すると、回避策が見つかるかもしれません。あなたがアニメ化しているものを指定してください。 –
いいえ、まだ何も書いていない、私がする前にすべての情報を取得しようとしています。 :) – cottonBallPaws
アニメーションが平均的なデバイスでうまくいくなら、私たちはいいです。ただし、ハードウェアアクセラレーションなどの一般的な拡張機能(常に利用可能なわけではない可能性があります)を行った後でさえ、目立つほど重い場合は、自分の解決策を見つける必要があります。たとえば、階層全体を無効にしている背景をアニメートする場合は、階層のスナップショットを作成し、背景のアニメーションを作成します。とにかく、おそらくハードウェアアクセラレーションとほとんどのデバイスでうまくいくので、努力をするかどうかは本質的にあなたの決定です。 (うまくいけば:) –