AndroidのView Animation

前置き

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

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

本文

  • Tween AnimationとFrame Animationがある
  • Tweenアニメは、viewオブジェクトに対して、描画位置、サイズ、角度などを指示する
  • Frameアニメは、いわゆるパラパラアニメ

Tweenアニメ

  • viewオブジェクトの位置、サイズ、角度、透明度を連続変化させる
  • コードでもxmlでも定義可能
  • android.view.animation.Animation
  • android.view.animation.AnimationSet
  • android.view.animation.Interpolator
  • どれを、いつ、どれくらい時間をかけて変化させるか
  • 複数の変化を並列に、あるいは逐次に発生させる
  • xmlはres/anim/に置く
  • ルート要素は<alpha>、<scale>、<translate>、<rotate>、<interpolator>、<set>のどれか
  • デフォルトは並列実行だが、android:startOffset属性で逐次に見せることができる
  • hyperspace_jump.xml
<set android:shareInterpolator="false">
    <scale
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="1.4"
        android:fromYScale="1.0"
        android:toYScale="0.6"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false"
        android:duration="700" />
    <set android:interpolator="@android:anim/decelerate_interpolator">
        <scale
           android:fromXScale="1.4"
           android:toXScale="0.0"
           android:fromYScale="0.6"
           android:toYScale="0.0"
           android:pivotX="50%"
           android:pivotY="50%"
           android:startOffset="700"
           android:duration="400"
           android:fillBefore="false" />
        <rotate
           android:fromDegrees="0"
           android:toDegrees="-45"
           android:toYScale="0.0"
           android:pivotX="50%"
           android:pivotY="50%"
           android:startOffset="700"
           android:duration="400" />
    </set>
</set>
  • 属性値の一部(pivotXとか)には、オブジェクト自身の内部相対座標でも、親オブジェクトの相対座標でもしていできる
  • 単位なし(50とか)なら親オブジェクト相対で50%、単位あり(50%とか)なら自身相対で50%
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

startAnimation()の代わりに、Animation#setStartTime()してからView#setAnimation()しても良い。

  • アニメするviewの境界(bounds)を超えてアニメできる
  • 超えた場合でも、viewの境界は変化しない
  • アニメが親viewの境界を超えるとクリップされる

Frameアニメ

  • パラパラアニメ
  • コードでもxmlでも定義可能
  • android.graphics.drawable.AnimationDrawable
  • xmlはres/drawable/に置く
  • ルート要素は<animation-list>
  • 子要素に<item>を列挙
  • rocket_thrust.xml
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
  rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
  rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
}

public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction() == MotionEvent.ACTION_DOWN) {
    rocketAnimation.start();
    return true;
  }
  return super.onTouchEvent(event);
}

onCreate()の時点では、まだ完全にはAnimationDrawableがウィンドウにアタッチされてないので、アニメを開始することはできない。Activity開始直後にアニメを開始したい場合は、onWindowFocusChanged()あたりでstart()させれば良い。

Last modified:2011/06/20 21:44:36
Keyword(s):
References:[Androidアプリ開発]
This page is frozen.