本文結(jié)合一些周知的概念和源碼片段,對(duì)View動(dòng)畫的工作原理進(jìn)行挖掘和分析。以下不是對(duì)源碼一絲不茍的分析過程,只是以搞清楚Animation的執(zhí)行過程、如何被周期性調(diào)用為目標(biāo)粗略分析下相關(guān)方法的執(zhí)行細(xì)節(jié),最終貫穿View動(dòng)畫實(shí)際發(fā)生的一切。
View動(dòng)畫使用
Android提供了屬性動(dòng)畫(property animation)、幀動(dòng)畫(frame-by-frame animation)和View動(dòng)畫( tweened animation:補(bǔ)間動(dòng)畫),View動(dòng)畫的使用相對(duì)簡(jiǎn)單,但又不像真正意義上的動(dòng)畫那樣對(duì)View產(chǎn)生有效的影響。
在從某些方面開始分析View動(dòng)畫的工作原理之前,先來回顧一下使用View動(dòng)畫相關(guān)的細(xì)節(jié)。
step 1. 準(zhǔn)備Animation對(duì)象
可以通過xml或者代碼生成一個(gè)Animation對(duì)象。
通常是建議使用xml來定義動(dòng)畫的,這樣有更好的閱讀性、獨(dú)立性和復(fù)用性,不過最終的,通過AnimationUtils.loadAnimation()加載一個(gè)xml動(dòng)畫以后,得到的就是一個(gè)Animation對(duì)象。
不同動(dòng)畫對(duì)象有它的專有參數(shù)需要設(shè)置,一般的,需要設(shè)置一些所有動(dòng)畫公共的重要屬性,對(duì)應(yīng)方法如setFillAfter、setDuration、setRepeatMode和setInterpolator等。
例如下面的代碼創(chuàng)建了一個(gè)在600ms內(nèi)沿著Y軸向下移動(dòng)300像素的位移動(dòng)畫:
TranslateAnimation anim = new TranslateAnimation(0, 0, 0, 300); anim.setDuration(600); anim.setFillAfter(true);
step 2. 執(zhí)行動(dòng)畫
通常會(huì)調(diào)用View.startAnimation立即開啟動(dòng)畫,它里面