動畫和計時系統概觀

本主題描述計時系統如何使用動畫、 TimelineClock 類別來產生屬性的動畫效果。

必要條件

若要瞭解本主題,您應該能夠使用 WPF 動畫來建立屬性的動畫效果,如 動畫概觀中所述。 這也有助於熟悉相依性屬性。如需詳細資訊,請參閱相依性屬性概觀

時間軸和時鐘

動畫概觀描述 A Timeline 如何代表時間區段,而動畫是產生輸出值的類型 Timeline 。 本身,除了 Timeline 描述一段時間之外,, 不會執行任何其他動作。 這是執行實際工作的時程表 Clock 物件。 同樣地,動畫不會實際產生屬性的動畫效果:動畫類別描述應該如何計算輸出值,但它是 Clock 針對驅動動畫輸出並將它套用至屬性的動畫所建立的 。

Clock是一種特殊類型的 物件,可維護 的 Timeline 計時相關執行時間狀態。 它提供動畫和計時系統不可或缺的三個資訊: CurrentTimeCurrentProgressCurrentState 。 使用 ClockTimeline 所描述的計時行為來判斷其目前的時間、進度和狀態: DurationRepeatBehaviorAutoReverse 等等。

在大部分情況下, Clock 系統會自動為您的時程表建立 。 當您使用 StoryboardBeginAnimation 方法建立動畫時,會自動為您的時程表和動畫建立時鐘,並套用至其目標屬性。 您也可以使用 CreateClockTimeline 方法來明確建立 Clock 。 方法 MediaTimeline.CreateClock 會為其呼叫的 建立 Timeline 適當型別的時鐘。 Timeline如果 包含子時程表,它也會為其建立 Clock 物件。 產生的 Clock 物件會排列在樹狀結構中,以符合建立物件樹 Timeline 狀結構的物件樹狀結構。

不同類型的時間軸有不同類型的時鐘。 下表顯示 Clock 對應至某些不同 Timeline 型別的類型。

時間軸型別 時鐘類型 時鐘用途
動畫 (繼承自 AnimationTimeline) AnimationClock 產生相依性屬性的輸出值。
MediaTimeline MediaClock 處理媒體檔案。
ParallelTimeline ClockGroup 群組和控制其子 Clock 物件
Storyboard ClockGroup 群組和控制其子 Clock 物件

您可以使用 方法來套用 ApplyAnimationClock 您所建立的任何 AnimationClock 物件至相容的相依性屬性。

在效能密集型案例中,例如以動畫顯示大量類似物件,管理您自己的 Clock 用途可提供效能優勢。

時鐘和時間管理員

當您在 WPF 中建立物件動畫時,它是管理 Clock 為時程表建立之物件的時間管理員。 時間管理員為 Clock 物件樹狀目錄的根目錄,並控制該樹狀目錄中的時間流程。 會為每一個 WPF 應用程式自動建立時間管理員,而且應用程式開發人員看不到時間管理員。 時間管理員每一秒都會「滴答」許多次,每一秒發生的實際滴答數目會視可用的系統資源而有所不同。 在這其中一個刻度期間,時間管理員會計算計時樹狀結構中所有 ActiveClock 物件的狀態。

下圖顯示時間管理員和 和 之間的 AnimationClock 關聯性,以及動畫相依性屬性。

Timing system components and the time manager.
以動畫顯示屬性

當時間管理員刻度時,它會更新應用程式中每個 ActiveClock 的時間。 Clock如果 是 AnimationClock ,它會使用 GetCurrentValue 建立其來源的 AnimationTimeline 方法來計算其目前的輸出值。 會 AnimationClockAnimationTimeline 提供目前當地時間、輸入值,通常是 屬性的基底值,以及預設目的地值。 當您使用 GetValue 方法或其 CLR 存取子擷取屬性所產生動畫的值時,您會取得其 AnimationClock 的輸出。

時鐘群組

上一節說明不同時間軸類型的物件類型 Clock 。 下圖顯示時間管理員、 ClockGroup 、、 AnimationClock 和動畫相依性屬性之間的關聯性。 會 ClockGroup 針對將其他時程表分組的時程表建立 ,例如 Storyboard 類別,其會將動畫和其他時程表分組。

Timing system components with the time manager and dependency properties.
ClockGroup

Composition

您可以將多個時鐘與單一屬性進行關聯,此時每個時鐘都使用上述時鐘的輸出值做為其基底值。 下圖顯示套用至相同屬性的三 AnimationClock 個物件。 Clock1 使用動畫屬性的基底值做為輸入,並使用它來產生輸出。 Clock2 會採用從 Clock1 的輸出做為輸入,並使用它來產生輸出。 Clock3 會採用從 Clock2 的輸出做為輸入,並使用它來產生輸出。 當多個時鐘同時影響同一個屬性時,就可以說是形成一個組合鏈結。

Timing system components composed with multiple dependency properties.
組合鏈結

請注意,雖然在組合鏈結中物件的輸入和輸出 AnimationClock 之間建立關聯性,但其計時行為不會受到影響; Clock 物件 (包括 AnimationClock 物件) 在其父 Clock 物件上具有階層式相依性。

若要將多個時鐘套用至相同的屬性,請在套用 、動畫或 AnimationClock 時使用 ComposeHandoffBehaviorStoryboard

滴答和事件彙總

除了計算輸出值,時間管理員也會在每次滴答時執行其他工作︰它會判斷每個時鐘的狀態並引發適當的事件。

雖然滴答經常發生,但在滴答之間有可能會發生很多事。 例如, Clock 可能會停止、啟動和停止,在此情況下,其 CurrentState 值將會變更三次。 理論上, CurrentStateInvalidated 事件可能會在單一刻度中多次引發;不過,計時引擎會合並事件,以便 CurrentStateInvalidated 每個刻度最多可以引發一次事件。 所有計時事件都是如此:每個類型的最多一個事件都會針對指定的 Clock 物件引發。

Clock當切換狀態,並在刻度之間傳回原始狀態 (,例如從 ActiveStopped 變更回 Active) 時,仍會發生相關聯的事件。

如需計時事件的詳細資訊,請參閱計時事件概觀

屬性的目前值和基底值

可動畫的屬性可以有兩個值︰基底值和目前值。 當您使用其 CLR 存取子或 SetValue 方法設定屬性時,您可以設定其基底值。 當屬性未以動畫顯示時,其基底值和目前值都相同。

當您建立屬性的動畫時,會 AnimationClock 設定屬性的 目前 值。 透過其 CLR 存取子擷取屬性值,或 方法會在 為 GetValueActiveFillingAnimationClock 傳回 的 AnimationClock 輸出。 您可以使用 方法來擷取屬性的基底值 GetAnimationBaseValue

另請參閱