##7.1 View動畫
(1)android動畫分為view動畫、幀動畫和屬性動畫,屬性動畫是API 11(Android 3.0)的新特性,幀動畫一般也認為是view動畫。
(2)`AnimationSet`的屬性`android:shareInterpolator`表示集合中的動畫是否共享同一個插值器,如果集合不指定插值器,那么子動畫需要單獨指定所需的插值器或者使用默認值。
(3)自定義動畫需要繼承`Animation`抽象類,并重新它的`initialize`和`applyTransformation`方法,在initialize方法中做一些初始化工作,在applyTransformation方法中進行相應的矩陣變換,很多時候需要采用`Camera`類來簡化矩陣變換的過程。
(4)幀動畫使用比較簡單,但是容易引起OOM,所以在使用的時候應盡量避免使用過多尺寸較大的圖片。
##7.2 view動畫的特殊使用場景
(1)布局動畫(`LayoutAnimation`)屬性分析
~~~
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/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添加切換動畫效果,但是往往有兼容性限制,參見[《Android群英傳》第七章Android動畫機制與使用技巧](http://hujiaweibujidao.github.io/blog/2015/11/27/Android-Heros-Reading-Notes-3/)。
## 7.3 屬性動畫
(1)屬性動畫可以對任意對象的屬性進行動畫而不僅僅是view,動畫默認的時間間隔是`300ms`,默認幀率是`10ms/幀`。
(2)屬性動畫幾乎是無所不能,但是它是從API 11才有的,所以存在兼容性問題,可以考慮使用開源動畫庫[nineoldandroids](http://nineoldandroids.com/)。它的功能和系統原生的`android.animations.*`中的類的功能完全一致,使用方法也是完全一樣,只要我們用nineoldandroids編寫動畫,那么就能運行在所有的android系統上。
(3)屬性`android:repeatMode`表示動畫的重復模式,`repeat`表示連續重復播放,`reverse`表示逆向重復播放,也就是第一次播放完后第二次倒著播放動畫,第三次還是重頭開始播放動畫,第四次再倒著播放,以此類推。
(4)插值器和估值器:屬性動畫實現非勻速動畫的重要手段
時間插值器(`TimeInterpolator`)的作用是根據時間流逝的百分比計算出當前屬性值改變的百分比,系統內置的插值器有線性插值器(`LinearInterpolator`)、加速減速插值器(`AccelerateDecelerateInterpolator`)和減速插值器(`DecelerateInterpolator`)。
類型估值器(`TypeEvaluator`)的作用是根據當前屬性改變的百分比計算出改變后的屬性值,系統內置的估值器有`IntEvaluator`、`FloatEvaluator`和`ArgbEvaluator`。
(5)動畫監聽器
`AnimatorListener`:監聽動畫的開始、結束、取消以及重復播放;
`AnimatorUpdateListener`:監聽動畫的整個過程,動畫每播放一幀的時候`onAnimationUpdate`方法就會被回調一次。
(6)對任意屬性做動畫的方法:封裝原始對象或者`ValueAnimator`
(7)屬性動畫的工作原理:屬性動畫需要運行在有Looper的線程中,反射調用get/set方法
## 7.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)硬件加速:使用動畫的過程中,建議開啟硬件加速,這樣會提高動畫的流暢性。
其他學習資料
1.[Android樣式的開發:View Animation篇](http://keeganlee.me/post/android/20151003)
2.[Android樣式的開發:Property Animation篇](http://keeganlee.me/post/android/20151026)
- 前言
- 讀書筆記(1)第1章 Activity的生命周期和啟動模式
- 讀書筆記(2)第2章 IPC機制
- 讀書筆記(3)第3章 View的事件體系
- 讀書筆記(4)第4章 View的工作原理
- 讀書筆記(5)第5章 理解RemoteViews
- 讀書筆記(6)第6章 Android的Drawable
- 讀書筆記(7)第7章 Android動畫深入分析
- 讀書筆記(8)第8章 理解Window和WindowManager
- 讀書筆記(9)第9章 四大組件的工作過程
- 讀書筆記(10)第10章 Android的消息機制
- 讀書筆記(11)第11章 Android的線程和線程池
- 讀書筆記(12)第12章 Bitmap的加載和Cache
- 讀書筆記(13)第13章 綜合技術