共用方式為


Windows 動畫概觀

本概觀提供 Windows 動畫管理員的簡介,並著重於重要元件和概念。 如需有關分鏡腳本和轉場的詳細資訊,請參閱 分鏡腳本概觀

本主題包含下列各節:

基本概念

動畫 是連續的靜止影像序列,可在播放時產生移動的錯覺。 在其使用者介面中使用互動式動畫可讓應用程式具有獨特的個性,並改善用戶體驗。 動畫有助於傳達使用者介面中的主要狀態變更,並協助管理使用者介面的複雜性。 動畫也可以新增至使用者對應用程序品質的看法。

例如,Windows 動畫用於任務欄,協助您管理和存取檔案和程式,以及放大鏡來放大螢幕的不同部分,讓使用者更容易看到。

動畫的基本單位是要產生動畫之視覺元素的特性,以及該特性隨時間變化的描述。 應用程式可以動畫顯示各種不同的特性,例如位置、色彩、大小、旋轉、對比和不透明度。

在 Windows 動畫中,動畫變數 代表要建立動畫的特性。 轉換 描述該動畫變數的值如何隨著動畫的發生而變更。 例如,視覺元素可能會有一個動畫變數來設置其透明度,而用戶動作可能會產生一個將不透明度值從50調整到100的轉換,代表從半透明到完全不透明的動畫。

文稿 是一組經過一段時間套用至一或多個動畫變數的轉換。 應用程式會藉由建構和播放分鏡腳本來顯示動畫,然後在動畫變數的值隨著時間變化時繪製離散畫面序列。

Windows 動畫的元件

Windows 動畫包含下列元件:

動畫管理員

應用程式會使用動畫管理員物件來建立動畫變數和分鏡腳本、排程和控制動畫,並在應用程式繪製每個畫面之前更新狀態資訊。 單一動畫管理員物件通常會跨應用程式管理所有動畫,因此可全域控制所有排程的分鏡腳本。

動畫變數

開始任何動畫之前,應用程式必須建立動畫變數物件。 動畫變數代表要產生動畫效果之視覺元素的一個層面。 變數是純量浮點值,雖然值可以四捨五入為整數值。

動畫變數的存留期通常與它要動畫的視覺元素相同。 建立變數時會指定動畫變數的初始值。 之後,就無法直接變更其值;它必須透過動畫管理員更新。

動畫參數可以通過 標記識別,這表示將整數識別碼與 COM 物件指標配對。 除非應用程式使用它來搜尋變數,否則標籤不需要是唯一的。 根據預設,動畫變數沒有標記,而且任何讀取其標籤的嘗試都會失敗,直到設定一個標籤為止。

計時系統

Windows 動畫包含一個計時系統,可以協助確保動畫以流暢且一致的幀速率呈現,同時在系統忙碌時減少轉譯所需的系統資源。 定時器 可藉由自動指出時間小單位的通過,稱為 刻度,來協助管理動畫轉譯。 計時系統會監控整體系統的渲染效能,並透過動態增加或減少時鐘刻度的頻率來 節流 動畫。 應用程式可以讓計時器驅動動畫管理器,並可以註冊一個事件處理程序,以便在管理器每次刻度更新之前和之後收到通知。 應用程式可以指定定時器可接受的最小動畫幀速率,並在動畫的實際幀速率低於此速率時收到通知。

若要節省系統資源,定時器可以設定為在沒有任何動畫發生時停用本身。

Windows 動畫 API

Windows 動畫 API 是單個線程 COM 型 API,可為開發人員提供下列功能:

  • 動畫管理員物件,UIAnimationManager,用於建立動畫物件和控制動畫
  • 動畫變數和故事板
  • 基本連結庫,UIAnimationTransitionLibrary,可供使用轉換
  • 定時器物件,UIAnimationTimer,用於判斷目前的時間,並可選地控制動畫。
  • 用於監視動畫狀態和進度的事件鉤子

如需完整的 API 參考,請參閱 Windows 動畫參考。 如需範例程式代碼,請參閱 Windows 動畫工作Windows 動畫範例

配置

應用程式必須取得目前的時間,才能排程新的動畫。 以下是 Windows 動畫支援的計時機制:

Application-Driven 動畫

使用硬體加速圖形 API 的應用程式可以與監視器重新整理速率同步,以呈現平滑動畫。 或者,應用程式可能會使用自己的計時機制來判斷何時繪製動畫的每個畫面。 不論是哪一種情況,應用程式都會告訴動畫管理員何時更新其狀態。 在動畫管理員所需的單位中,動畫定時器仍可用來判斷具有高精確度的目前時間。

