Android動畫深入分析

joytoy發表於2021-09-09

1 View動畫

(1)android動畫分為view動畫、幀動畫和屬性動畫,屬性動畫是API 11(Android 3.0)的新特性,幀動畫一般也認為是view動畫。
(2)AnimationSet的屬性android:shareInterpolator表示集合中的動畫是否共享同一個插值器,如果集合不指定插值器,那麼子動畫需要單獨指定所需的插值器或者使用預設值。
(3)自定義動畫需要繼承Animation抽象類,並重新它的initializeapplyTransformation方法,在initialize方法中做一些初始化工作,在applyTransformation方法中進行相應的矩陣變換,很多時候需要採用Camera類來簡化矩陣變換的過程。
(4)幀動畫使用比較簡單,但是容易引起OOM,所以在使用的時候應儘量避免使用過多尺寸較大的圖片。

2 view動畫的特殊使用場景

(1)佈局動畫(LayoutAnimation)屬性分析

<layoutAnimation
    xmlns:android=""
    android:delay="0.5"
    android:animationOrder="reverse"
    android:animation="@anim/anim_item"/>


android:delay:表示子元素開始動畫的時間延遲,比如子元素入場動畫的時間週期是300ms,那麼0.5表示每個子元素都需要延遲150ms才能播放入場動畫。

給ViewGroup指定LayoutAnimation的兩種方式

//xml
android:layoutAnimation="xxx"
//java
Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_item);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
listView.setLayoutAnimation(controller);


(2)Activity切換效果
在startActivity方法後或者finish方法之後呼叫overridePendingTransition(int inAnim, int outAnim)方法設定進入或者退出的動畫效果。
還有其他方式可以給Activity新增切換動畫效果,但是往往有相容性限制,參見。

3 屬性動畫

(1)屬性動畫可以對任意物件的屬性進行動畫而不僅僅是view,動畫預設的時間間隔是300ms,預設幀率是10ms/幀
(2)屬性動畫幾乎是無所不能,但是它是從API 11才有的,所以存在相容性問題,可以考慮使用開源動畫庫。它的功能和系統原生的android.animations.*中的類的功能完全一致,使用方法也是完全一樣,只要我們用nineoldandroids編寫動畫,那麼就能執行在所有的android系統上。
(3)屬性android:repeatMode表示動畫的重複模式,repeat表示連續重複播放,reverse表示逆向重複播放,也就是第一次播放完後第二次倒著播放動畫,第三次還是重頭開始播放動畫,第四次再倒著播放,以此類推。
(4)插值器和估值器:屬性動畫實現非勻速動畫的重要手段
時間插值器(TimeInterpolator)的作用是根據時間流逝的百分比計算出當前屬性值改變的百分比,系統內建的插值器有線性插值器(LinearInterpolator)、加速減速插值器(AccelerateDecelerateInterpolator)和減速插值器(DecelerateInterpolator)。
型別估值器(TypeEvaluator)的作用是根據當前屬性改變的百分比計算出改變後的屬性值,系統內建的估值器有IntEvaluatorFloatEvaluatorArgbEvaluator
(5)動畫監聽器
AnimatorListener:監聽動畫的開始、結束、取消以及重複播放;
AnimatorUpdateListener:監聽動畫的整個過程,動畫每播放一幀的時候onAnimationUpdate方法就會被回撥一次。
(6)對任意屬性做動畫的方法:封裝原始物件或者ValueAnimator
(7)屬性動畫的工作原理:屬性動畫需要執行在有Looper的執行緒中,反射呼叫get/set方法

4 使用動畫的注意事項

(1)OOM:儘量避免使用幀動畫,使用的話應儘量避免使用過多尺寸較大的圖片;
(2)記憶體洩露:屬性動畫中的無限迴圈動畫需要在Activity退出的時候及時停止,否則將導致Activity無法釋放而造成記憶體洩露。view動畫不存在這個問題;
(3)相容性問題:某些動畫在3.0以下系統上有相容性問題;
(4)view動畫的問題:view動畫是對view的影像做動畫,並不是真正的改變view的狀態,因此有時候動畫完成之後view無法隱藏,即setVisibility(View.GONE)失效了,此時需要呼叫view.clearAnimation()清除view動畫才行。
(5)不要使用px;
(6)動畫元素的互動:在android3.0以前的系統上,view動畫和屬性動畫,新位置均無法觸發點選事件,同時,老位置仍然可以觸發單擊事件。從3.0開始,屬性動畫的單擊事件觸發位置為移動後的位置,view動畫仍然在原位置;
(7)硬體加速:使用動畫的過程中,建議開啟硬體加速,這樣會提高動畫的流暢性。

原文連結:http://www.apkbus.com/blog-705730-60430.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4650/viewspace-2816094/,如需轉載,請註明出處,否則將追究法律責任。

相關文章