【Android】の基礎——Animation

Animation

Android的動畫主要分爲三種:
1. View Animation視圖動畫(Tween Animation補間動畫)
2. Drawable Animation 幀動畫
3. Property Animation 屬性動畫

View Animation視圖動畫(補間動畫)

對一個View進行簡單變換(位置、大小、旋轉、透明度)。
關鍵類:
1. AnimationSet:Animation的容器,盛放一系列Animation。
2. AlphaAnimation:Animation的子類,透明度漸變動畫。
3. RotateAnimation:Animation的子類,旋轉動畫。
4. ScaleAnimation:Animation的子類,大小縮放動畫。
5. TranslateAnimation:Animation的子類,位移動畫。
每種動畫都有多個參數需要設置,設置後要添加到AnimationSet對象中。
補間動畫執行之後並未改變View的真實佈局屬性值。
這種動畫可以通過java或者xml實現。

6.插值器Interpolator:定義了動畫變化的速率

Drawable Animation幀動畫

一幀一幀地顯示動畫,類似幻燈片。
可以使用xml或者java方式實現幀動畫,用xml比較方便。

<animation-list> 必須是根節點,包含一個或者多個<item>元素,屬性有:

android:oneshot true代表只執行一次,false循環執行。
<item> 類似一幀的動畫資源。
<item> animation-list的子項,包含屬性如下:

android:drawable 一個frame的Drawable資源。
android:duration 一個frame顯示多長時間。

LayoutAnimationController:可以處理 一個界面中的多個控件,動畫方式相同,但是每個控件完成該動畫的時刻不同。

Property Animation屬性動畫

控件的屬性值改變實現的動畫。

使用屬性動畫時,被改變的對象必須實現由該屬性的get和set方法。如果沒有會出現問題,這就需要我們給對象加上get、set方法或者說包裝起來提供set和get方法。(當然,如果不通過ObjectAnimator,通過ValueAnimator監聽動畫過程可以自己實現屬性的改變)

插值器和估值器

  1. 插值器
    本質是時間的函數,定義了動畫的變化規律(提前/延遲執行默認的時間點來達到加速/減速的效果!)
  2. 估值器
    估值器的是用來決定屬性的計算方式,最終使用反射機制來改變屬性變化

通過插值器和估值器可以實現非勻速動畫。

屬性動畫原理

先說ValueAnimator(ObjectAnimator的父類):
通過ValueAnimator的AnimatorUpdateListener可以得到動畫執行每一幀所返回的值

ofInt或ofFloat方法提供的values最終都被包裝成一個PropertyValuesHolder

在ValueAnimator中操作的都是valuesHolder對象

同時也把傳入的每一個數據值包裝成了一個Keyframe,而KeyframeSet則是在PropertyValueHolder初始化的。

屬性動畫逐幀更新都是由handler不斷髮生消息來實現的

在handler逐幀更新代碼中,anim.animationFrame(currentTime),是計算動畫執行過程中值的變化的

animationValue方法通過插值器重新計算一個fraction
真正屬性值的計算是交給PropertyValuesHolder.calculateValue(float fraction)計算,之前我們看到傳進來的values值已經被PropertyValuesHolder包裝並保存起來了,那麼現在我們就可以利用到這些值來進行計算了

這樣每一幀都會計算出當前進度的animationValue,而我們根據AnimatorUpdateListener就可以獲取每一幀計算過後animationValue值了。

ObjectAnimator與ValueAnimator只有3個地方不同

  1. 提供了Object對象,以及對象的propertyName
  2. 重寫initAnimation方法,額外初始化了對應屬性的set和get方法
  3. 重寫animateValue,把每一幀計算的到的中間值通過set方法傳入對象屬性中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章