下圖顯示當應用程式直接驅動動畫更新時,應用程式與 Windows 動畫元件之間的互動。

圖表,此圖表顯示當應用程式直接驅動動畫更新時,應用程式與 Windows 動畫元件之間的互動。

在最簡單的設定中,應用程式會在每次重新整理畫面時重新繪製所有專案,即使沒有播放動畫也一定會重繪。 為了避免浪費工作,應用程式可以註冊管理員事件處理程式,以在排程動畫時收到通知,並可偵測排程何時是空的,以便停止重新繪製。

Timer-Driven 動畫

與其直接更新動畫管理員,應用程式可以讓動畫定時器告訴動畫管理員何時更新狀態,然後在每次更新發生時收到通知。 較舊的圖形 API 建議使用此方法。 一般而言,如果可以同步監視器的更新頻率,最好這樣做,並使用由應用程式驅動的動畫。

下圖顯示當動畫定時器驅動動畫更新時,應用程式與 Windows 動畫元件之間的互動。

圖表,顯示動畫定時器驅動動畫更新時,應用程式與 Windows 動畫元件之間的互動。

定時器只能在排程動畫時設定為執行;這樣做是連接定時器和動畫管理員時傳遞特定參數的簡單事項。

進階功能

除了支持動畫的基本基礎之外,Windows 動畫還支持數種進階動畫技術,包括:

依據內容情境而變動的持續時間

轉換的持續時間不需要固定;它可以根據轉換開始時動畫變數的值和速度來決定。

速度比對

如果移動物件的位置和速度不會在值之間瞬間跳躍,則移動通常更令人賞心悅目。 當新的分鏡腳本中斷目前正在播放的分鏡腳本時,速度匹配可讓新的分鏡腳本平順地從前一個結束的地方接上。

競爭管理

如果兩個分鏡腳本需要同時更新相同的動畫變數,就會發生排程衝突。 Windows 動畫可讓應用程式判斷任兩個分鏡腳本的相對優先順序,而不是要求每個分鏡腳本的特定數值優先順序。

衝突管理

開發人員可以實作 優先順序比較 回呼函式,以比較正在排程的分鏡腳本和已排程的分鏡腳本的優先順序。 實作優先順序比較的應用程式可以使用任何慣用的邏輯來判斷何時一個分鏡腳本會優先於另一個。 若要解決排程衝突,Windows Animation 會依下列順序詢問應用程式可以採取哪些動作:

  • 取消已排定的分鏡腳本。 如果計劃表中的分鏡腳本尚未開始播放,它可能會被取消並立即從計劃表中移除。
  • 修剪排程的分鏡腳本。 當新的分鏡腳本修改已排程的分鏡腳本時,一旦新的分鏡腳本開始動畫,排程的分鏡腳本就立即停止對變數的影響。 速度相符,讓新的分鏡腳本能夠順利接續前一個分鏡腳本中斷的位置。
  • 完成已排程的分鏡腳本。 只有當腳本包含無限期重複的循環時,才能結束腳本。 當情節腳本在結束時處於這樣的迴圈中,當前的循環結束後,剩餘的部分將會播放。 迴圈如果在完成分鏡腳本時尚未開始,則會被完全略過。
  • 壓縮排程的分鏡腳本。 如果修剪或取消排定的故事板不是選項,則允許故事板完成。 Windows 動畫引進了壓縮排程分鏡腳本可用時間的可能性(以及排程之前的任何分鏡腳本),讓變數更快到達其最終狀態。 套用壓縮時,受影響的分鏡腳本時間會暫時加速,因此其播放速度會更快。

如果已註冊的優先順序比較對象不允許以上任何操作,則嘗試排程新的故事板會失敗。 預設情況下,所有分鏡腳本都可以修剪、結束或壓縮以防止失敗,但無法取消。

下圖顯示分鏡腳本的生命週期,使用 UI_ANIMATION_STORYBOARD_STATUS 列舉所定義的狀態。 應用程式會使用 Windows 動畫 API 來建置分鏡腳本並提交以供排程。 動畫管理員會排程分鏡腳本並管理動畫。

圖表,顯示動畫管理員如何排程分鏡腳本及管理動畫。

如需文稿排程和管理的詳細資訊,請參閱 分鏡腳本概觀

Windows 動畫參考

Windows 動畫範例

Windows 動畫任務