これまで、基本的なAnimationを合成して、複雑なアニメーションを生成し、制御を行う方法を見てきました。
その制御の1つに「Interpolator」の設定があります。Interpolatorを「Animation#setInterpolator(Interpolator)」メソッドで設定することによって、アニメーションの動作に変化を加えられます。
| クラス名 | 説明 |
|---|---|
| AccelerateDecelerateInterpolator | 加速と減速 |
| AccelerateInterpolator | 加速 |
| AnticipateInterpolator | 開始時に逆方向に溜める |
| AnticipateOvershootInterpolator | 開始時に逆方向に溜め、終了時にはみ出す |
| BounceInterpolator | 終了時にバウンド |
| CycleInterpolator | 設定したアニメーションの負の方向も使用しながら繰り返す |
| DecelerateInterpolator | 減速 |
| LinearInterpolator | 変化を加えない |
| OvershootInterpolator | 終了時にはみ出す |
| 表7 用意されているInterpolator | |
では、実際の動作を見てみてください。
Interpolatorには、パラメータが用意されているものがあります。画面の上から4番目(数値の「5」が入力されている個所)がパラメータです。そこに実数を与えて動作を見てみてください。多くのパラメータは小さめの値を指定すると、自然な効果が得られますが、今回は変化が分かりやすいように大きめの値を設定しています。
これまで見たアニメーションは、すべてコーディングによるものでした。一方でアニメーションの定義ファイルをXMLであらかじめ用意しておき、それを実行時に読み込ませることも可能です。
アニメーション定義XMLは「res/anim」フォルダに拡張子「.xml」で作成します。ADTのウィザードから作成しても、手動で生成しても構いません。
アニメーション定義ファイルは、エディタによる支援が受けられないので、使用可能な要素や属性を把握しておかなければなりません。
XMLのルート要素として、<alpha><rotate><scale><translate><set>が定義できます。それぞれ、すでに紹介したAlphaAnimation、RotateAnimation、ScaleAnimation、TranslateAnimation、AnimationSetクラスに対応します。動作や設定項目はそれぞれのクラスに対応しています。<set>は、ほかの要素をネストできます。
すべての要素の共通属性は以下の通りです。
| 属性名 | 説明 |
|---|---|
| xmlns:android | "http://schemas.android.com/apk/res/android"を指定。ルート要素のみ必要 |
| android:duration | アニメーション時間をミリ秒で設定 |
| android:fillAfter | アニメーション後の状態を保つ |
| android:fillBefore | アニメーション後に開始状態に戻す |
| android:fillEnabled | fillBeforeとfillAfterの制御 |
| android:interpolator | Interpolatorを設定 |
| android:repeatCount | 繰り返し回数を設定 |
| android:repeatMode | 繰り返しモードを設定 |
| android:startOffset | 開始遅延時間を設定 |
| android:zAdjustment | Zオーダーを設定 |
| 表8 共通属性 | |
XMLから指定可能なInterpolatorはandroid.R.animに定義されています。具体的には、以下のような形式で指定します。
android:interpolator="@android:anim/accelerate_interpolator"
それ以外の詳細については、Animationのオプションを参照してください。
それぞれの要素の固有の属性は、以下の通りです。
| 要素名 | 属性名 | 説明 |
|---|---|---|
| <alpha> | android:fromAlpha | 開始透明度を指定 |
| android:toAlpha | 終了透明度を指定 | |
| <rotate> | android:fromDegrees | 開始角度を指定 |
| android:toDegrees | 終了角度を指定 | |
| android:pivotX | 回転X軸を指定 | |
| android:pivotY | 回転Y軸を指定 | |
| <scale> | android:fromXScale | 開始Xサイズを指定 |
| android:toXScale | 終了Xサイズを指定 | |
| android:fromYScale | 開始Yサイズを指定 | |
| android:toYScale | 終了Yサイズを指定 | |
| android:pivotX | 原点X座標を指定 | |
| android:pivotY | 原点Y座標を指定 | |
| <translate> | android:fromXDelta | 開始位置X座標を指定 |
| android:toXDelta | 終了位置X座標を指定 | |
| android:fromYDelta | 開始位置Y座標を指定 | |
| android:toYDelta | 終了位置Y座標を指定 | |
| <set> | android:shareInterpolator | Interpolatorを共有するかどうかを指定 |
| 表9 個々の属性 | ||
XMLで用意しておいたリソースは、「AnimationUtils#loadAnimation()」メソッドで読み込みます。具体的な使用方法は、以下の通りです。
Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha);
今回用意したのサンプルには、すべての要素を使用したアニメーションXMLと、それを読み込むサンプルが含まれているので、動作と内容を確認してみてください。
アニメーションは、コーディングでもXMLでも比較的簡単に実現できることが理解できたでしょうか。
最後に、筆者が気付いたアニメーションを使用する際の落とし穴を紹介して、今回は締めくくりたいと思います。
次回は、アニメーションの応用でエフェクト効果を解説します。
アニメーションのキャンセルは、キャンセル後にそのアニメーションの第1フレームが表示されたままの状態になってしまいます。この問題にどのように対処すればよいのかは分かっていませんが、「キャンセルしない」というのが最上策かもしれません。
本稿では、ボタンをアニメーションさせました。アニメーション中、ボタンはいろいろな場所に移動しますが、「元の場所に引き続きボタンの実体は残っている」ということを考慮しなければなりません。
つまり、「アニメーション開始時などで、ボタンのイベントを受け付けないようにする」などの対応が必要です。
アニメーションでは、自由に描画位置を移動できますが、親のオブジェクトがフルスクリーンではなかった場合、親の描画範囲外ではアニメーションは表示されません。
Copyright © ITmedia, Inc. All Rights Reserved.