多屬性變化
給同一個(gè)View實(shí)現(xiàn)同一個(gè)動(dòng)畫效果(同時(shí)變化x和y)轿曙,有下面三種方法。
方法一:用多個(gè)ObjectAnimator對象
ObjectAnimator animX = ObjectAnimator.ofFloat(myView, "x", 50f);
ObjectAnimator animY = ObjectAnimator.ofFloat(myView, "y", 100f);
AnimatorSet animSetXY = new AnimatorSet();
animSetXY.playTogether(animX, animY);
animSetXY.start();
方法二:用一個(gè)ObjectAnimator對象加多個(gè)PropertyValuesHolder
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();
方法三:用ViewPropertyAnimator
myView.animate().x(50f).y(100f);
這三種方法中值得一提的是后兩種方法膜钓,其中ViewPropertyAnimator的使用請參見Android屬性動(dòng)畫完全解析(下)米者,Interpolator和ViewPropertyAnimator的用法中最后一部分的講解“聘現(xiàn)在來講講PropertyValuesHolder嫉嘀。
PropertyValuesHolder
PropertyValuesHolder這個(gè)類可以先將動(dòng)畫屬性和值暫時(shí)的存儲起來,后一起執(zhí)行,在有些時(shí)候可以使用替換掉AnimatorSet灯抛,減少代碼量金赦。
主要方法如下:
public static PropertyValuesHolder ofFloat(String propertyName, float... values)
public static PropertyValuesHolder ofInt(String propertyName, int... values)
public static PropertyValuesHolder ofObject(String propertyName, TypeEvaluator evaluator,Object... values)
public static PropertyValuesHolder ofKeyframe(String propertyName, Keyframe... values)
關(guān)鍵幀
關(guān)鍵幀這個(gè)概念是從動(dòng)畫里學(xué)來的,我們知道視頻里对嚼,一秒要播放24幀圖片夹抗,對于制作flash動(dòng)畫的同學(xué)來講,是不是每一幀都要畫出來呢纵竖?當(dāng)然不是了漠烧,如果每一幀都畫出來,那估計(jì)做出來一個(gè)動(dòng)畫片都得要一年時(shí)間靡砌;比如我們要讓一個(gè)球在30秒時(shí)間內(nèi)已脓,從(0,0)點(diǎn)運(yùn)動(dòng)到(300,200)點(diǎn)通殃,那flash是怎么來做的呢度液,在flash中,我們只需要定義兩個(gè)關(guān)鍵幀画舌,在動(dòng)畫開始時(shí)定義一個(gè)堕担,把球的位置放在(0,0)點(diǎn);在30秒后曲聂,再定義一個(gè)關(guān)鍵幀照宝,把球的位置放在(300,200)點(diǎn)句葵。在動(dòng)畫 開始時(shí),球初始在是(0兢仰,0)點(diǎn)乍丈,30秒時(shí)間內(nèi)就adobe flash就會(huì)自動(dòng)填充,把球平滑移動(dòng)到第二個(gè)關(guān)鍵幀的位置(300把将,200)點(diǎn)轻专; 通過上面分析flash動(dòng)畫的制作原理,我們知道察蹲,一個(gè)關(guān)鍵幀必須包含兩個(gè)原素请垛,第一時(shí)間點(diǎn),第二位置洽议。即這個(gè)關(guān)鍵幀是表示的是某個(gè)物體在哪個(gè)時(shí)間點(diǎn)應(yīng)該在哪個(gè)位置上宗收。 所以谷歌的KeyFrame也不例外,KeyFrame的生成方式為:
Keyframe kf0 = Keyframe.ofFloat(0, 0);
Keyframe kf1 = Keyframe.ofFloat(0.1f, -20f);
Keyframe kf2 = Keyframe.ofFloat(1f, 0);
上面生成了三個(gè)KeyFrame對象亚兄,其中KeyFrame的ofInt函數(shù)的聲明為:
public static Keyframe ofFloat(float fraction, float value)
fraction:表示當(dāng)前的顯示進(jìn)度混稽,即從加速器中g(shù)etInterpolation()函數(shù)的返回值;
value:表示當(dāng)前應(yīng)該在的位置
比如Keyframe.ofFloat(0, 0)表示動(dòng)畫進(jìn)度為0時(shí),動(dòng)畫所在的數(shù)值位置為0匈勋;Keyframe.ofFloat(0.25f, -20f)表示動(dòng)畫進(jìn)度為25%時(shí)礼旅,動(dòng)畫所在的數(shù)值位置為-20;Keyframe.ofFloat(1f,0)表示動(dòng)畫結(jié)束時(shí)洽洁,動(dòng)畫所在的數(shù)值位置為0痘系; 在理解了KeyFrame.ofFloat()的參數(shù)以后,我們來看看PropertyValuesHolder是如何使用KeyFrame對象的:
public static PropertyValuesHolder ofKeyframe(String propertyName, Keyframe... values)
propertyName:動(dòng)畫所要操作的屬性名
values:Keyframe的列表饿自,PropertyValuesHolder會(huì)根據(jù)每個(gè)Keyframe的設(shè)定汰翠,定時(shí)將指定的值輸出給動(dòng)畫。
所以完整的KeyFrame的使用代碼應(yīng)該是這樣的:
Keyframe frame0 = Keyframe.ofFloat(0f, 0);
Keyframe frame1 = Keyframe.ofFloat(0.1f, -20f);
Keyframe frame2 = Keyframe.ofFloat(1, 0);
PropertyValuesHolder frameHolder = PropertyValuesHolder.ofKeyframe("rotation",frame0,frame1,frame2);
Animator animator = ObjectAnimator.ofPropertyValuesHolder(mImage,frameHolder);
animator.setDuration(1000);
animator.start();
第一步:生成Keyframe對象璃俗;
第二步:利用PropertyValuesHolder.ofKeyframe()生成PropertyValuesHolder對象
第三步:ObjectAnimator.ofPropertyValuesHolder()生成對應(yīng)的Animator