2013年11月15日金曜日

[Androidアニメーション] 2. Property Animationの説明

AndroidのAPIににおける2Dアニメーションの種類は主に3種類あります。

Property Animation
Android3.0(API level 11)からサポートされ、どんなオブジェクトにもアニメーションを行うことができる
View Animation
Viewsに回転、移動、拡大縮小、透明度変換などのアニメーションが行える
Drawable Animation
パラパラ漫画のようにフレームを連続再生することができる

ここでは、Developer AndroidのProperty Animationの中身をかいつまんで、Property Animationについて紹介します。サンプルプログラムについては、Property Animationのサンプルプログラムの説明で紹介しています。

Property Animationとは

Android3.0(API level 11)からサポートされ、Viewに限らず、どんなオブジェクトのプロパティにも指定した時間間隔で、アニメーションを行うことができます。ここでいうプロパティとはアニメーションに必要な設定値を指しています(例えば、色の変化値、透明度など)。このシステムは拡張性があり、カスタムタイプのプロパティにも適しています。Property Animationには以下のようなアニメーション機能を定義することができます。
継続時間(Duration): アニメーションの継続時間を指定することが出来ます。デフォルトは300msです。

補間時間(Time interpolation): アニメーションの現在の経過時間の機能として、プロパティの値がどのように計算されるか指定することが出来ます。
繰り返し(Repeat count and behavior): アニメーションの繰り返し回数や振る舞いなどを指定することが出来ます。

アニメーションのセット機能(Animator sets): 複数のアニメーションをグループ化して表示することができます。連続回数や、遅延などを指定することができます。
フレーム更新の遅延(Frame refresh delay): フレーム更新の時間を指定することが出来ます。デフォルトの設定は10msごとですが、アプリケーションのスピードに依存します。

Property Animationの動き

アニメーションがどのように行われるか簡単な例を紹介します。図1はプロパティxを持つオブジェクトを示しています。ここでプロパティxは画面のx方向への位置を表しているとします。アニメーションの継続時間を40msに設定し、移動距離を40pixelsとします。すると10 msごと、フレームが更新され10pixelsごとx方向にオブジェクトが移動します。この例では、補間時間の設定に、一定のスピードで物体が動くlinear interpolationを指定しています。

図1.Linear Interpolationの例

またスピードが変化するnon-linear interpolationも指定することが出来ます。図2はアニメーションの開始時に加速をし、中間からまた徐々に最後まで加速をするというアニメーションを示しています。オブジェクトは40msに40pixels移動しますが、速度が変化しています。


図2.non-linear Interpolationの例

Property Animationが上のようなアニメーションをどのように計算しているか説明していきます。図3はメインクラスと他のクラスの関係を示しています。


図3.アニメーションの計算の仕方

ValueAnimatorオブジェクトは継続時間やプロパティの現在の値などのアニメーションのタイミングを監視しています。ValueAnimatorはアニメーションの補間時間を定義しているTimeInterpolator、プロパティの値の計算方法を定義するTypeEvaluatorをカプセル化しています。例えば、図2ではTimeInterpolatorはAccelerateDecelerateInterpolatorをTypeEvaluatorにはIntEvaluatorが設定されています。

アニメーションを開始するには、ValueAnimatorを作り、アニメーションしたいプロパティの最初と最後の値を設定します。start()を呼ぶとアニメーションが始まります。アニメーションの間、ValueAnimatorはアニメーションの継続時間とどれくらい経過したかで、0から1の間でその割合を計算します。経過割合はアニメーションがどれくらい経過したかを0が0%を1が100%で示しています。例えば図1では、t=10での経過割合は全体の時間が40msなので、0.25になります。

ValueAnimatorが経過割合を計算しているとき、補間割合を計算するために、現在セットされているTimeInterpolatorが呼ばれます。補間割合はセットされた時間補間を考慮して新しい割合を時間補間にセットします。例えば図2でじゃ、アニメーションはゆっくり加速するので、t=10のとき、時間補間よりも小さい補間割合0.15となります。図1では補間割合は時間補間と同じように一定となります。

補間割合が計算されるときValueAnimatorはアニメーションの補間割合、始まりの値、終わりの値をもとに、プロパティの値を計算するために、適切なTypeEvaluatorを呼びます。例えば図2では補間割り肺はt=10msの時に0.15なので、この時間でのプロパティ値は0.15x(40 - 0)=6となります。

Property AnimationとView Animationの違いView AnimationシステムはViewオブジェクトにのみアニメーションを行うことが出来ます。もし、Viewオブジェクト以外にアニメーションを行いたい場合は、自信のコードを実行しなければいけません.View Animation システムは背景色の変更などはできず、Viewの回転や拡大縮小などアニメーションが限られています。さらにView Animationのデメリットは、実際のViewではなく表示されたViewのみを修正します。例えば、スクリーン上にボタンが動くアニメーションを行った場合、現在ある位置でボタンをクリックしても反応しません。自信でこれを修正する必要があります。

Property Animation システムはこれらの制約が取り除かれ、どんなオブジェクトのどんなプロパティにもアニメーションを行うことができ、オブジェクト自身も修正されます。Property Animationシステムはまたアニメーション実行においてさらにロバストになっています。ハイレベルで、animatorにアニメーションをしたいプロパティ(例えば色、位置やサイズなど)を指定をして複数のanimatorの同期や補間などのアニメーションのアスペクトを定義することができます。

View Animationシステムは短いセットアップ時間と少ないコードで設定できます。もしView Animationで自信のアニメーションが行えるのであればProperty Animationを使う必要はありません。異なった状況において両方のアニメーションシステムを使うことも可能です。

APIの概要

Property AnimationシステムのAPIはandroid.animationで定義されています。View Animationシステムではandroid.view.animationの中で、多くの補間機能が既に定義されていますが、Property Animationシステムでも同じようにこれらの機能を使うことが出来ます。以下では、Property Animationシステムの主な構成要素を示しています。

Animator クラスはアニメーションを構成する上で基本的なメソッドを定義したスーパークラスです。Animatorクラスは抽象クラスと定義されているため、直接インスタンス化することは出来ないので、通常Animatorクラスのサブクラスを使用します。サブクラスは主に3つ、ValueAnimator, ObjectAnimator, AnimatorSetがあります。主に、オブジェクトの属性などを設定するのには、ObjectAnimatorクラスを使います。

ValueAnimator

ValueAnimatorは、Property Animationのメインとなるタイミングエンジンです。プロパティ値を計算し、各アニメーションの詳細、繰り返し情報やイベントのアップデートを受け取るリスナーを含んでいます。アニメーションは、主に2つの部分に分けられます。アニメーション値の計算とアニメーションされるオブジェクトとプロパティにそれらの値を設定することです。ValueAnimatorでは、オブジェクトとプロパティに値を設定することができないので、自信のロジックでアニメーションをしたいオブジェクトに値をアップデートしていく必要があります。

ObjectAnimator

ValueAnimationのサブクラスで、ターゲットオブジェクトを設定することが出来ます。このクラスはアニメーションの値を計算する時に,それに応じてプロパティををアップデートします。ターゲットとなるオブジェクトにアニメーション値を設定できるので、簡単にアニメーションを行うことが出来ます。しかし、OjbectAnimationは現在のターゲットオブジェクトに特定のアクセッサーの方法を要求する場合に制限出てくるので、その時にはValueAnimationを直接使います。

AnimationSet

アニメーションをグループ化することができます。アニメーションの同時表示や連続表示、また指定した遅延時間後などを設定することが出来ます。

0 件のコメント:

コメントを投稿