Android屬性動畫

前言

Property Animation是Android3.0引入的一種功能強大的動畫系統。它除了可以給普通的View添加動畫效果外,還可以給對象添加效果。另外,Property Animation與Tween Animation一個最大的區別是Property Animation更改是對象的實際屬性,而後者只是View的繪製效果,比如一個Button實現一個移動的動畫效果,如果使用Tween Animation 的話,Button 的點擊位置並不會隨着動畫的移動效果兒移動。換句話說在新位置Button是可能沒有點擊事件的。使用Property Animation可以設置下面的一些動畫特性:

  • Duration: 動畫之間的間隔

  • Time interpolation: 屬性值的變化方式,可以表示爲動畫的事件函數,例如線性動畫,加速動畫等等。

  • Repeat count and behavior: 動畫的重複次數和重複方式。

  • Animation sets: 動畫集合

  • Frame refresh delay: 幀刷新間隔,默認是10ms,但具體的速度依賴於系統的繁忙程度。

屬性動畫的工作原理

圖1描繪了一個假象的對象x屬性的動畫,它給出了該對象在屏幕水平方法的位置,在40ms內改對象移動了40個像素。每10ms記錄一次對象移動的像素,這個動畫是的Time interpolation是liearinterpolation,表明動畫是以恆定的速度移動的。

圖1

在Property Animation中,ValueAnimator是其核心類,它記錄了動畫自身的一些屬性值。圖2是其工作流程:

圖2

動畫在整個過程中,會根據我們當初設置的TimeInterpolator和TypeEvaluator的計算方式計算出不通的屬性值,從而不斷的改變屬性值的大小,就會產生各式各樣的動畫效果。

下面就通過一個實例理解一下什麼是TimeInterpolator和TypeEvaluator.

  • TimeInterpolator

TimeInterpolator翻譯過來是插值器,插值器定義了動畫變化中的屬性變化規則,它根據時間比例因子計算出一個插值因子,那麼什麼是時間比例因子呢,簡單講就是:


時間比例因子 = 動畫已執行的時間 / 動畫執行的總時間


而插值因子,用於設定動畫是線性變化,還是非線性變化等千萬中變化,你可以通過實現TimeInterpolator來實現自己的插值器(在>sdk22可以繼承抽象類BaseInterpolator)。Android中默認的定義很多的插值器:

  1. AccelerateDecelerateInterpolator

    在開始和結束時速度較慢

  2. AccelerateInterpolator

    加速變化

  3. LinearInterpolator

    勻速變化

更多的插值器,可以在這裏查看.


//自定義插值器
class MyInterpolator implements TimeInterpolator{


    @Override
    public float getInterpolation(float input) {
        //自定義的規則
        return 0;
    }
}



  • TypeEvaluator

TypeEvaluator是根據插值因子去計算屬性值,Android默認可以識別的類型爲int, float和顏色,分別是

IntEvalutor, FloatEvalutor, ArgbEvaluator.

  1. IntEvalutor

    計算整數型

  2. FloatEvalutor

    計算浮點型

  3. ArgbEvaluator

    計算顏色屬性




//自定義TypeEvaluator
class MyTypeEvaluator implements TypeEvaluator<Ball>{


    @Override
    public Ball evaluate(float fraction, Ball startValue, Ball endValue) {
        //自己的規則
        return null;
    }
}

下面以三個小球的旋轉效果爲例,瞭解一下屬性動畫的整個實現過程。

效果圖

源碼可以看這裏

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