天天看點

WPF 動畫 學習筆記1

基于時間的動畫

假如需要旋轉windows窗體應用程式中的About對話框中的一塊文本,下面是建構該解決方案的傳統方法

1.建立一個周期性觸發的計時器 ,50毫秒觸發一次

2.當觸發計時器時,使用事件處理程式計算一些與動畫相關的細節,如新的旋轉角度,然後使窗體的一部分或者整個窗體失效

3.不久以後,windows将會要求視窗重新繪制界面,觸發自定義的繪圖代碼

4.自定義的繪圖代碼之後,渲染旋轉之後的文本

即使沒有WPF動畫支援,也可以簡化旋轉文本示例,這是因為WPF提供了一個保留的圖形模型,該模型確定當視窗發生變化時能夠自動重新渲染,這意味着不需要關心無效好重繪自身的情況,而通過下面的步驟就可以實作

1.建立一個周期性觸發的計時器(wpf提供了一個在使用者界面線程上工作的system.windows.threading.dispatcher.timer計時器)

2.當計時器觸發的時候,使用事件處理程式計算一些與動畫相關的細節,如新的旋轉角度,然後修改相應元素

3.wpf會注意到對視窗中的元素所進行的修改,然後重新繪制并緩存新的視窗内容

盡管這是一個改進,但是基于計時器的動畫依然存在一些缺點,它導緻代碼不是很靈活,對于複雜的效果會變得非常混亂,并且不能得到最佳的性能,而WPF則提供了一個更加進階的模型,通過該模型可以隻關注動畫的定義,而不擔心他們的渲染方式,這個模型基于依賴項屬性基礎架構

基于屬性的動畫

動畫通常被視為一系列的幀,為了執行動畫就要逐幀的顯示這些幀,就像定格的視訊,WPF動畫使用了一個完全不同的模型,本質是那個,WPF動畫隻不過實在一段時間間隔内修改依賴項屬性值的一種方式

例如為了增大和縮小一個按鈕,可以在一個動畫中需改按鈕的寬度,為了使按鈕閃爍,可以修改用于按鈕背景的LinearGradientBrush畫刷的屬性,建立正确動畫的秘密在于決定需要修改什麼屬性

如果希望實作不能通過修改一個屬性實作的其他變化,那麼上述方法就行不通,例如,不能将添加或删除元素作為動畫的一部分,同樣,不能要求WPF在開始場景和結束場景之間執行過度,最後隻能為依賴項屬性應用動畫,因為隻有依賴項屬性使用動态的屬性識别系統,而該系統将動畫考慮在内。

但在許多情況下,基于屬性的動畫系統不能工作,作為一個經驗法則,基于屬性的動畫系統是為普通windows應用程式添加動态效果的非常好的方式,然而如果需要作為應用程式的核心目标部分使用的動畫,并且希望動畫在應用程式的整個聲明周期中持續運作,可能需要wpf低級的基于幀的渲染支援。

基本動畫

wpf動畫的第一條規則----每個動畫依賴于一個依賴項屬性,号還有另一個限制:需要有一個支援該資料類型的動畫類,例如button.width屬性屬性雙精度資料類型,為了實作屬性的動态化,需要使用doubleAnimation類,但Button.Padding屬性使用的是Thickness結構,是以它需要一個ThicknessAnimation類。

這一需要不像wpf動畫的第一條規則那麼絕對,第一條規則将動畫局限于依賴項屬性,這是因為對于沒有相應動畫類的依賴項屬性,為了為該屬性應用動畫,可以針對相應的資料類型建立自己的動畫類,但是你會發現system.windows.media.animation名稱空間已經為希望使用的大多數資料類型提供了動畫類

因為需要資料類型實際上不使用動畫,是以沒有相應的動畫類,一個主要的例子是枚舉,例如,可以使用HorizontalAlignment屬性控制如何在布局面闆中放置一個元素,該屬性使用的是HorizontalAlignment枚舉值,然而,HorizontalAlignment枚舉隻允許從4個值中選擇一個left right center 和 stretch,這極大的限制了它在動畫中的使用,盡管可以在一個方向和其他方向之間進行交換,但是不能将一個元素從一種對齊方式平滑過度當另外一種對齊方式,是以,沒有為HorizontalAlignment資料類型提供動畫類,可以自己為HorizontalAlignment資料類型建構一個動畫,但是仍然要受到4個枚舉數值的限制

引用類型通常不能應用動畫類,但他們的子屬性可以,例如,所有内容控件都支援Background屬性,進而可以設定一個Brush對象用于繪制背景,很少使用動畫從一個畫刷切換到另一個畫刷,但是可以使用動畫改變畫刷的屬性,例如SolidColorBrush畫刷的Color屬性(使用ColorAnimation類)或者改變LinearGradientBrush畫刷中的GradientStop對象的Offset屬性(使用DoubleAnimation類),這擴充了WPF動畫的應用範圍,允許使用者為元素外觀的特定方面應用動畫

Animation類

有兩種類型的動畫-------在一個開始值和結束值之間以逐漸增加的方式(被稱為線性插值過程)改變屬性的動畫

                                         以及從一個值突然變成另一個值的動畫

然而當改變特定的資料類型時,如String和引用類型的對象,插值是沒有意義的,這些資料類型使用一種稱為關鍵幀動畫的技術在特定時刻從一個值突然改變到另一個值

所有關鍵幀動畫類都使用“類型名+AnimationUsingKeyFrames”的形式進行命名,如StringAnimationUsingKeyFrames和ObjectAnimationUsingKeyFrames

某些資料類型有關鍵幀動畫類,但是沒有插值動畫類,例如可以使用關鍵幀為一個字元串應用動畫,但是不能應用插值為字元串應用動畫,然而所有資料類型都支援關鍵幀動畫,除非它們根本不支援動畫,

((((換句話說 ,所有具有(使用插值)正常動畫類(例如DoubleAnimation和ColorAnimation)的資料類型,也有一個相應的用于關鍵幀動畫的動畫類型如(DoubleAnimationUsingKeyFrames和ColorAnimationUsingKeyFrames))))))

‘’

實際上還有一種動畫類型,這種類型的動畫是基于路徑動畫,并且它比使用插值或關鍵幀的動畫更加專業,基于路徑的動畫類使用“類型名+AnimationUsingPath”的形式進行命名,如DoubleAnimationUsingPath和PointAnimationUsingPath

盡管目前WPF可以為動畫使用三種方法(線性插值,關鍵幀以及路徑)但是也完全可以建立更多的使用完全不同的方式來修改的動畫類,唯一要求的是自定義的動畫類必須根據時間修改值

總之,在System.windows.Media.Animation名稱空間中将會發現以下内容:

17個“類型名+Animation”類,這些類使用插值

22個“類型名+AnimationUsingKeyFrames”類,這些類使用關鍵幀動畫

3個“類型名+AnimationUsingPath”類,這些類使用基于路徑的動畫

所有這些動畫類都繼承自抽象的“類型名+AnimationBase”類

繼續閱讀