動畫詳解
參考:https://www.jianshu.com/p/2fcd4e734a01
三種動
-
1.視圖動畫(view Animation)
-
2.幀動畫()
-
3.屬性動畫
插值器(Interpolator)與估值器(TypeEvaluator)
面試題
- 1.幀動畫在使用時需要注意什麼?
通過動畫可以實現一些比較絢麗的效果,但是在使用過程中,也需要注意一些事情,主要分爲下面幾類。
1.OOM問題
這個問題主要出現在幀動畫中,當圖片數量較多且圖片較大時就容易出現OOM,這個在實際開發中尤其注意,儘量避免使用幀動畫。
2.內存泄漏
在屬性動畫中有一類無線循環的動畫,這類動畫需要在Activity退出時及時停止,否則將會導致Activity無法釋放從而造成內存泄漏,通過驗證後發現View動畫並不存在此問題。
3.兼容性問題
動畫在3.0以下的系統上有兼容性問題,在某些特殊場景可能無法正常工作,因此要做好適配工作。
4.View動畫的問題
View動畫是對View的影像做動畫,並不是真正地改變View地狀態,因此有時會出現動畫完成後View無法隱藏地現象,即setVisibility(View.GONE)失效了,這個時候只要調用view.clearAnimation()清楚View動畫即可解決此問題。
5.不要使用px
在進行動畫的過程中,要儘量使用dp,使用px會導致在不同的設備上有不同的效果。
6.動畫元素的交互
將view平移後,在Andre 3.0以前的系統上,不管是View動畫還是屬性動畫,新位置均無法交互,同時老位置仍然可以觸發單擊事件。儘管View以及在視覺上不存在了,將View移回原位以後,原位置的單擊事件繼續生效。從3.0開始,屬性動畫的單擊事件觸發爲止爲移動後的位置,但是View動畫仍然在原位置。
7.硬件加速
使用動畫的過程中,建議開啓硬件加速,這樣會提高動畫的流暢性。
- 2.View動畫和屬性動畫的區別?
View動畫執行之後並未改變View的真實佈局屬性值。切記這一點,譬如我們在Activity中有一個 Button在屏幕上方,我們設置了平移動畫移動到屏幕下方然後保持動畫最後執行狀態呆在屏幕下方,這時如果點擊屏幕下方動畫執行之後的Button是沒 有任何反應的,而點擊原來屏幕上方沒有Button的地方卻響應的是點擊Button的事件。
屬性動畫彌補了View動畫的缺陷,你可以爲一個對象的任意屬性添加動畫,對象自己的屬性會被真的改變;當對象的屬性變化的時候,屬性動畫會自動刷新屏幕;屬性動畫改變的是對象的真實屬性,而且屬性動畫不止用於View,還可以用於任何對象。
- 3.屬性動畫出現的版本和原因(或者關於屬性動畫的其他問題)?
出現的版本:Android 3.0(API 11)後才提供的一種全新動畫模式,出現原因爲作用對象侷限於View,沒有改變View的屬性,只是改變視覺效果,動畫效果單一。
屬性動畫簡單說明(二類三方):
二類:ValueAnimator、ObjectAnimator是其重要的兩個類。
三方:ValueAnimator有ofInt、ofFloat、ofObject三個重要的方法
三個方法的作用:
1.創建動畫實例
2.將傳入的多個參數進行平滑過渡:此處傳入0和1,表示將值從0平滑過渡到1 ,如果傳入了3個Int參數 a,b,c ,則是先從a平滑過渡到b,再從b平滑過渡到c,以此類推,他們內置了估值器
插值器和估值器:
插值器(Interpolator):決定值的變化模式
估值器(TypeEvaluator):決定值的具體變化數值
- 4.動畫能組合在一起使用麼?
可以將動畫組合在一起使用AnimatorSet,
AnimatorSet.play() 播放當前動畫的同時可以
.with() :將現有動畫和傳入的動畫同時執行
.after() :將現有動畫插入到傳入的動畫之後執行
.before() : 將現有動畫插入到傳入的動畫之前執行
- 5.ObjectAnimator需要操作的view的屬性(Property)有
1、Alpha 控制View的透明度
2、float TranslationX 控制X方向的位移
3、float TranslationY 控制Y方向的位移
4、float ScaleX 控制X方向的縮放倍數
5、float ScaleY 控制Y方向的縮放倍數
6、float Rotation 控制以屏幕方向爲軸的旋轉度數
7、float RotationX 控制以X軸爲軸的旋轉度數
8、float RotationY 控制以Y軸爲軸的旋轉度數
- 6.補間動畫都有哪些(Tween動畫有哪些|怎麼旋轉、平移、縮放、透明度)?
補間動畫由Animation類來實現具體效果,
包括平移(TranslateAnimation)、
縮放(ScaleAnimation)、
旋轉(RotateAnimation)、
透明度(AlphaAnimation)
四個子類,四種變化。
- 7.項目實現過哪些動畫、怎麼實現的?
幀動畫、補間動畫、屬性動畫都用過
例如下拉刷新時頭佈局裏我們使用了幀動畫
頁面裏有個彈出窗口使用了補間動畫,還加入了BounceInterpolator插值器的效果
[ 進度條 ] 使用了屬性動畫
- 8.Android動畫原理
Animation框架定義了透明度,旋轉,縮放和位移幾種常見的動畫,而且控制的是整個View
實現原理是每次繪製視圖時View所在的ViewGroup中的drawChild函數獲取該View的Animation的Transformation值然後調用canvas.concat(transformToApply.getMatrix()),通過矩陣運算完成動畫幀,如果動畫沒有完成,繼續調用invalidate()函數,啓動下次繪製來驅動動畫
動畫過程中的幀之間間隙時間是繪製函數所消耗的時間,可能會導致動畫消耗比較多的CPU資源,最重要的是,動畫改變的只是顯示,並不能相應事件
- 9.插值器用過沒(插值器的種類有哪些|怎麼自定義插值器)?
插值器決定值的變化模式,默認的種類有九個。
默認種類有:
AccelerateDecelerateInterpolator :在動畫開始與結束的地方速率改變比較慢,在中間的時候加速
AccelerateInterpolator:在動畫開始的地方速率改變比較慢,然後開始速率變化加快
LinearInterpolator:以常量速率改變
AnticipateInterpolator:開始的時候向後然後向前甩
CycleInterpolator:動畫循環播放特定的次數,速率改變沿着正弦曲線
PathInterpolator:動畫執行的效果按貝塞爾曲線
anticipateOvershootInterpolator:開始的時候向後然後向前甩一定值後返回最後的值
OvershootInterpolator:向前甩一定值後再回到原來位置
BounceInterpolator:動畫結束的時候有彈起效果
自定義插值器:
寫一個類實現Interpolator接口,Interpolator是一個空的接口繼承了TimeInterpolator接口,定義getInterpolation方法即可