Property Animation
Android3.0(API level 11)からサポートされ、どんなオブジェクトにもアニメーションを行うことができる
パラパラ漫画のようにフレームを連続再生することができる
View Animation
Viewsに回転、移動、拡大縮小、透明度変換などのアニメーションが行える
Viewsに回転、移動、拡大縮小、透明度変換などのアニメーションが行える
Drawable Animation
ここでは、Developer AndroidのView Animationの中身をかいつまんで、View Animationについて紹介します。
View Animationとは
View Animationでは、View上にTween Animationを表示することが出来ます。Tween Animationはスタートポイント、エンドポイント、サイズ、回転や共通の縦横比などのアニメーション情報を計算します。Tween AnimationはViewオブジェクトのコンテンツ上で、位置、サイズ、回転や透明度などの単純な変換を行うことが出来ます。例えば、TextViewオブジェクトにおいて、テキストの移動、回転、拡大縮小などができます。もし、TextViewに背景画像が設定してあれば、背景画像はテキストと一緒に変換されます。
アニメーションの手順はXMLかコードで書くことができます。ここではコードでのアニメーションの実行の仕方を紹介します。
View Animationはandroid.view.animation パッケージの中にあるクラスを使うことが出来ます。Viewに使えるアニメーションは4つあります。
- Scale Animation: サイズの変更
- Translate Animation: Viewの移動
- Alpha Animation:透明度の設定
- Rotate Animation:与えられた角度だけ回転
図1ではAnimationSetというクラスがありますが、このクラスは、アニメーションのグループをつくることができ、同時にいくつかのアニメーションを行ったり、連続してアニメーションを行ったりする時などに使うことができます。
図1: View Animationのクラス階層 |
サンプルプログラム
サンプルプログラムでは、各アニメーションクラスの簡単な例をViewAnimationクラスとして書いています。それぞれのアニメーションにおいて、繰り返しモードsetRepeatMode()の設定で、逆戻りAnimation.REVERSEを指定しています。public class ViewAnimation extends Activity { ImageView setImageView; AnimationSet animationSet; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.view_animation); //Scale Animation Sample--------------------------------------------------- ImageView scaleImageView = (ImageView) findViewById(R.id.imageView1); ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 0.5f, 1.0f, 0.5f, 0, 0); scaleAnimation.setStartOffset(1000); scaleAnimation.setDuration(2000); scaleAnimation.setRepeatCount(Animation.INFINITE); scaleAnimation.setRepeatMode(Animation.REVERSE); scaleImageView.startAnimation(scaleAnimation); //Translate Animation Sample---------------------------------------------- ImageView transImageView = (ImageView) findViewById(R.id.imageView2); TranslateAnimation transAnimation = new TranslateAnimation(0, 50, 0, 20); transAnimation.setDuration(3000); transAnimation.setRepeatCount(Animation.INFINITE); transAnimation.setRepeatMode(Animation.REVERSE); transImageView.startAnimation(transAnimation); //Alpha Animation Sample------------------------------------------------- ImageView alphaImageView = (ImageView) findViewById(R.id.imageView3); AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f); alphaAnimation.setDuration(3000); alphaAnimation.setRepeatCount(Animation.INFINITE); alphaAnimation.setRepeatMode(Animation.REVERSE); alphaImageView.startAnimation(alphaAnimation); //Set Animation Sample--------------------------------------------------- setImageView = (ImageView) findViewById(R.id.imageView5); animationSet = new AnimationSet(false); //Animation1 ScaleAnimation scaleAnimation1 = new ScaleAnimation(0.5f, 1.0f, 0.5f, 1.0f); scaleAnimation1.setDuration(3000); //Animation2 AlphaAnimation alphaAnimation1 = new AlphaAnimation(0.0f, 1.0f); alphaAnimation1.setDuration(3000); animationSet.addAnimation(scaleAnimation1); animationSet.addAnimation(alphaAnimation1); setImageView.startAnimation(animationSet); //AnimationListener animationSet.setAnimationListener(new Animation.AnimationListener() { public void onAnimationStart(Animation animation) { } public void onAnimationRepeat(Animation animation) { } public void onAnimationEnd(Animation animation) { setImageView.startAnimation(animationSet); } }); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); //Rotate Animation Sample --------------------------------------------------- ImageView rotateImageView = (ImageView) findViewById(R.id.imageView4); int centerX = (int)rotateImageView.getWidth()/2; int centerY = (int)rotateImageView.getHeight()/2; RotateAnimation rotateAnimation = new RotateAnimation(0, 20, centerX,centerY); rotateAnimation.setDuration(3000); rotateAnimation.setRepeatCount(Animation.INFINITE); rotateAnimation.setRepeatMode(Animation.REVERSE); rotateImageView.startAnimation(rotateAnimation); } }
アニメーションの設定
アニメーションの設定は、どのクラスでも同じような設定を行うことが出来ます。例としてScaleAnimationを上げて説明します。ImageView scaleImageView = (ImageView) findViewById(R.id.imageView1); ScaleAnimation scaleAnimation = new ScaleAnimation(0.5f, 1.0f, 0.5f, 1.0f, 0, 0); scaleAnimation.setStartOffset(1000); scaleAnimation.setDuration(3000); scaleAnimation.setRepeatCount(Animation.INFINITE); scaleAnimation.setRepeatMode(Animation.REVERSE); scaleImageView.startAnimation(scaleAnimation);
setRepeatCountにAnimation.INFINITEを指定すると無限にアニメーションを繰り返します。setRepeatMode()では、単純な繰り返しAnimation.RESTARTか逆戻りAnimation.REVERSEを設定することが出来ます。
Scale Animation
拡大縮小を行うには、ScaleAnimationを使用します。13行目のScaleAnimationのコンストラクタのパラメータは以下の通りです。サンプルプログラムでは、0.5倍から1倍に拡大しています。ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY);
- float fromX: アニメーション開始のXスケール
- float toX: アニメーション終了のXスケール
- float fromY: アニメーション開始のYスケール
- float toY: アニメーション終了のYスケール
- float pivotX 原点となるX座標位置
- float pivotY 原点となるY座標位置
Translate Animation
移動を行うには、TranslateAnimationを使用します。22行目のTranslateAnimationのコンストラクタのパラメータは以下の通りです。サンプルプログラムでは、元の位置(0, 0)からX座標に50ピクセル、Y座標に20ピクセル移動するアニメーションを指定しています。TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta);
- float fromXDelta: アニメーション開始時のView内のX座標
- float toXDelta: アニメーション終了時のView内のX座標
- float fromYDelta: アニメーション開始時のView内のY座標
- float toYDelta: アニメーション終了時のView内のY座標
Alpha Animation
透明度変化には、AlphaAnimationを使用します。30行目のAlphaAnimationのコンストラクタのパラメータは以下の通りです。サンプルプログラムでは、不透明から透明へ変化しています。ここでのパラメータの値は、0.0〜1.0を指定します。0.0は完全に透明、1.0は完全に不透明を示します。
AlphaAnimation (float fromAlpha, float toAlpha);
- float fromAlpha: アニメーション開始時の透明度を指定
- float toAlpha: アニメーション終了時の透明度を指定
Rotate Animation
回転には、RotateAnimationを使用します。75行目のRorateAnimationのコンストラクタのパラメータは以下の通りです。サンプルプログラムでは、20度の回転を指定しています。回転の中心座標をViewの中心に指定しています。
RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY);
- float fromDegrees: アニメーション開始時の回転角度
- float toDegrees: アニメーション終了時の回転角度
- float pivotX:回転の中心X座標
- float pivotY: 回転の中心Y座標
サンプルプログラムでは、RotateAnimationをOnWindowFocusChangedの中で指定しています。これは、OnCreate内では早過ぎてViewのgetWidth(), getHeight()の値を取ることができず0が帰ってきてしまうからです。OnWindowFocusChanged内で呼ぶことで、値を得ることが出来ます。
Animation Set
複数のアニメーションを同時に行う場合には、AnimationSetを使用します。サンプルプログラムでは、scaleAnimation1とAlphaAnimation1のアニメーションをセットしています。AnimationSetでは、setRepeatCountが効きません。繰り返しを行いたい場合は、AnimationListenerを使用して、アニメーションの終了時にアニメーションの開始を指定することができます。AnimationSet(boolean shareInterpolator);
- boolean shareInterpolator: Interpolatorを共有するかどうかを指定
AnimationListener
51行目のAnimationListenerでは、アニメーションの開始、リピート、終了を監視することができます。ただし、AnimationSetではonAnimationRepeatは動作しません。
0 件のコメント:
コメントを投稿