【Android】Tweenアニメーション

Android Tipsプログラミング

変形によるアニメーションには、透過・回転・拡縮・移動の4種類があります。AnimationSetを使用することにより、アニメーションを組み合わせることも可能です。
注意点としては、setAnimation()やstartAnimation()は、アニメーションが完了する前に復帰してきます。裏で別スレッドに処理をまかせているのでしょう。

import android.app.Activity;
import android.view.animation.Animation;
import android.view.animation.AlphaAnimation;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.view.animation.CycleInterpolator;
import android.view.animation.AnimationSet;
import android.widget.ImageView;

public class MyClass extends Activity{

  public void startAnimation(){
    ImageView image = (ImageView)findViewById(R.id.animView);
    Animation anim = _getAnimation();

    // 即時アニメーション開始
    image.startAnimation(anim);

    // setStartOffSetで設定された時間後に開始
    image.setAnimation(anim);
  }

  private Animation _getAnimation(){
    int px = 100; // アニメーションの中心X座標軸
    int py = 100; // アニメーションの中心Y座標軸

    // Alpha 透過
    // 0 ~ 1 透明から不透明へ
    Animation alpha = new AlphaAnimation(0.0f,1.0f);
    alpha.setDuration(1000); // 1000msかけて動く
    alpha.setStartOffset(1000); // 1000ms後に開始

    // Rotate 回転
    // 0°~ 360°(1回転する)
    Animation rotate = new RotateAnimation(0.0f,360f,px,py);

    // Scale 拡大縮小
    // from幅倍率,to幅倍率,from高さ倍率,to高さ倍率,中心軸X,中心軸Y
    Animation scale = new ScaleAnimation(0.0f,1.0f,0.0f,1.0f,px,py);

    // Translate 移動
    // fromX座標,toX座標,fromY座標,toY座標
    // ABSOLUTE:直接座標
    // RELATIVE_TO_PARENT:親要素に対しての相対値
    // RELATIVE_TO_SELF:自身に対しての相対値
    Animation trans = new TranslateAnimation(
      Animation.RELATIVE_TO_PARENT,-1.0f,
      Animation.RELATIVE_TO_PARENT,0.0f,
      Animation.RELATIVE_TO_PARENT,0.0f,
      Animation.RELATIVE_TO_PARENT,0.0f);

    // アニメーションの組み合わせ
    // true:補間をsetに適用 false:補間を個々に指定
    AnimationSet set = new AnimationSet(true);
    set.addAnimation(alpha);
    set.addAnimation(scale);
    set.addAnimation(rotate);
    set.addAnimation(trans);

    // アニメーション補間
    // LinearInterpolator:default(等間隔)
    // AccelerateInterpolator:ゆっくりから徐々に速く
    // DecelerateInterpolator:速くから徐々にゆっくり
    // AccelerateDecelerateInterpolator:ゆっくり → 速く → ゆっくり
    // CycleInterpolator:指定回フェイントする
    // AnticipateInterpolator:勢いをつけて移動
    // OvershootInterpolator:勢いあまって行き過ぎる
    // AnticipateOvershootInterpolator:勢いをつけて移動し行き過ぎる
    // BounceInterpolator:バウンドする
    set.setInterpolator(new CycleInterpolator(1));

    // アニメーション終了時の動作
    set.setFillBefore(false); // true:終了時に元の状態に戻す
    set.setFillAfter(true); // true:終了時に元の状態に戻さない

    // リピート
    // RESTART:リピートする REVERSE:前回と逆の動作
    set.setRepeatMode(Animation.RESTART);
    set.setRepeatCount(10); // リピート回数(0でリピートなし、-1で永久)

    return set;
  }
}

参考: Tweenアニメーション for XML
参考: Frameアニメーション

コメント