AndroidのProperty Animation

前置き

この記事は、まだ執筆途中です。

Androidの2つのアニメーションAPIのうち、Property Animationについて。

本文

  • Android 3.0で導入された
  • 従来のアニメーション(View Animation)よりも柔軟性が高い
  • viewオブジェクト以外にも適用できる
  • 任意のオブジェクトの任意のプロパティを時間経過と共に変化させる
  • 見た目がアニメするだけでなく、オブジェクトそのものがアニメする(View Animationの場合は、例えばボタンが移動するアニメなら、ボタン自体は移動しないので、移動中のボタンをタッチできない)
  • View Animationよりもセットアップに時間がかかりコードが複雑になるのが欠点

以下の情報を制御する。

Duration
経過時間を指定できる。デフォルトは300ms。
Time interpolation
ある経過時刻におけるプロパティ値を計算するメソッドを指定できる。
Repeat count and behavior
繰り返すかどうか、何回繰り返すか、及び、逆順に再生するかどうかを指定できる。
Animator sets
複数のアニメをグループ化し、並列に、逐次、あるいは遅延させて再生できる。
Frame refresh delay
フレームレートを指定できる。デフォルトは10msec。

APIについて。

  • android.animation.ValueAnimator
  • デフォルトはAccelerateDecelerateInterpolator
  • setInterpolator()で変更
  • プロパティの開始値と終了値、及び経過時間をセットしてstart()
  • 任意の時刻のプロパティ値を計算してくれる
  • android.animation.ObjectAnimator
  • ValueAnimatorから派生
  • オブジェクトのプロパティを変更するところまでやってくれる
  • オブジェクトには、getter/setterが必要
  • android.animation.AnimatorSet
  • アニメのグループ化
  • TypeEvaluator
  • Animatorから、開始値、終了値、割合をもらい、プロパティ値を計算する
  • IntEvaluatorはint型のプロパティ用
  • FloatEvaluatorはfloat用
  • ArgbEvaluatorはcolor値用
  • Interpolator
  • 従来のView Animation用のものが使える
  • android.view.animation.*

サンプルコード。

  • float型の値のアニメ
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();
  • MyType型の値のアニメ
MyType startPropertyValue = new MyType(...);
MyType endPropertyValue = new MyType(...);
ValueAnimator animation = ValueAnimator.ofObject(
    new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
animation.setDuration(1000);
animation.start();

上記の例だけでは、描画はされない。

  • リスナを登録し、リフレッシュ時にプロパティ値を変更する必要がある
  • ValueAnimator.AnimatorUpdateListener#onAnimationUpdate()
  • プロパティ値はgetAnimatedValue()で得ることができる

ObjectAnimatorを使えば、プロパティ値の変更までやってくれる。

  • オブジェクトfooのプロパティalphaを0.0~1.0まで変化させる
ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);
anim.setDuration(1000);
anim.start();

ただし、fooのクラスには、setAlpha()が必要。

開始値を省略した場合は、現在値が開始値として使われる。よって、getAlpha()も必要。

ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 1f);

ObjectAnimatorを使った場合でも、変更するプロパティ次第では、自力でinvalidate()する必要があるかも。その場合はリスナを使う。Viewクラスのsetterとかなら内部でinvalidate()されるので、自力で再描画を促す必要は無い。

アニメのグループ化。

  • AnimatorSet
  • play()でAnimatorを登録
  • play()がAnimatorSet.Builder()を返すので、after()、before()、with()で修飾
  • AnimatorSetがネストしても良い
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(bounceAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);
bouncer.play(bounceBackAnim).after(stretchAnim2);
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
animatorSet.start();
  1. bounceAnimをsquashAnim1の前に
  2. squashAnim1は、squashAnim2、stretchAnim1、及びstretchAnim2と一緒に
  3. bounceBackAnimをstretchAnim2の後に
  4. 以上のAnimatorSetを、fadeAnimの前に

リスナ。

  • Animator.AnimatorListener
onAnimationStart()
アニメ開始時。
onAnimationEnd()
アニメ終了時。キャンセル時にも呼ばれる。
onAnimationRepeat()
繰り返し時。
onAnimationCancel()
キャンセル時。
  • AnimatorListenerAdapter
  • Animator.AnimatorListenerをimplementsしたクラス
  • 空実装
  • 無名クラスでonAnimationCancel()だけオーバーライドしたいときとかに使う
  • ValueAnimator.AnimatorUpdateListener
onAnimationUpdate()
フレームごとに呼ばれる。

レイアウトのアニメ。

  • android.animation.LayoutTransition
  • ViewGroup全体をアニメ
  • 子viewをadd/remove/可視化/不可視化したときに、連動してアニメさせる
  • transitionTypeは、CHANGE_APPEARING、CHANGE_DISAPPEARING、APPEARING、DISAPPEARING
  • transitionTypeごとにAnimatorを指定できる
  • TypeEvaluator
  • プロパティ値の型がint、float、color以外なら、独自のTypeEvaluatorを定義する
  • メソッドはevaluate()のみ
  • 第1引数は割合(0.0~1.0)で、Interpolatorが経過時間に基づいて算出した値
public class MyTypeEvaluator implements TypeEvaluator {
    public Object evaluate(float fraction, Object startValue, Object endValue) {
    }
}

キーフレーム。

  • android.animation.Keyframe
  • android.animation.PropertyValuesHolder
  • Keyframeは、経過時間とプロパティ値のペア
  • 複数のKeyframeを定義した上で、それをつなげるようなアニメを再生する
Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);
Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation)
rotationAnim.setDuration(5000ms);

Viewの以下のプロパティは、Property Animationに使うのに適している。

  • translationX/translationY
  • rotation/rotationX/rotationY
  • scaleX/scaleY
  • pivotX/pivotY
  • x/y
  • alpha

アニメをxmlで定義することもできる。

  • <animator>と<objectAnimator>が、ValueAnimatorとObjectAnimatorに対応
  • android:duration
  • android:valueFrom/android:valueTo
  • android:valueType
  • android:startDelay
  • android:repeatCount
  • android:repeatMode
  • propertyName(objectAnimator専用)
  • android.animation.AnimatorInflaterでloadAnimator()し、
  • objectAnimatorならsetTarget()し、
  • start()する
  • <set>
  • android:ordering
<set android:ordering="sequentially">
    <set>
        <objectAnimator
            android:propertyName="x"
            android:duration="500"
            android:valueTo="400"
            android:valueType="int"/>
        <objectAnimator
            android:propertyName="y"
            android:duration="500"
            android:valueTo="300"
            android:valueType="int"/>
    </set>
    <objectAnimator
        android:propertyName="alpha"
        android:duration="500"
        android:valueTo="0f"/>
</set>
Last modified:2011/06/20 21:10:37
Keyword(s):
References:[Androidアプリ開発]
This page is frozen.