最も単純な定義にまで分解すると、アニメーションとは時間の経過に伴う値の変動にすぎません。Core Animationは、強力なタイムライン機能を提供することで、アニメーションとレイヤの両方に対して基本的なタイミング機能を提供します。
この章では、すべてのアニメーションサブクラスに共通のタイミングプロトコルと基本的なアニメーションサポートについて説明します。
メディアタイミングプロトコル
アニメーションのペーシング
アニメーションデリゲート
Core AnimationタイミングモデルはCAMediaTimingプロトコルによって記述され、CAAnimationクラスとそのサブクラスに採用されています。このタイミングモデルでは、アニメーションの時間オフセット、再生時間、速度、および繰り返しを指定します。
CAMediaTimingプロトコルはCALayerクラスでも採用されており、レイヤは相対的な座標空間を記述するのと同様の方法で、そのスーパーレイヤを基準にした相対的な時空間を定義できます。このレイヤツリーによる時空間の概念が、ルートレイヤからその子孫に渡り、スケーラブルなタイムラインをもたらします。アニメーションは表示先となるレイヤに関連付けられている必要があるため、そのレイヤで定義されている時空間に合わせてアニメーションのタイミングが拡大縮小されます。
アニメーションやレイヤのspeedプロパティによって、この拡大縮小率を指定します。たとえば、速度値(speed)が2の時空間を持つレイヤにアタッチされた10秒のアニメーションの場合、表示は5秒になります(2倍速)。このレイヤのサブレイヤでも速度係数が2と定義されている場合、そのアニメーションは4分の1の時間で表示されます(スーパーレイヤの速度×サブレイヤの速度)。
同様に、レイヤの時空間はQuartz Composerコンポジションのような動的レイヤメディアの再生にも影響する可能性があります。QCCompositionLayerの速度を2倍にすると、コンポジションの再生速度が2倍になり、そのレイヤにアタッチされたあらゆるアニメーションの速度も2倍になります。また、この影響は階層的であるため、QCCompositionLayersのサブレイヤもすべて速い速度でコンテンツを表示します。
CAMediaTimingプロトコルのdurationプロパティをアニメーションに対して使用して、アニメーションの1回の再生時間を秒単位で定義できます。CAAnimationのサブクラスのデフォルトの再生時間は0秒です。これは、対象のアニメーションはそれが実行されているトランザクションによって指定された再生時間を使う必要があり、トランザクションの時間が指定されていない場合は0.25秒を使用する必要があることを示しています。
タイミングプロトコルはアニメーションを開始する手段を提供します。beginTimeおよびtimeOffsetという2つのプロパティを使用して、特定の秒数を再生時間に指定します。beginTimeは、アニメーションを開始する秒数を指定します。この値は、アニメーションのレイヤの時空間に合わせて拡大縮小されます。timeOffsetは追加のオフセットを指定しますが、アクティブな現時時間で指定されます。この2つの値を組み合わせて、最終的な開始オフセットが決定されます。
アニメーションの反復動作もまた、CAMediaTimingプロトコルのrepeatCountおよびrepeatDurationプロパティで定義されます。repeatCountはアニメーションの反復回数を指定し、小数値の指定が可能です。10秒のアニメーションのrepeatCountに2.5の値を設定すると、アニメーションは合計25秒実行し、3回目の繰り返しの途中で終了します。repeatCountに1e100fを設定すると、アニメーションは、レイヤから削除されるまで繰り返されます。
repeatDurationはrepeatCountと似ていますが、繰り返し回数ではなく秒単位で指定されます。repeatDurationも小数値をとることができます。
アニメーションのautoreversesプロパティは、複数回の繰り返しが指定されている場合に、アニメーションの前方再生の終了後、逆方向に再生するかどうかを指定します。
タイミングプロトコルのfillModeプロパティは、アクティブな再生時間以外のときにアニメーションをどのように表示するかを定義します。アニメーションは、その開始位置、終了位置、またはその両方で停止させたり、表示から完全に削除したりできます。デフォルトの動作では、アニメーションが終了したら表示から削除するようになっています。
アニメーションのペーシングは、補間された値がアニメーションの再生時間中にどのように配分されるかを決定します。ある特定の視覚効果に対して適切なペーシングを使用することで、ユーザに対するその効果を大いに高めることができます。
アニメーションのペーシングは、三次元ベジエ曲線で表されるタイミング関数によって表現されます。この関数は、アニメーションの1回の再生時間([0.0,1.0]の範囲に正規化)を出力時間(同様の範囲に正規化)にマップします。
CAAnimationクラスのtimingFunctionプロパティは、CAMediaTimingFunctionのインスタンスを指定します。このクラスはタイミング機能をカプセル化します。
CAMediaTimingFunctionでは、マップ関数を指定する際の2つの選択肢が用意されています。すなわち、一般的なペーシング曲線を作成する定数と、2つの制御点を指定することによってカスタム関数を作成するメソッドです。
以下の定数の1つをCAMediaTimingFunctionクラスメソッドのfunctionWithName:に指定すると、あらかじめ定義されているタイミング関数が返されます。
kCAMediaTimingFunctionLinearは、線形のペーシングを指定します。線形のペーシングはアニメーションをその再生時間全体に渡り均等に実行します。
kCAMediaTimingFunctionEaseInはイーズインのペーシングを指定します。イーズインのペーシングは、アニメーションを低速で開始し、その後加速します。
kCAMediaTimingFunctionEaseOutは、イーズアウトのペーシングを指定します。イーズアウトのペーシングは、最初は高速で開始し、その後終了に向かって減速します。
kCAMediaTimingFunctionEaseInEaseOutは、イーズインイーズアウトのペーシングを指定します。イーズインイーズアウトアニメーションは、低速で開始し、再生の途中で加速し、終了前に再度減速します。
図 1に定義済みのタイミング関数を三次元ベジエタイミング曲線で示します。
カスタムのタイミング関数は、functionWithControlPoints::::クラスメソッド、またはinitWithControlPoints::::インスタンスメソッドを使用して作成します。ベジエ曲線の終点は、自動的に(0.0,0.0)および(1.0,1.0)に設定されています。作成メソッドでは、パラメータとしてc1x、c1y、c2x、およびc2yが期待されます。結果として得られる、ベジエ曲線を定義する制御点は[(0.0,0.0), (c1x,c1y), (c2x,c2y), (1.0,1.0)]です。
リスト 1に、点[(0.0,0.0), (0.25,0.1), (0.25,0.1), (1.0,1.0)]を使用してカスタムタイミング関数を作成するコード例を示します。
リスト 1 CAMediaTimingFunctionのカスタムコード
CAMediaTimingFunction *customTimingFunction; |
customTimingFunction=[CAMediaTimingFunction functionWithControlPoints:0.25f :0.1f :0.25f :1.0f]; |
注: Keyframeアニメーションでは、CAMediaTimingFunctionの1つのインスタンスによって提供されるものよりも複雑なペーシングとタイミングのモデルが必要です。詳細については「Keyframeのタイミングとペーシングの拡張」を参照してください。
CAAnimationクラスは、アニメーションの開始時および停止時に、デリゲートオブジェクトを通知する手段を提供します。
アニメーションにデリゲートが指定されていると、アニメーションは、開始したアニメーションインスタンスが指定されたanimationDidStart:メッセージを受け取ります。アニメーションが停止するとデリゲートは、停止したアニメーションインスタンスとアニメーションの再生が完全に終了したのか手動で停止されたのか示すBoolean値が指定されたanimationDidStop:finished:メッセージを受け取ります。
重要: CAAnimationデリゲートオブジェクトはレシーバ側で保持されます。これは、『Memory Management Programming Guide for Cocoa』で説明しているメモリ管理規則のごくまれな例外です。
Last updated: 2007-10-31