以下の記述は、Android 2.3.3以降を対象にしています。
Androidには画像をアニメーションさせる機能が最初から実装されています。
種類は5つ。
● 透明度(AlphaAnimation)
● 角度(RotateAnimation)
● スケール(ScaleAnimation)
● 移動(TranslateAnimation)
● 組み合わせ(AnimationSet)
これらを使用することで、以下のようなアニメーションを作ることができます。
これは、背景を透過した5つの静止画を順番に、透明度・角度・スケール・移動を変化させながら表示しています。
回転については、
Androidのアニメーション機能2
を参照。
基本コードを見ていきます。
こういう画像を独立して動かしてみます。
ImageViewを使って表示させます。
import android.widget.ImageView;
import android.view.View;
ImageView iv_hyakki_1;
iv_hyakki_1 = new ImageView(this);
//透明度を変化させるので最初は非表示にしています、表示させる場合はView.VISIBLE
iv_hyakki_1.setVisibility(View.GONE);
iv_hyakki_1.setImageResource(R.drawable.hyakki_1);
addContentView(iv_hyakki_1,new LayoutParams());
import android.view.animation.AnimationSet;
import android.view.animation.AlphaAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.view.animation.RotateAnimation;
透明度
透明度を非表示(0)の状態から表示(1)まで、4秒かけて変化させてみます。
AlphaAnimation anim_alpha = new AlphaAnimation(0f, 1f); // 透明度を0から1に変化
anim_alpha.setDuration(4000); //ms単位
iv_hyakki_1.setVisibility(View.VISIBLE);//表示
iv_hyakki_1.startAnimation(anim_alpha); //アニメーション開始
角度
画像の中心を軸にして、4秒かけてぐるっと360度回転させてみます。
RotateAnimation anim_rotate = new RotateAnimation(0, 360, iv_hyakki_1.getWidth()/2, iv_hyakki_1.getHeight()/2);
anim_rotate.setDuration(4000); //ms単位
iv_hyakki_1.setVisibility(View.VISIBLE);//表示
iv_hyakki_1.startAnimation(anim_rotate); //アニメーション開始
スケール
画像のサイズを、4秒かけて半分にしてみます。
ScaleAnimation anim_scale = new ScaleAnimation(1, 0.5f, 1, 0.5f);
anim_scale.setDuration(4000); //ms単位
iv_hyakki_1.setVisibility(View.VISIBLE);//表示
iv_hyakki_1.startAnimation(anim_scale); //アニメーション開始
移動
画像を(0,0)から(100,50)の位置に4秒かけて移動してみます。
移動の基準点は、画像の左上隅です。
TranslateAnimation anim_translate = new TranslateAnimation(0, 100, 0, 50); //(0,0)から(100,50)に移動
anim_translate.setDuration(4000); //ms単位
iv_hyakki_1.setVisibility(View.VISIBLE);//表示
//これをセットしておかないと、画像は移動後、元位置に帰ってしまいます(AndroidのICS以降有効)
anim_translate.setFillAfter(true);
iv_hyakki_1.startAnimation(anim_translate); //アニメーション開始
透明度・角度・スケール・移動を組み合わせ
AnimationSet anim_set;
TranslateAnimation anim_translate;
ScaleAnimation anim_scale;
AlphaAnimation anim_alpha;
RotateAnimation anim_rotate;
//アニメーションのセットを作っておく
anim_set = new AnimationSet(true);
//透明度
anim_alpha = new AlphaAnimation(0f, 1f);
anim_set.addAnimation(anim_alpha);
//角度
anim_rotate = new RotateAnimation(0, 360, iv_hyakki_1.getWidth()/2, iv_hyakki_1.getHeight()/2);
anim_set.addAnimation(anim_rotate);
//スケール
anim_scale = new ScaleAnimation(1, 0.5f, 1, 0.5f);
anim_set.addAnimation(anim_scale);
//移動
anim_translate = new TranslateAnimation(0, 100, 0, 50); // (0,0)から(100,50)に移動
anim_set.addAnimation(anim_translate);
//
anim_set.setDuration(4000);
anim_set.setFillAfter(true);
//アニメーション開始
iv_hyakki_1.setVisibility(View.VISIBLE);
iv_hyakki_1.startAnimation(anim_set);
複数の画像を連続して表示する場合
やり方はいろいろありますが、ここではトリガーになりそうなイベントを取得してみます。
アニメーションの開始・終了・繰り返しのイベントを取得
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
Activityにimplements AnimationListenerをセット
例えば、imageviewでstartAnimationする場合、その前でイベントをセットしておきます。
imageview.setAnimationListener(this);
@Override
public void onAnimationEnd(Animation animation) {
//ToDo
//1つのアニメーション終了をここで検知して、次のアニメーションを開始
}
@Override
public void onAnimationRepeat(Animation animation) {
//ToDo
}
@Override
public void onAnimationStart(Animation animation) {
//ToDo
}