Animation (DirectComposition)

注意

針對Windows 10上的應用程式,建議您使用 Windows。UI。組合 API,而不是 DirectComposition。 如需詳細資訊,請參閱 使用視覺層將傳統型應用程式現代化

本主題討論 Microsoft DirectComposition 動畫的基本概念。 它包含下列主題:

什麼是動畫?

動畫 是透過在每次變更之後重新繪製視覺效果時,快速對視覺效果進行累加變更所建立的光學錯覺。 因為重繪快速發生,所以大腦會將累加變更視為單一變更場景,就像在即時動作的電影或影片中一樣。

下表說明使用動畫的一些一般方式。

動畫 描述
捲動 使用動畫將物理模擬動向清單控制項等功能新增。
場景轉換 使用動畫來建立導覽場景轉換,以提供工作流程中工作之間的持續性。 導覽場景轉換提供內容,顯示使用者已位於何處、其所在位置,以及他們下一步需要前往的位置。
跨視窗互動 以動畫顯示不同應用程式的 UI 元素,讓兩者之間的順暢持續性感知,協助使用者完成涉及從一個應用程式切換到另一個應用程式的工作。

 

可產生動畫效果的屬性

在 DirectComposition 中,您會將動畫套用至定義視覺效果之物件的個別屬性,以動畫顯示視覺效果。 例如,如果您想要在畫面上水準移動視覺效果,您可以將動畫套用至視覺效果的 OffsetX 屬性。 同樣地,如果您想要執行視覺效果的簡單動畫 2D 旋轉,您可以將動畫套用至 2D 轉換物件的 Angle 屬性,然後將 2D 轉換物件套用至視覺效果的 Transform 屬性。

DirectComposition 可讓您將動畫套用至採用純量值的任何物件屬性。 您可以將同時動畫套用至多個屬性和多個物件。

DirectComposition 會在不同的執行緒上執行動畫。 您可以啟動動畫或動畫集,然後在應用程式執行緒上執行其他工作,或甚至讓執行緒進入睡眠狀態,而組合引擎則會以適當的畫面播放速率執行動畫。

動畫函式

DirectComposition 會根據您定義的動畫函式,建立物件屬性的動畫效果。 動畫函式是一種建構,指定物件屬性的值在一段時間內的變更方式。 例如,您可以定義動畫函式,在 4 秒期間將屬性值從 1 變更為 360。 然後,如果您將動畫函式套用至 2D 旋轉轉換物件的 Angle 屬性,然後將轉換物件套用至視覺效果的 Transform 屬性,動畫函式會在 4 秒的過程中將視覺效果旋轉成全圓形。

動畫函式是由呼叫IDCompositionDevice::CreateAnimation方法所建立的動畫物件表示。 您可以使用動畫物件的 IDCompositionAnimation 介面方法,將 動畫區段一次附加至定義動畫函式的陣列,以建立動畫函式。 附加線段時,您可以指定以零起始的位移,以標記線段的開始時間,相對於動畫函式的開頭。 動畫區段必須以開始時間的遞增順序附加。 嘗試附加開始時間在之前或等於上一個區段的動畫區段將會失敗。 動畫函式可以有指定的結束時間,指出函式何時應該結束。

除非另有指定,否則當桌面視窗管理員 (DWM) 收到執行動畫的命令時,動畫函式就會啟動。 每個區段都會執行,直到到達下一個區段的開始時間為止。 區段之間動畫屬性值中發生的任何不連續變更都會被視為離散變更。

您可以將屬性值設定為代表動畫函式之動畫物件的 IDCompositionAnimation 指標,以將動畫函式套用至屬性。 相同的動畫物件可以套用至相同物件的多個屬性,以及相同裝置所建立之其他物件的屬性。

動畫區段

動畫區段是動畫函式的基本計時定義;它們是建置較複雜且更高層級動畫函式的基本類型。 動畫區段是由一系列參數所建構,這些參數會描述函式和線段開始的時間,相對於動畫函式的開頭。 對於每個區段,時間 (t) 沿著水準軸進行,並從 t = 0 開始。

立方體線段

立方段的計時是由三次方多項式所定義。 針對指定的時間輸入 (t) ,輸出值是由下列方程式所指定:

x (t) = atー+ btー + ctd +

下圖顯示包含兩個立方線段的動畫函式。 第一個區段會在 4 秒內將值從 0 轉換為 16,而第二個區段會在接下來 4 秒內以線性方式將值從 16 變更為 0。 第一次轉換會沿著這個立方多項式進行:

x (t) = tー - 6tー + 12t

和第二次轉換會沿著這一個轉換進行:

x (t) = - 4t + 16

diagram of an animation function with two cubic segments

您可以使用 IDCompositionAnimation::AddCubic 方法,將三次方段新增至動畫函式。

正弦區段

正弦線段的計時是由下列方程式所定義:

x (t) = BiasAmplitude + * sin (tFrequency* *2*PI + Phase*PI/180.0)

您可以使用 IDCompositionAnimation::AddSinusoidal 方法,將 sinusoidal 區段新增至動畫函式。

重複區段

重複區段會重複動畫函式的指定前面部分。 重複區段會導致動畫函式的指定部分無限期迴圈,直到遇到下一個區段或到達動畫的指定結尾為止。 動畫的上一部分是由其他區段所組成,包括其他重複區段。 重複區段不能當做動畫函式中的第一個區段使用。

下圖顯示一個動畫函式,每個區段各包含兩個三次方段 4 秒的持續時間,後面接著一個持續 12 秒的重複區段。 重複區段會在動畫中開始 8 秒,並重複動畫的前 6 秒兩次,直到結束區段達到 20 秒為止。

diagram of an animation function that contains two cubic segments and one repeat segment

若要將重複區段新增至動畫函式,請使用 IDCompositionAnimation::AddRepeat 方法。

結束區段

從區段建構動畫函式之後,您可以附加結束區段,讓動畫函式在特定時間結束。 如果您未附加結束區段,動畫函式的最後一個區段會無限期執行。

您可以藉由呼叫 IDCompositionAnimation::End 方法附加結束區段,並指定動畫函式開頭的位移,以指出函式的結束點。 位移必須大於前一個區段的開始位移。 此外,結束區段不能當做動畫函式中的第一個基本類型使用。

當您呼叫 End時,也會為要產生動畫效果的屬性指定最終值。 當到達動畫函式的結束點時,屬性會設定為指定的最終值。

附加結束區段之後,您無法將任何其他區段附加至動畫函式。 也就是說,除了 IDCompositionAnimation::Reset以外,動畫物件上的所有方法呼叫都會失敗。 呼叫 Reset 會傳回動畫物件,以清除動畫函式不包含任何區段的狀態,此時您可以再次新增區段。

與Windows動畫管理員的相容性

Windows動畫管理員 (Windows動畫) 以與 DirectComposition API 相容的格式輸出動畫基本類型。 這表示 DirectComposition 可以根據Windows動畫所建立的動畫基本類型來建立動畫。

如需詳細資訊,請參閱Windows動畫管理員IUIAnimationVariable2::GetCurve方法,以及使用 Windows Animation Manager v2 管理 DirectComposition 動畫

DirectComposition 概念