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
<?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に対して、アニメーションを付与します。
//Tweenアニメーションの適用
ImageView img = (ImageView) findViewById(R.id.ImageView01);
Animation animation= AnimationUtils.loadAnimation(this,R.anim.motion);
img.startAnimation(animation);
View#startAnimation(Animation);を呼び出した段階でアニメーションの動作が開始します。
アニメーション表示後の状態を保持したい場合(animation#setFillAfter)
//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>です。
アニメーションを格納するためのコンテナです。入れ子構造が可能です。
<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を代入します。
<alpha
android:fromAlpha="float"
android:toAlpha="float" />
拡大縮小する
ScaleAnimationクラス、XMLリソースのタグは<scale>です。
fromXScale~toYScaleは倍率です。1.0が等倍を示しています。Scaleが0.5であれば1/2倍です。
pivotX,Yは拡大縮小時の原点となる座標位置です
<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%で表します。
<translate
android:fromX="float"
android:toX="float"
android:fromY="float"
android:toY="float" />
回転する
RotateAnimationクラス、XMLリソースのタグは<rotate>です。
回転方向の動きです。fromDegreesからtoDegreesへの回転量を度数で指定します。
pivotX,pivotYは回転の中心座標です。パーセント指定(50% etc)もしくは左端、上端からの相対座標で表します
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />