このトピックでは、タイミング システムがアニメーション、 Timeline、および Clock クラスを使用してプロパティをアニメーション化する方法について説明します。
[前提条件]
このトピックを理解するには、「アニメーションの概要」で説明されているように、WPF アニメーションを使用してプロパティを アニメーション化できる必要があります。 また、依存関係プロパティを理解するのにも役立ちます。詳細については、「 依存関係プロパティの概要」を参照してください。
タイムラインと時計
アニメーションの概要では、Timelineが時間のセグメントを表す方法について説明し、アニメーションは出力値を生成するTimelineの一種です。 単独では、 Timelineは時間のセグメントを記述する以外の何もしません。 実際の作業を行うタイムラインの Clock オブジェクトです。 同様に、アニメーションは実際にはプロパティをアニメーション化しません。アニメーション クラスは出力値の計算方法を記述しますが、アニメーションの出力を駆動してプロパティに適用するアニメーション用に作成された Clock です。
Clockは、Timelineのタイミング関連のランタイム状態を維持する特殊な種類のオブジェクトです。 アニメーションとタイミング システムに不可欠な 3 ビットの情報 ( CurrentTime、 CurrentProgress、 CurrentState) を提供します。 Clockは、Timeline、Duration、RepeatBehaviorなど、AutoReverseで説明されているタイミング動作を使用して、現在の時刻、進行状況、状態を決定します。
ほとんどの場合、タイムラインに対して Clock が自動的に作成されます。 StoryboardまたはBeginAnimationメソッドを使用してアニメーション化すると、タイムラインとアニメーションのクロックが自動的に作成され、そのターゲット プロパティに適用されます。 ClockのCreateClock メソッドを使用して、Timelineを明示的に作成することもできます。 MediaTimeline.CreateClock メソッドは、呼び出されるTimelineに適した型のクロックを作成します。 Timelineに子タイムラインが含まれている場合は、Clockオブジェクトも作成されます。 結果の Clock オブジェクトは、作成元の Timeline オブジェクト ツリーの構造に一致するツリーに配置されます。
タイムラインにはさまざまな種類のクロックがあります。 次の表に、さまざまなClock型に対応するTimeline型を示します。
タイムラインの種類 | クロックの種類 | クロックの目的 |
---|---|---|
アニメーション ( AnimationTimelineから継承) | AnimationClock | 依存関係プロパティの出力値を生成します。 |
MediaTimeline | MediaClock | メディア ファイルを処理します。 |
ParallelTimeline | ClockGroup | 子 Clock オブジェクトをグループ化および制御します。 |
Storyboard | ClockGroup | 子 Clock オブジェクトをグループ化および制御します。 |
AnimationClock メソッドを使用して、作成したApplyAnimationClockオブジェクトを互換性のある依存関係プロパティに適用できます。
多数の類似オブジェクトのアニメーション化など、パフォーマンスを集中的に要するシナリオでは、独自の Clock の使用を管理すると、パフォーマンス上の利点が得られます。
クロックとタイム マネージャー
WPF でオブジェクトをアニメーション化する場合、タイムライン用に作成された Clock オブジェクトを管理するのはタイム マネージャーです。 タイム マネージャーは、 Clock オブジェクトのツリーのルートであり、そのツリー内の時間の流れを制御します。 タイム マネージャーは WPF アプリケーションごとに自動的に作成され、アプリケーション開発者には表示されません。 タイム マネージャーは、1 秒あたりに何度も "ティック" します。1 秒ごとに発生する実際のティック数は、使用可能なシステム リソースによって異なります。 これらの各ティックごとに、タイムマネージャーはタイミングツリー内のすべてのActiveClockオブジェクトの状態を計算します。
次の図は、タイム マネージャーと AnimationClock、およびアニメーション化された依存関係プロパティの関係を示しています。
プロパティのアニメーション化
タイムマネージャーが動作すると、アプリケーション内のすべての ActiveClock の時刻を更新します。 ClockがAnimationClockの場合は、作成元のGetCurrentValueのAnimationTimelineメソッドを使用して、現在の出力値を計算します。 AnimationClockは、現在の現地時刻、入力値 (通常はプロパティの基本値)、および既定の宛先値をAnimationTimelineに提供します。 GetValue メソッドまたはその CLR アクセサーを使用してプロパティによってアニメーション化された値を取得すると、そのAnimationClockの出力が取得されます。
クロック グループ
前のセクションでは、タイムラインの種類ごとに異なる種類の Clock オブジェクトがある方法について説明しました。 次の図は、タイム マネージャー、 ClockGroup、 AnimationClock、アニメーション化された依存関係プロパティの関係を示しています。 ClockGroupは、アニメーションやその他のタイムラインをグループ化する Storyboard クラスなど、他のタイムラインをグループ化するタイムライン用に作成されます。
クロックグループ
組成
複数のクロックを 1 つのプロパティに関連付けることができます。この場合、各クロックは、前のクロックの出力値を基本値として使用します。 次の図は、同じプロパティに適用される 3 つの AnimationClock オブジェクトを示しています。 Clock1 は、アニメーション化されたプロパティの基本値を入力として使用し、それを使用して出力を生成します。 Clock2 は Clock1 からの出力を入力として受け取り、それを使用して出力を生成します。 Clock3 は Clock2 からの出力を入力として受け取り、それを使用して出力を生成します。 複数のクロックが同じプロパティに同時に影響する場合、それらはコンポジション チェーン内にあると言われます。
構成チェーン
コンポジション チェーン内の AnimationClock オブジェクトの入出力間にリレーションシップが作成されますが、そのタイミング動作は影響を受けず、 Clock オブジェクト ( AnimationClock オブジェクトを含む) は親オブジェクト Clock オブジェクトに階層的な依存関係を持つことに注意してください。
同じプロパティに複数のクロックを適用するには、Compose、アニメーション、またはHandoffBehaviorを適用するときにStoryboardAnimationClockを使用します。
ティックとイベントの統合
出力値の計算に加えて、タイム マネージャーは、各クロックの状態を決定し、必要に応じてイベントを発生させるたびに、その他の処理を実行します。
ティックは頻繁に発生しますが、各ティックの間には多くのことが起こる可能性があります。 たとえば、 Clock が停止、開始、停止された場合、その CurrentState 値は 3 回変更されます。 理論上、 CurrentStateInvalidated イベントは 1 ティックで複数回発生する可能性があります。ただし、タイミング エンジンはイベントを統合するため、 CurrentStateInvalidated イベントはティックごとに最大 1 回発生できます。 これは、すべてのタイミング イベントに当てはまります。特定の Clock オブジェクトに対して、各型の最大 1 つのイベントが発生します。
Clockが状態を切り替え、ティック間で元の状態に戻ると (Active から Stopped に変更してActiveに戻るなど)、関連付けられたイベントは引き続き発生します。
タイミング イベントの詳細については、「 タイミング イベントの概要」を参照してください。
プロパティの現在の値と基本値
アニメーション化可能なプロパティには、基本値と現在の値の 2 つの値を指定できます。 CLR アクセサーまたは SetValue メソッドを使用してプロパティを設定する場合は、その基本値を設定します。 プロパティがアニメーション化されていない場合、その基本値と現在の値は同じです。
プロパティをアニメーション化すると、 AnimationClock はプロパティの 現在 の値を設定します。 CLR アクセサーまたは GetValue メソッドを使用してプロパティの値を取得すると、AnimationClockがAnimationClockまたはActiveされたときに、Fillingの出力が返されます。 プロパティの基本値は、 GetAnimationBaseValue メソッドを使用して取得できます。
こちらも参照ください
.NET Desktop feedback