動畫種類
1咧七、View動畫:View動畫支持四種動畫效果,分別是旋轉任斋、平移继阻、縮放、透明度(?只能實現(xiàn)四種動畫效果废酷,而且會有點擊事件失效的問題)穴翩。
2、幀動畫:通過順序播放一系列圖像從而產生動畫效果(如果播放的圖片尺寸過大容易造成OOM)锦积。
3、屬性動畫:通過動態(tài)地改變對象的屬性值達到動畫效果(可以對任意對象的屬性進行動畫而不僅僅是View)歉嗓。
屬性動畫
1丰介、ValueAnimator:是屬性動畫中的核心類,其作用是在一段時間內不斷對值進行改變(值的動畫)鉴分,實現(xiàn)值與值之間的動畫過渡哮幢,同時還能管理動畫的播放次數(shù)、播放模式志珍、設置動畫監(jiān)聽器等橙垢,通常結合AnimatorUpdateListener監(jiān)聽器并在回調方法onAnimatorUpdate()中獲取最新的屬性值,把屬性值作用于具體的對象上就能實現(xiàn)對象的動畫效果了伦糯。 ValueAnimator是非常靈活的實現(xiàn)柜某,它只操作屬性值本身,這個屬性值并不屬于某個具體對象敛纲,但卻能用于任何對象上喂击。
2、ObjectAnimator:是ValueAnimator的子類淤翔,其作用是可以直接對任意對象的任意屬性進行動畫操作翰绊,實現(xiàn)屬性值改變的同時可以作用于任意的具體的對象上,突破了View動畫只能作用View的限制旁壮。一般通過靜態(tài)工廠的方法來創(chuàng)建监嗜,主要有四個參數(shù):作用的對象、作用的屬性抡谐、初始值裁奇、目標值。
3麦撵、AnimatorSet:可以把多個動畫組合到一起
插值器Interpolator:根據(jù)時間流逝的百分比來計算當前屬性值改變的百分比框喳;也就是說插值器可以確定動畫的已執(zhí)行時間占總時間的百分比课幕。系統(tǒng)內置的有:線性插值器(勻速動畫)、加速減速插值器(動畫兩頭慢中間快)五垮、減速插值器(動畫越來越慢)乍惊。
估值器TypeEvaluator:根據(jù)當前屬性值改變的百分比來計算改變后的屬性值;也就是說估值器可以確定動畫在一段時間內某個時間點的屬性值放仗。系統(tǒng)內置的有:IntEvaluator(整型屬性)润绎、FloatEvaluator(浮點型屬性)、ArgbEvaluator(Color屬性)诞挨。通過evaluate()方法來計算屬性值莉撇,該方法有三個參數(shù):已執(zhí)行時間占總時間的百分比、屬性值的初始值惶傻、屬性值的最終值棍郎。
AnimatorListener:可以監(jiān)聽動畫的開始、結束银室、取消涂佃、重復播放
AnimatorUpdateListener:可以監(jiān)聽動畫的整個過程,因為動畫由許多幀組成蜈敢,所以每播放一幀就會執(zhí)行回調方法
屬性動畫的原理:屬性動畫要求作用的對象屬性提供該屬性的get()和set()方法辜荠,并設置該屬性的初始值和最終值,多次調用set()方法不斷改變屬性值抓狭,直到屬性值達到最終值伯病,從而實現(xiàn)動畫效果。
總結:如果想讓屬性動畫生效否过,必須滿足以下兩個條件:
(1)對象必須提供set()方法午笛,如果沒有設置初始值,還需要提供get()方法讓系統(tǒng)自動獲取初始值(如果不滿足則直接Crash掉)
(2)對象的set()方法對屬性所做的改變必須能帶來UI上的改變(如果不滿足則無動畫效果但不會Crash)
如果設置的屬性無效苗桂,可以通過以下方法解決
(1)給對象加上get()和set()方法季研,如果有權限的話
(2)用一個類來包裝原始對象,間接提供get()和set()方法
(3)使用ValueAnimator讓初始值改變到最終值誉察,并在實現(xiàn)AnimatorUpdateListener接口与涡,監(jiān)聽每一幀的動畫實現(xiàn)對屬性的改變
使用動畫需要注意的地方
1、OOM問題:盡量避免使用幀動畫
2持偏、內存泄漏:應及時關閉循環(huán)播放的動畫
3驼卖、兼容性問題:可以使用第三方庫進行Android3.0以下版本的適配
4、動畫的交互問題:在Android3.0之前的版本鸿秆,將View平移后酌畜,不管是View動畫還是屬性動畫都無法對View移動后的位置進行點擊事件的響應,但是原始位置可以響應點擊事件卿叽,在3.0以后的版本桥胞,View動畫依然無法響應恳守,但是屬性動畫改進了這一點
5、硬件加速:可以開啟硬件加速贩虾,提高動畫的流暢性
參考
《Android開發(fā)藝術探索》 第7章 Android動畫深入分析
《Android開發(fā)進階:從小工到專家》 第2章 View與動畫