Windows アニメーションの概要
この概要では、Windows アニメーション マネージャーの概要を説明し、主要なコンポーネントと概念に焦点を当てます。 ストーリーボードと切り替えの詳細については、「 ストーリーボードの概要」を参照してください。
このトピックは、次のセクションで構成されています。
基本的な概念
アニメーション は、再生時に動きの錯覚を生み出す連続した静止画像のシーケンスです。 ユーザー インターフェイスで対話型アニメーションを使用すると、アプリケーションに固有の個性を与え、ユーザー エクスペリエンスを向上させることができます。 アニメーションは、ユーザー インターフェイスの大きな状態の変化を伝え、ユーザー インターフェイスの複雑さを管理するのに役立ちます。 アニメーションは、アプリケーションの品質に対するユーザーの認識を高めることもできます。
たとえば、Windows アニメーションはタスク バーでファイルやプログラムの管理とアクセスに役立ち、拡大鏡を使用して画面のさまざまな部分を拡大してユーザーが見やすくします。
アニメーションの基本的な単位は、アニメーション化するビジュアル要素の特性と、その特性が時間の経過とともにどのように変化するかの説明です。 アプリケーションでは、位置、色、サイズ、回転、コントラスト、不透明度など、さまざまな特性をアニメーション化できます。
Windows アニメーションでは、 アニメーション変数 はアニメーション化する特性を表します。 遷移は、アニメーションが発生すると、そのアニメーション変数の値がどのように変化するかを示します。 たとえば、ビジュアル要素には、その不透明度を指定するアニメーション変数があり、ユーザー アクションによって、その不透明度を 50 から 100 までの切り替えを生成し、半透明から完全に不透明なアニメーションを表します。
ストーリーボードは、時間の経過と同時に 1 つ以上のアニメーション変数に適用される一連の遷移です。 アプリケーションでは、ストーリーボードを構築して再生し、アニメーション変数の値が時間の経過と同時に変化するにつれて不連続フレームのシーケンスを描画することで、アニメーションを表示します。
Windows アニメーションのコンポーネント
Windows アニメーションは、次のコンポーネントで構成されます。
-
アニメーション マネージャー
-
アプリケーションでは、アニメーション マネージャー オブジェクトを使用して、アニメーション変数とストーリーボードを作成し、アニメーションのスケジュールと制御を行い、各フレームを描画する前に状態情報を更新します。 通常、1 つのアニメーション マネージャー オブジェクトは、アプリケーション全体のすべてのアニメーションを管理するため、スケジュールされたすべてのストーリーボードをグローバルに制御できます。
-
アニメーション変数
-
アニメーションを開始する前に、アプリケーションでアニメーション変数オブジェクトを作成する必要があります。 アニメーション変数は、アニメーション化するビジュアル要素の 1 つの側面を表します。 変数はスカラー浮動小数点値ですが、値は整数値に丸めることができます。
アニメーション変数は、通常、アニメーション化するビジュアル要素と同じ有効期間を持ちます。 アニメーション変数の初期値は、変数の作成時に指定されます。 その後、その値を直接変更することはできません。アニメーション マネージャーを使用して更新する必要があります。
アニメーション変数は、整数識別子と COM オブジェクトへのポインターの組み合わせである タグによって識別できます。 タグは、アプリケーションで変数の検索に使用しない限り、一意である必要はありません。 既定では、アニメーション変数にはタグがないため、タグの読み取りは設定されるまで失敗します。
-
タイミング システム
-
Windows アニメーションには、スムーズで一貫性のあるフレーム レートでアニメーションをレンダリングするのに役立つタイミング システムが含まれています。また、システムがビジー状態のときにレンダリングするためのシステム リソースの使用を減らします。 タイマーは、ティックと呼ばれる小さな時間単位の経過を自動的に示すことによって、アニメーションレンダリングを管理するのに役立ちます。 タイミング システムは、システム全体のレンダリング パフォーマンスを監視し、ティックの頻度を動的に増減することでアニメーションを 調整 します。 アプリケーションでは、タイマーがアニメーション マネージャーを駆動でき、タイマーごとにマネージャーが更新される前と後に通知されるハンドラーを登録できます。 アプリケーションでは、タイマーに許容される最小アニメーション フレーム レートを指定し、アニメーションの実際のフレーム レートがこのレートを下回った場合に通知を受け取ることができます。
システム リソースを節約するために、アニメーションが実行されていないときにタイマー自体を無効にするように構成できます。
Windows アニメーション API
Windows アニメーション API は、開発者向けに次の機能を提供するシングルスレッド COM ベースの API です。
- アニメーション オブジェクトを作成し、アニメーションを制御するためのアニメーション マネージャー オブジェクト UIAnimationManager
- アニメーション変数とストーリーボード
- すぐに使用できる切り替えの基本ライブラリ UIAnimationTransitionLibrary
- 現在の時刻を決定するためのタイマー オブジェクト UIAnimationTimer、および必要に応じてアニメーションを駆動するための
- アニメーションの状態と進行状況を監視するためのイベント フック
完全な API リファレンスについては、「 Windows アニメーション リファレンス」を参照してください。 コード例については、「 Windows アニメーション タスク 」と「 Windows アニメーションのサンプル」を参照してください。
構成
アプリケーションは、新しいアニメーションをスケジュールする前に現在の時刻を取得する必要があります。 Windows アニメーションでサポートされるタイミング メカニズムを次に示します。
アニメーションのApplication-Driven
ハードウェア高速グラフィックス API を使用するアプリケーションは、モニターの更新速度と同期して、スムーズなアニメーションをレンダリングできます。 または、アプリケーションが独自のタイミング メカニズムを使用して、アニメーションの各フレームを描画するタイミングを決定することもできます。 どちらの場合も、アプリケーションはアニメーション マネージャーにその状態を更新するタイミングを指示します。 アニメーション タイマーは、アニメーション マネージャーが必要とする単位で、現在の時刻を高精度で判断するために引き続き使用できます。
次の図は、アプリケーションがアニメーションの更新を直接実行している場合のアプリケーションと Windows アニメーション コンポーネントの間の相互作用を示しています。
最も単純な構成では、アニメーションが再生されていない場合でも、アプリケーションは画面が更新されるたびにすべてを再描画します。 無駄な作業を回避するために、アプリケーションは、スケジュールされたアニメーションがあるときに通知されるマネージャー イベント ハンドラーを登録し、スケジュールが空であることを検出して再描画を停止できます。
アニメーションのTimer-Driven
アプリケーションでは、アニメーション マネージャーを直接更新するのではなく、アニメーション タイマーがその状態を更新するタイミングをアニメーション マネージャーに伝え、各更新が行われたときに通知を受け取るだけになることがあります。 この方法は、古いグラフィックス API に推奨されます。 一般に、モニターの更新レートと同期できる場合は、これを行い、アプリケーション駆動型アニメーションを使用することをお勧めします。
次の図は、アニメーション タイマーがアニメーションの更新を実行しているときに、アプリケーションと Windows アニメーション コンポーネント間の相互作用を示しています。
タイマーは、アニメーションがスケジュールされている場合にのみ実行するように構成できます。これを行うことは、タイマーとアニメーション マネージャーが接続されているときに特定のパラメーターを渡す単純な問題です。
高度な機能
アニメーションをサポートするための基本的な基盤を超えて、Windows アニメーションには、次のような高度なアニメーション手法のサポートが含まれています。
-
状況依存の期間
-
切り替えの期間を固定する必要はありません。これは、遷移の開始時にアニメーション化された変数の値と速度に基づいて決定できます。
-
ベロシティ マッチング
-
動くオブジェクトの位置と速度が値の間で瞬時にジャンプしない場合、一般的に動きは目に合います。 新しいストーリーボードで現在再生されているストーリーボードが中断されると、ベロシティ マッチングにより、新しいストーリーボードが前のストーリーボードの終了位置でスムーズに取得できるようになります。
-
競合管理
-
2 つのストーリーボードで同じアニメーション変数を同時に更新する必要がある場合は、スケジュールの競合が発生します。 Windows アニメーションでは、ストーリーボードごとに特定の数値優先度を必要とするのではなく、アプリケーションで任意の 2 つのストーリーボードの相対的な優先順位を決定できます。
競合管理
開発者は 、優先度比較 コールバックを実装して、スケジュールされているストーリーボードの優先度と、既にスケジュールに含まれているストーリーボードを比較できます。 優先度比較を実装するアプリケーションでは、任意の優先ロジックを使用して、ストーリーボードが別のストーリーボードをプリエンプトするタイミングを判断できます。 スケジュールの競合を解決するために、Windows アニメーションは、次の順序で、これらのアクションのうちどれを実行するかをアプリケーションに要求します。
- スケジュールされたストーリーボードを取り消します。 スケジュールされたストーリーボードがまだ再生を開始していない場合は、キャンセルされ、スケジュールから直ちに削除される可能性があります。
- スケジュールされたストーリーボードをトリミングします。 新しいストーリーボードがスケジュールされたストーリーボードをトリミングすると、新しいストーリーボードのアニメーション化が開始されるとすぐに、スケジュールされたストーリーボードは変数に影響しなくなります。 速度が一致するため、新しいストーリーボードは前のストーリーボードが中断した場所でスムーズに取得できます。
- スケジュールされたストーリーボードを終了します。 ストーリーボードは、無期限に繰り返されるループが含まれている場合にのみ終了できます。 ストーリーボードが終了したときにこのようなループ内にある場合、現在の繰り返しが完了し、ストーリーボードの残りの部分が再生されます。 ストーリーボードが終了したときにループがまだ開始されていない場合、ループは完全にスキップされます。
- スケジュールされたストーリーボードを圧縮します。 スケジュールされたストーリーボードのトリミングまたは取り消しがオプションではない場合、ストーリーボードの完了が許可されます。 Windows アニメーションでは、スケジュールされたストーリーボード (およびその前にスケジュールされたストーリーボード) で使用可能な時間を圧縮する可能性があるため、変数はより迅速に最終状態に達します。 圧縮を適用すると、影響を受けるストーリーボードの時間が一時的に高速化されるため、再生速度が速くなります。
登録された優先度比較オブジェクトで上記のアクションが許可されていない場合、新しいストーリーボードのスケジュール設定は失敗します。 既定では、失敗を防ぐためにすべてのストーリーボードをトリミング、終了、または圧縮できますが、キャンセルすることはできません。
次の図は、 UI_ANIMATION_STORYBOARD_STATUS 列挙体によって定義された状態を使用して、ストーリーボードのライフ サイクルを示しています。 アプリケーションでは、Windows アニメーション API を使用してストーリーボードを構築し、スケジュールのために送信します。 アニメーション マネージャーはストーリーボードをスケジュールし、アニメーションを管理します。
ストーリーボードのスケジュール設定と管理の詳細については、「 ストーリーボードの概要」を参照してください。
関連トピック