Property Animation - 概述和工作原理


概述


     在Android中,屬性動畫系統是一個強健的框架,幾乎允許你讓一切東西動起來。你可以定義一個動畫,隨着時間的改變來改變任何一個對象的屬性的值,不用去管它是否繪製在屏幕上。一個屬性動畫可以在一個指定的時間長度內改變一個屬性的值。爲了讓一些東西動起來,你需要指定好對象的屬性(例如一個對象在屏幕上的位置),你想讓它運動多久和你想讓它在什麼值區間運動。

     在Android屬性動畫系統中,我們可以爲一個動畫定義以下一些特性:

     持續時間:你可以爲一個動畫指定持續時間。默認的持續時間是300ms.

     時間插補:你可以根據動畫目前的運行時間來指定屬性的值如何計算

     重複次數和行爲:你可以指定一個動畫完成後是否重複和重複的次數。你也可以指定動畫反着運動,並且重複次數完成爲止

     動畫集:你可以把一些動畫組成一個含邏輯的集合,一起或順序或指定延遲後運動

     幀率:你可以指定一個動畫幀率。默認是每10ms一幀,但是在你的應用中動畫播放的幀率是依賴於系統的整體繁忙程度和系統底層的計時器服務情況
     

屬性動畫的工作原理     



     首先讓我們來看一個簡單的示例動畫,圖1描繪了一個以x屬性運動的假想對象,x屬性代表了它在屏幕上水平方向上的位置。這個x屬性動畫的持續時間是40ms,要完成的距離是40像素。每一幀刷新的頻率是10ms,每切換一幀移動10像素。40ms過後,動畫停止,運動的對象就在水平方向40像素的地方。這是一個線性插值的動畫,這意味着對象以一個恆定的速度移動。
  Figure 1. Example of a linear animation   

     在Android屬性動畫系統中,你也可以指定一個不是線性插值的動畫。圖2就示例了一個假想的對象,前半部分進行加速運動,在動畫的後半部分進行減速運動。但依然是用40ms移動了40像素,顯然不是線性勻速的。在開始和末尾單位時間內移動的都很慢,但在中間部分卻移動的很快。

Figure 2. Example of a non-linear animation

     現在就讓我們來詳細的瞭解下Android的屬性動畫系統計算動畫的重要組成部分。圖3描述了主要的類之間的合作關係

Figure 3. How animations are calculated   

    ValueAnimator 會跟蹤動畫的過程,例如它知道動畫播放多久了,還有屬性每一時刻的值。

    ValueAnimator 在內部封裝了一個 TimeInterpolator , TimeInterpolator 定義了動畫的插值,並且還封裝了一個TypeEvaluator ,TypeEvaluator 定義了動畫播放過程中怎麼去計算屬性的值。例如,在圖2中,TimeInterpolator 用的可能是AccelerateDecelerateInterpolator  ,TypeEvaluator 用的可能是IntEvaluator

     爲了開始一個動畫,你需要創建一個ValueAnimator 並且爲你需要運動的屬性設置起始和結束值和動畫持續的時間。當你調用start()  時,意味着動畫開始了。在動畫的整個過程中, ValueAnimator  會實時計算一個完成分數,取值爲0到1,這個計算依賴於動畫持續的時間和已經運動的時間。完成分數代表了動畫運動了多長時間。例如,在圖1中(注意是勻速),在t=10ms處完成分數就是0.25,因爲持續時間是t=40ms 

     當ValueAnimator  計算好完成分數後,就會去調用目前設置的 TimeInterpolator 來計算一個插值分數。一個插值分數在充分考慮設置的時間插值下會把完成分數映射到一個新的分數。例如,在圖2中(非勻速),因爲動畫在慢慢的加速,在t=10ms處,插值分數爲0.15(6/40),小於完成分數0.25。在圖1中,插值分數和完成分數一直都是相等的。

     當插值分數計算完成後,ValueAnimator 會去調用適當的TypeEvaluator 來計算屬性的值,基於插值分數,開始值和動畫結束時候的值。例如,在圖2中,在t=10ms處插值分數爲0.15,所以在t=10ms處屬性的值爲 0(startPos)+0.15 * (40 - 0) =  6

     在API Demos中,com.example.android.apis.animation 包爲我們介紹瞭如何來使用Android的屬性動畫系統。

屬性動畫和視圖動畫的區別  



     視圖動畫系統只爲我們提供了視圖動畫的能力,所以如果你想動畫非視圖對象,你只有自己編寫代碼來實現了。視圖動畫侷限於一些實際情況,視圖只有一些方面能用於進行動畫,比如縮放和旋轉,但背景顏色不行。

     視圖動畫的另外一個缺點是隻有繪製在屏幕上的視圖才能夠進行動畫,並且不是視圖本身。例如,如果你想讓一個button在屏幕移動,移動後button是能夠在正確的座標上繪製,但是實際在屏幕上你能點擊的地方(還在移動之前的位置)並沒有發生變化,所以你需要實現自己的邏輯來處理這種情況。
     
     在屬性動畫系統中,這些限制是完全不存在的,你可以動畫任何對象的任何屬性,並且對象本身也會被修改。屬性動畫能以更強健的方式進行。在一個高版本中,你可以爲你想要修改的幾個屬性都指定動畫器,例如顏色啊,位置啊,或者大小,一塊兒改變,並且能夠同時定義動畫的幾個方面,例如插值和同步多個動畫器
     
     但是視圖動畫系統也有一些優點,如花費更少的時間來設置和編寫更少的代碼就能實現。如果視圖動畫能完成任何一件你希望做的事,或者如果你的現有的代碼已經按你所希望的方式工作了,那麼就沒有必要去使用屬性動畫系統。有的時候也有意義同時使用兩種動畫系統,如果出現這樣的用例的話












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章