これまで、基本的な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.