星期六, 1月 21, 2012

Animation (三)

Android應用程式學習筆記

How Property Animation Works

首先,我們就用一個簡單的例子說明動畫的運行,圖一描繪了一個假想的物件,針對它的X屬性的動畫,顯示在屏幕的水平的位置。動畫時間設定為40毫秒且行程距離40像素,每10毫秒物件水平移動10像素,在40毫秒時,動畫結束,物件停在水平位置40的地方。這是一個線性插補的動畫例子,意味著物件以等速移動。

圖一 線性動畫

你也可以指定動畫有非線性的插補,圖二說明了假想物件在動畫開始時加速,在動畫結束時減速。物件仍是在40毫秒內移動40像素,但視為非線性地,在動畫開始,動畫加速到半途的位置,接著減速直到動畫結束,圖二顯示物件在開始與結束時的行程距離比在行程中間少。

圖二 非線性動畫

接著讓我們來看看屬性動畫系統如何計算項以上動畫的細節,圖三說明動畫的主要類別。

圖三 動畫的計算

ValueAnimator物件保存你的動畫的時序,比如動畫的時間長度及動畫的屬性。
ValueAnimator物件封裝了一個TimeInterpolator,它定義了動畫的插補,及一個TypeEvaluator,它定義了如何計算動畫中的屬性數值。例如圖二中的例子,TimeInterpolator為AccelerateDecelerateInterpolator且TypeEvaluator為IntTypeEvaluator。

啟動一個動畫,建立一個ValueAnimator並給定動畫的起始數值與結束數值,當你呼叫start()方法時動畫開始。在整個動畫中,ValueAnimator根據動畫的時間與以動畫的時間計算elapsed fraction,elapsed fraction介於0與1之間,elapsed fraction顯示動畫完成的時間比例,0表示0%;1表示100%。例如圖一,在時間10毫秒時,elapsed fraction為0.25,因為動畫的總時間為40毫秒。

當ValueAnimator正在計算elapsed fraction時,它會呼叫TimeInterpolator去計算Interpolated fraction,一個Interpolated fraction映射一個elapsed fraction為新的fraction。比如圖二,因為動畫為慢慢加速,在10毫秒時,interpolated fraction為0.15,比起elapsed fraction為0.25小,圖一,interpolated fraction與elapsed fraction一直相同。

當interpolated fraction已計算出來,ValueAnimator呼叫適當的TypeEvaluator,根據interpolated fraction計算動畫的屬性數值,起始的數值,結束的數值。舉例,圖一,在10毫秒時interpolated fraction為0.15,所以屬性數值在此時間時為0.15*(40 - 0),或者6。



沒有留言:

張貼留言