原文:
wpf中的動畫——(一)基本概念
也就是說,我們要產生動畫,只需要連續重新整理介面即可。例如,我們要實現乙個寬度變化的按鈕的動畫,可以用如下方式來實現:
privatevoidmainwindow_loaded(objectsender, routedeventargse)
intindex = 0;
privatevoidontimedevent(objectsender, eventargse)
這段**雖然實現了動畫效果,但它是通過計時器更新的傳統做法,在winform下也能實現。在wpf中,正統的實現動畫方式為:
privatevoidmainwindow_loaded(objectsender, routedeventargse)
;button.beginanimation(widthproperty, widthanimation);
}相比較而言,wpf的動畫的實現方式有如下優點:
一、簡潔
這個是非常明顯的,wpf的動畫的**非常容易理解,timer的版本則要難懂得多。當然,我們也可以通過封裝,使得用timer也能用類似的api實現動畫。但動畫的api並不是僅僅這麼一點,要把整個動畫框架的api都封裝也沒有那麼容易。
二、和xaml無縫整合
這個就是wpf的獨有技術了,得益於xaml強大的表述能力,我們可以寫出非常強大且容易維護的動畫。(這裡就不舉例了,後續文章中再做介紹)這點winfom的timer版本是無法做到的。
三、流暢性
如果將這兩種實現方式一起跑起來比較一下就會發現,timer實現的版本明顯要卡頓,並且並沒有精準的按照我們設計的那樣運動。具體原因為:
timer精度的問題:由於是改ui控制項的屬性(按鈕的寬度),因此必須在ui執行緒上進行,因此dispatchertimer 操作與其他操作一樣需要放置到 dispatcher 佇列中,它並不保證恰好在改時間間隔中。它並不適合動畫這種間隔很短的計時。
幀率的問題:逐幀動畫的流暢性一般取決於每秒更新的幀數,也就是常說的幀率。人眼睛上限是70幀,而我這裡**中的timer的固定了為20幀,因此是能明顯感覺到卡頓的。而wpf的動畫則不然,從它的api中可以看到,它是沒有幀率的設定的。實際上,它是根據計算機的效能和當前程序的繁忙程度盡可能增大幀率的,因此wpf的動畫是遠大於20幀的,因此要流暢得多。
那麼,是否只要修改引數,加大timer的版本的幀率,也可以實現同樣流暢的動畫呢? 試了一下,就算修改引數,也是無法達到wpf版本的流暢程度的。我認為原因主要有如下兩點,
dispatchertimer精度不夠,無法實現大幀率下準確重新整理。
通過簡單的設定引數很難像wpf那樣幀率根據計算機的效能和當前程序的繁忙程度智慧型匹配幀率。幀率設定過低,動畫不流暢,設定過大,處理不過來仍然不流暢。並且ui執行緒的忙碌程度是會動態變化的,幀率也需要相應調整,這些都無法通過timer來簡單的處理。
總之,通過timer定時更新的方式並不適合用來實現動畫。因此還是有必要學習一下wpf的動畫框架的,後面我將陸續寫一系列文章進行一些簡單的介紹。如果要系統的學習,建議參看以下微軟的官方文件:
WPF資源的基本概念
wpf資源系統是一種保管一系列物件 如常用的畫刷 樣式或模版 的簡單辦法,從而更容易地復用這些物件。wpf允許在 中以及在標記中的各個位置定義資源 和特定的控制項 視窗一起定義,或在整個應用程式中定義 資源具有如下優點。高效。定義好資源可以在多個地方復用。可維護性。易於修改。適應性。可以動態修改。資...
一 Spark中的基本概念
2 driver 表示main 函式,建立sparkcontext。由sparkcontext負責與clustermanager通訊,進行資源的申請,任務的分配和監控等。程式執行完畢後關閉sparkcontext 5 task 在executor程序中執行任務的工作單元,多個task組成乙個stag...
一 基本概念
資料 程式的操作物件,用於描述客觀事物 資料元素 組成資料的基本單位 資料項 乙個資料元素由若干個資料項組成 資料物件 性質相同的資料元素的集合 陣列,鍊錶 struct person 一種資料型別 int main void 資料項 p1.age 0 資料項 線性結構 元素之間的關係為一對一 圖形...