Viewにアニメーションを付与する(Tweenアニメーション)
|以前のViewFlipperでアニメーションする(ViewAnimator) では、ViewFlipperにアニメーションをつける方法を紹介しました。今回はより一般的にViewにアニメーションをつける方法、アニメーションの種類を解説します。
アニメーションのタイプは大きく2つに分類できます。Tweenアニメーション(Animation)とFrameアニメーション(AnimationDrawable)です。
- Tweenアニメーション:1つのイメージを連続に変化させるタイプ
- 移動、フェード、回転、拡大縮小、それらを組み合わせて変化させます
- Frameアニメーション:順番にイメージを並べて表示してアニメーションにするタイプ
- 順番に表示させる画像をあらかじめ用意して、パラパラ漫画のように表示します
Tweenアニメーション
ここでは1つのイメージを連続的に変化させるTween Animationを解説します。アニメーションの動きはXMLとソースコードで定義できます。
- アニメーションのもとになる動きを決める(移動、透明度、回転、拡大縮小)。
- XMLやソースコードでアニメーションを記述(XMLの場合は属性で表現)
- Viewにアニメーションを設定する
TweenアニメーションはAnimationクラスを使って表現されます。アニメーションの種類は5つあり、いずれもAnimationクラスを継承しています。
Tweenアニメーションの種類
アニメーションの種類 | 概要 |
---|---|
AlphaAnimation | 透明度を変更する |
AnimationSet | アニメ要素を保持するコンテナ |
RotateAnimation | 回転する |
ScaleAnimation | 拡大・縮小を行う |
TranslateAnimation | 移動、変形を行うアニメーション |
以下、アニメーションの作り方です
アニメーションの作成
XMLでのアニメーション例としてAlphaAnimation をつかってみましょう。使う前の注意として、アニメーション用のXMLリソースはRes/anim/ディレクトリに配置する必要があります。
Res/anim/motion.xml
1 2 3 4 5 6 7 | <?xml version= "1.0" encoding= "utf-8" ?> <set xmlns:android= "http://schemas.android.com/apk/res/android" android:interpolator= "@android:anim/accelerate_interpolator" > <alpha android:fromAlpha= "0.0" android:toAlpha= "0.5" /> </set> |
サンプルでポイントとなる箇所はXMLの4行目~6行目。AlphaAnimationの属性値である
・android:fromAlpha
・android:toAlpha
を使って透明度を0から0.5(半透明)に変化させています。AlphaAnimationは名前の通り、透明度の制御に特化していますが、Animation(親クラス)の属性値を利用して更に細かい制御が行えます。
Animation XML属性
属性名 | 概要 |
---|---|
android:detachWallpaper | このViewがWallpaper(壁紙)の上に表示されているとき、壁紙のアニメーションをon/offできる |
android:duration | 実行時間(ms) |
android:fillAfter | trueならアニメーションが終わった後の状態を保つ |
android:fillBefore | trueならアニメーションが始まる前の状態を保つ |
android:fillEnabled | trueならfillAfter、fillBeforeを有効化する |
android:interpolator | アニメーションの動きをスムーズに補完する。 |
android:repeatCount | アニメーションの繰り返し回数 |
android:repeatMode | 繰り返し動作設定(標準はループ) |
android:startOffset | 開始までのオフセット時間(ms) |
android:zAdjustment | アニメーションしている間のコンテンツ順序をz値(奥行き)で調整する |
(11/24 追記)android:fillEnabledの説明でfillBeforeも有効にする旨を記載しました。@youten_redo さんにご指摘いただきました。ありがとうございます!
Viewにアニメーションを設定する
Viewに対して、アニメーションを付与します。
1 2 3 4 | //Tweenアニメーションの適用 ImageView img = (ImageView) findViewById(R.id.ImageView01); Animation animation= AnimationUtils.loadAnimation( this ,R.anim.motion); img.startAnimation(animation); |
View#startAnimation(Animation);を呼び出した段階でアニメーションの動作が開始します。
アニメーション表示後の状態を保持したい場合(animation#setFillAfter)
1 2 3 4 5 6 7 | //Tweenアニメーションの適用 ImageView img = (ImageView) findViewById(R.id.ImageView01); Animation animation= AnimationUtils.loadAnimation( this ,R.anim.motion); animation.setFillAfter( true ); //終了後を保持 animation.setFillEnabled( true ); img.startAnimation(animation); |
サンプルコードを実行すると(Res/anim/motion.xmlのアニメーション終了状態を維持して)ImageView imgの透明度が0.5のままになります。
またXMLリソースを使わずに(動的に)ソースコードからアニメーションを作りたい場合は、
XMLリソースの属性値と対応するメソッドを利用する必要があります。
Animation XML属性と関連のあるメソッド
属性名 | 関連するAnimationクラスのメソッド |
---|---|
android:detachWallpaper | setDetachWallpaper(boolean) |
android:duration | setDuration(long) |
android:fillAfter | setFillAfter(boolean) |
android:fillBefore | setFillBefore(boolean) |
android:fillEnabled | setFillEnabled(boolean) |
android:interpolator | setInterpolator(Interpolator) |
android:repeatCount | setRepeatCount(int) |
android:repeatMode | setRepeatMode(int) |
android:startOffset | setStartOffset(long) |
android:zAdjustment | setZAdjustment(int) |
Tweenアニメーションの種類
コンテナ
AnimationSetクラス、XMLリソースのタグは<set>です。
アニメーションを格納するためのコンテナです。入れ子構造が可能です。
1 2 3 4 5 6 7 | <set xmlns:android= "http://schemas.android.com/apk/res/android" android:interpolator= "@[package:]anim/interpolator_resource" android:shareInterpolator=[ "true" | "false" ] > <set> ... </set> </set> |
属性はandroid:interpolatorとandroid:shareInterpolatorです。どちらもinterpolator(アニメーションの振る舞いをパターン化した便利ツール)を指定できます。interpolatorに関してはまた改めて解説を予定しています
透明度を変更する
AlphaAnimationクラス、XMLリソースのタグは<alpha>です。
フェードを行います。fromAlphaやtoAlphaには0~1.0を代入します。
1 2 3 | <alpha android:fromAlpha= "float" android:toAlpha= "float" /> |
拡大縮小する
ScaleAnimationクラス、XMLリソースのタグは<scale>です。
fromXScale~toYScaleは倍率です。1.0が等倍を示しています。Scaleが0.5であれば1/2倍です。
pivotX,Yは拡大縮小時の原点となる座標位置です
1 2 3 4 5 6 7 | <scale android:fromXScale= "float" android:toXScale= "float" android:fromYScale= "float" android:toYScale= "float" android:pivotX= "float" android:pivotY= "float" /> |
移動、変形する
TranslateAnimationクラス、XMLリソースのタグは<translate>です。
水平または垂直方向への動きです。fromXからtoXへの移動量を相対的に-100%から100%で表します。
1 2 3 4 5 | <translate android:fromX= "float" android:toX= "float" android:fromY= "float" android:toY= "float" /> |
回転する
RotateAnimationクラス、XMLリソースのタグは<rotate>です。
回転方向の動きです。fromDegreesからtoDegreesへの回転量を度数で指定します。
pivotX,pivotYは回転の中心座標です。パーセント指定(50% etc)もしくは左端、上端からの相対座標で表します
1 2 3 4 5 | <rotate android:fromDegrees= "float" android:toDegrees= "float" android:pivotX= "float" android:pivotY= "float" /> |