WPF中的動畫 (一)基本概念

2021-09-19 21:04:03 字數 1585 閱讀 8375

原文:

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 資料項 線性結構 元素之間的關係為一對一 圖形...