Android之屬性動畫初步

Android動畫系統包括View animation和Property animation,也就是視圖動畫和屬性動畫,屬性動畫有API限制,必須在API 11以上使用,不過有個開源項目NineOldAndroids,實現了對API 11以前版本的支持。
  視圖動畫相對於屬性動畫來講簡單一些,只能對view作移動、旋轉、縮放等處理。舉例來講作View移動的效果,視圖發生時改變View在屏幕上的繪製位置,但與這個View相關的屬性值卻不會改變,因此會發現響應點擊事件還在原來的位置上,也就是看上去變了,實際上根還在原來的地方;而屬性動畫改變的是實際的屬性值,也就是View位置發生變化了,他的相關屬性值也確實發生了改變。並且屬性動畫能夠改變已有的屬性類型,還能夠改變自定義的類型,也就是說屬性動畫是一種廣義的動畫系統,用於表現一種連續變化的過程,而不單單是視圖上的物理變化。

屬性動畫

  屬性動畫主要涉及Animator、TimeInterpolator、TypeEvaluaor這三個概念。若是把屬性動畫看做一臺機器,那麼Animator就是其中的發動機。它定義了屬性動畫最基本的操做,ValueAnimator是它的子類,實現了動畫發生的具體計算過程。值得注意的是,ValueAnimator只負責動畫過程當中屬性值得計算,具體獲得這個變化的值如何處理ValueAnimator並不關心,因此須要使用者主動去獲取計算好的屬性值。

ValueAnimator提供了三種默認支持的值類型,int、float和表示顏色的argb型。例如:html

ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);  
animation.setDuration(1000);  
animation.start();
要獲得動畫發生過程當中的值須要給ValueAnimator設置一個監聽器ValueAnimator.AnimatorUpdateListener。

animation.addUpdateListener(new AnimatorUpdateListener() {  
    public void onAnimationUpdate(ValueAnimator animator) {  
        Float value = (Float) animator.getAnimatedValue();  
    }  
})
這樣就能夠獲得整個動畫過程產生的中間值。
  中間值的計算涉及到兩個方面,一個是插值器函數,也就是對應的Interpolator,表示程度隨時間的變化狀況,好比勻速、加速,或者先加速後減速等;另外一個是中間值的計算函數,對應到TypeEvaluator,這是一個接口,裏面有evaluate(float fraction, T startValue, T endValue)方法須要實現,對通常的值計算方法都是startValue + fraction * (endValue - startValue),也有特殊的好比顏色值,用一個int表示了argb,計算的時候就要先分解計算再合成,但對於每一個份量的計算任然遵照上面的規則,具體能夠看ArgbEvaluator的源文件。
  ValueAnimator除了上面的默認值類型,還支持自定義類型Object,對於自定義類型,使用者須要實現該類型對應的TypeEvaluator,以下
ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);  
animation.setDuration(1000);  
animation.start();
屬性動畫要對View起做用須要將每次改變的屬性值設置到相應的View上,上面提到ValuAnimator只負責中間值的計算,而沒有後面這個值的設置過程,爲了更方便地運用,ObjectAnimator這個類誕生了,它繼承了ValueAnimator,並在內部實現了設置到View屬性上的邏輯。

ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);  
anim.setDuration(1000);  
anim.start();
其中foo是屬性值所屬的一個具體對象,好比一個view,alpha是屬性名稱,ObjectAnimator要求必須有屬性名稱對應到set和get方法,如上面例子要求foo對應到類必須有setAlpha()和getAlpha()這兩個方法。對於View來講設置view的alpha值會觸發invalidate而重繪,所以就看到了連續的動畫效果。
相關文章
相關標籤/搜索