動畫和計時系統概觀
本主題描述計時系統如何使用動畫、 Timeline 、 和 Clock 類別來建立屬性的動畫效果。
必要條件
若要瞭解本主題,您應該能夠使用 WPF 動畫來建立屬性的動畫效果,如動畫概觀 中所述 。 這也有助於熟悉相依性屬性。如需詳細資訊,請參閱相依性屬性概觀。
時間軸和時鐘
動畫概 觀 描述 a Timeline 如何代表時間區段,而動畫是產生輸出值的 型 Timeline 別。 本身,除了 Timeline 描述某個時間段之外,不會執行任何動作。 這是執行實際工作的時間軸 Clock 物件。 同樣地,動畫不會實際產生屬性的動畫效果:動畫類別描述應該如何計算輸出值,但它是 Clock 針對驅動動畫輸出並將它套用至屬性的動畫所建立的 。
Clock是一種特殊的 物件類型,可維護 的時間相關執行時間狀態 Timeline 。 它提供動畫和計時系統不可或缺的三個位資訊: CurrentTime 、 CurrentProgress 和 CurrentState 。 使用 Clock 其所描述的計時行為來判斷其 Timeline 目前的時間、進度和狀態: Duration 、 RepeatBehavior 、 AutoReverse 等等。
在大部分情況下, Clock 系統會自動為您的時間軸建立 。 當您使用 Storyboard 或 BeginAnimation 方法建立動畫時,系統會自動為您的時間軸和動畫建立時鐘,並套用至其目標屬性。 您也可以使用 CreateClock 的 Timeline 方法明確建立 Clock 。 方法 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 應用程式建立時間管理員,而且對應用程式開發人員而言是看不見的。 時間管理員每一秒都會「滴答」許多次,每一秒發生的實際滴答數目會視可用的系統資源而有所不同。 在每一個刻度期間,時間管理員會計算計時樹狀結構中所有 ActiveClock 物件的狀態。
下圖顯示時間管理員和 之間的關聯性 AnimationClock ,以及動畫相依性屬性。
以動畫顯示屬性
當時間管理員刻度時,它會更新應用程式中的每個時間 ActiveClock 。 Clock如果 是 AnimationClock ,它會使用 GetCurrentValue 建立的 方法 AnimationTimeline 來計算其目前的輸出值。 AnimationClock會 AnimationTimeline 提供目前當地時間的 、輸入值,通常是 屬性的基底值,以及預設目的地值。 當您使用 GetValue 方法或其 CLR 存取子擷取由 屬性產生動畫的值時,您會取得其 AnimationClock 的輸出。
時鐘群組
上一節說明不同時間軸類型 Clock 的不同物件類型。 下圖顯示時間管理員、、 ClockGroup 、 AnimationClock 和動畫相依性屬性之間的關聯性。 ClockGroup針對將其他時程表分組的時程表建立 ,例如 Storyboard 類別,其會將動畫和其他時程表分組。
ClockGroup
組合
您可以將多個時鐘與單一屬性進行關聯,此時每個時鐘都使用上述時鐘的輸出值做為其基底值。 下圖顯示套用至相同屬性的三 AnimationClock 個物件。 Clock1 使用動畫屬性的基底值做為輸入,並使用它來產生輸出。 Clock2 會採用從 Clock1 的輸出做為輸入,並使用它來產生輸出。 Clock3 會採用從 Clock2 的輸出做為輸入,並使用它來產生輸出。 當多個時鐘同時影響同一個屬性時,就可以說是形成一個組合鏈結。
組合鏈結
請注意,雖然在組合鏈結中物件的輸入和輸出 AnimationClock 之間建立關聯性,但其計時行為不會受到影響; Clock 物件(包括 AnimationClock 物件)對其父 Clock 物件具有階層式相依性。
若要將多個時鐘套用至相同的屬性,請在套用 、動畫或 AnimationClock 時使用 ComposeHandoffBehavior 。 Storyboard
滴答和事件彙總
除了計算輸出值,時間管理員也會在每次滴答時執行其他工作︰它會判斷每個時鐘的狀態並引發適當的事件。
雖然滴答經常發生,但有很多事可能會在滴答之間發生。 例如, Clock 可能會再次停止、啟動和停止,在此情況下,其 CurrentState 值會變更三次。 理論上, CurrentStateInvalidated 事件可以在單一刻度中多次引發;不過,計時引擎會合並事件,以便 CurrentStateInvalidated 每個刻度最多可以引發一次事件。 這適用于所有計時事件:每個型別的最多一個事件都會針對指定的 Clock 物件引發。
Clock當切換狀態,並在刻度之間返回其原始狀態時(例如,從 ActiveStopped 變更為 和回到 Active ),相關聯的事件仍會發生。
如需計時事件的詳細資訊,請參閱計時事件概觀。
屬性的目前值和基底值
可動畫的屬性可以有兩個值︰基底值和目前值。 當您使用其 CLR 存取子或 SetValue 方法來設定屬性時,您可以設定其基底值。 當屬性未以動畫顯示時,其基底值和目前值都相同。
當您以動畫顯示內容時,會 AnimationClock 設定屬性的 目前 值。 透過其 CLR 存取子擷取屬性的值,或 方法會在 為 或 GetValueFilling 時 AnimationClockActive 傳回 的 AnimationClock 輸出。 您可以使用 方法來擷取屬性的基底值 GetAnimationBaseValue 。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應