Android 4.1 (API Level 16)の ViewPropertyAnimator の変更点を調べました。
変更点
以下の3メソッドが追加されています。
- withLayer()
- withStartAction(Runnable)
- withEndAction(Runnable)
解説
- withLayer()
ViewPropertyAnimator を使用してアニメーションを実行する時、
アニメーション対象の View をハードウェアレイヤを使用してアニメーションさせます。
アニメーション終了後は、この設定はクリアされます。
ただし、ハードウェアアクセラレータが使用できない環境では、ソフトウェアレイヤが使用されます。
レイヤーの合成処理をハードウェアに任せることで高速化が期待できます。
- withStartAction(Runnable) / withEndAction(Runnable)
ViewPropertyAnimator を使用したアニメーションの開始/終了時に実行したい処理を設定できます。
追加されたメソッドについて、実際に呼び出してみました。
以下のコードを実行すると、アニメーション開始時(3秒後)に、withStartAction() で指定した処理、
アニメーション終了時に、withEndAction() で指定した処理が呼び出されます。
また、withLayer() を呼び出しているので、ビュー(ここではボタン)のアニメーションは、ハードウェアレイヤ上で処理されます。
サンプルソースコード
final Button button = (Button) findViewById(R.id.button);
// 指定した View から ViewPropertyAnimator インスタンスを取得する
ViewPropertyAnimator vpa = button.animate();
// ハードウェアアクセラレータが使用できる環境では、ハードウェアレイヤを使用するように設定
vpa.withLayer();
// アニメーション継続期間を設定する(ミリ秒)
vpa.setDuration(3000);
// アニメーション開始時に実行する処理を設定する
vpa.withStartAction(new Runnable() {
@Override
public void run() {
// アニメーション開始時に呼び出されます。
// アニメーション開始遅延時間が設定されている場合は、
// アニメーション開始遅延時間後に呼び出されます。
String layerTypeString = "";
int layerType = button.getLayerType();
switch (layerType) {
case View.LAYER_TYPE_NONE:
// withLayer() を呼び出さなかった時
layerTypeString = "LAYER_TYPE_NONE";
break;
case View.LAYER_TYPE_SOFTWARE:
// withLayer() を呼出した時、
// ハードウェアアクセラレータが使用できない環境では、ソフトウェアレイヤを使用される
layerTypeString = "LAYER_TYPE_SOFTWARE";
break;
case View.LAYER_TYPE_HARDWARE:
// withLayer() を呼出した時、
// ハードウェアアクセラレータが使用できる環境では、ハードウェアレイヤを使用される
layerTypeString = "LAYER_TYPE_HARDWARE";
break;
}
Log.v("ViewPropertyAnimatorSample",
"withStartAction() using " + layerTypeString);
}
});
// アニメーション終了時に実行する処理を設定する
vpa.withEndAction(new Runnable() {
@Override
public void run() {
// アニメーション修了時に呼び出されます。
Log.v("ViewPropertyAnimatorSample", "withEndAction()");
button.setVisibility(View.GONE);
}
});
// ビューに対してアニメーションを設定する(-> アニメーションが開始されます)
vpa.rotation(90);
