動畫和計時系統概觀
本主題描述計時系統如何使用動畫、 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 物件 |
您可以使用 方法來套用 ApplyAnimationClock 您所建立的任何 AnimationClock 物件至相容的相依性屬性。
在效能密集型案例中,例如以動畫顯示大量類似物件,管理您自己的 Clock 用途可提供效能優勢。
時鐘和時間管理員
當您在 WPF 中建立物件動畫時,它是管理 Clock 為時程表建立之物件的時間管理員。 時間管理員為 Clock 物件樹狀目錄的根目錄,並控制該樹狀目錄中的時間流程。 會為每一個 WPF 應用程式自動建立時間管理員,而且應用程式開發人員看不到時間管理員。 時間管理員每一秒都會「滴答」許多次,每一秒發生的實際滴答數目會視可用的系統資源而有所不同。 在這其中一個刻度期間,時間管理員會計算計時樹狀結構中所有 ActiveClock 物件的狀態。
下圖顯示時間管理員和 和 之間的 AnimationClock 關聯性,以及動畫相依性屬性。
以動畫顯示屬性
當時間管理員刻度時,它會更新應用程式中每個 ActiveClock 的時間。 Clock如果 是 AnimationClock ,它會使用 GetCurrentValue 建立其來源的 AnimationTimeline 方法來計算其目前的輸出值。 會 AnimationClockAnimationTimeline 提供目前當地時間、輸入值,通常是 屬性的基底值,以及預設目的地值。 當您使用 GetValue 方法或其 CLR 存取子擷取屬性所產生動畫的值時,您會取得其 AnimationClock 的輸出。
時鐘群組
上一節說明不同時間軸類型的物件類型 Clock 。 下圖顯示時間管理員、 ClockGroup 、、 AnimationClock 和動畫相依性屬性之間的關聯性。 會 ClockGroup 針對將其他時程表分組的時程表建立 ,例如 Storyboard 類別,其會將動畫和其他時程表分組。
ClockGroup
Composition
您可以將多個時鐘與單一屬性進行關聯,此時每個時鐘都使用上述時鐘的輸出值做為其基底值。 下圖顯示套用至相同屬性的三 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 存取子擷取屬性值,或 方法會在 為 GetValueActive 或 Filling 時 AnimationClock 傳回 的 AnimationClock 輸出。 您可以使用 方法來擷取屬性的基底值 GetAnimationBaseValue 。