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 動畫會依下列順序要求應用程式採取哪些動作:

  • 取消排程的分鏡腳本。 如果排程的分鏡腳本尚未開始播放,可能會取消並立即從排程中移除。
  • 修剪排程的分鏡腳本。 當新的分鏡腳本修剪排程的分鏡腳本時,當新的分鏡腳本開始產生動畫效果時,排程的分鏡腳本就會停止影響變數。 系統會比對速度,讓新的分鏡腳本能夠順暢地從前一個分鏡腳本離開的位置開始。
  • 結束排程的分鏡腳本。 只有當腳本包含無限期重複的迴圈時,才會結束腳本。 如果分鏡腳本在結束時處於這類迴圈中,目前的重複就會完成,然後播放腳本的其餘部分。 如果腳本結束時尚未開始迴圈,則會完全略過迴圈。
  • 壓縮排程的分鏡腳本。 如果修剪或取消排程的分鏡腳本不是選項,則允許腳本完成。 Windows 動畫引進了壓縮排程分鏡腳本可用時間的可能性 (,以及) 之前排程的任何分鏡腳本,讓變數更快到達最終狀態。 套用壓縮時,受影響的分鏡腳本會暫時加速時間,因此它們會更快播放。

如果已註冊的優先順序比較物件不允許上述任何動作,則嘗試排程新的分鏡腳本會失敗。 根據預設,所有分鏡腳本都可以修剪、結束或壓縮以防止失敗,但無法取消。

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

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

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

Windows 動畫參考

Windows 動畫範例

Windows 動畫工作