Android 的動(dòng)畫(huà)分為三類(lèi): 幀動(dòng)畫(huà)、補(bǔ)間動(dòng)畫(huà)于置、屬性動(dòng)畫(huà)茧吊; 而動(dòng)畫(huà)的效果分為四類(lèi):透明度、旋轉(zhuǎn)八毯、平移搓侄、縮放;
我們要學(xué)習(xí)的屬性動(dòng)畫(huà)话速,在Android3.0之后推出讶踪,幫助開(kāi)發(fā)者實(shí)現(xiàn)更加豐富的動(dòng)畫(huà)效果;屬性動(dòng)畫(huà)改編了3.0之前動(dòng)畫(huà)框架Animation存在的一些局限性----動(dòng)畫(huà)只改變顯示泊交,不改變點(diǎn)擊效果乳讥,(意思就是,我把一個(gè)button從a左邊移動(dòng)到了b坐標(biāo)廓俭,但是我們點(diǎn)擊b坐標(biāo)的按鈕沒(méi)有效果云石,還需要去點(diǎn)擊a坐標(biāo)才會(huì)響應(yīng)點(diǎn)擊事件,這就給我們?cè)斐闪撕芏嗖槐匾穆闊?/p>
在Animator框架中研乒,我們使用最多的就是AnimatorSet 和ObjectAnimator配合汹忠,使用ObjectAnimator精細(xì)化控制,只控制一個(gè)對(duì)象的一個(gè)屬性值雹熬,然后組合到AnimatorSet行成一個(gè)動(dòng)畫(huà) 宽菜;
最重要的是: 屬性動(dòng)畫(huà)通過(guò)調(diào)用屬性的get、set方法來(lái)真實(shí)的控制view的屬性值竿报,因此強(qiáng)大的屬性動(dòng)畫(huà)框架铅乡,基本可以實(shí)現(xiàn)所有的動(dòng)畫(huà)效果;
ObjectAnimator
ObjectAnimator animator = ObjectAnimator.ofFloat(view , "translationX", 300 );
animator.setDuration(300);
animator.start();
這是一個(gè)簡(jiǎn)單的平移操作烈菌,調(diào)用ObjectAnimator 的靜態(tài)工廠方法阵幸,創(chuàng)建一個(gè)對(duì)象,第一個(gè)參數(shù)就是我們要控制的view僧界,第二個(gè)參數(shù)就是要進(jìn)行操控的屬性侨嘀,第三個(gè)參數(shù)是可變數(shù)組參數(shù),這里我們只設(shè)置了一個(gè)300 捂襟,即向右平移300;
PropertyValuesHolder
PropertyValuesHolder propertyValuesHolder1 = PropertyValuesHolder.ofFloat("translationX", 400);
PropertyValuesHolder propertyValuesHolder2 = PropertyValuesHolder.ofFloat("alpha", 0.5f);
PropertyValuesHolder propertyValuesHolder3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);
PropertyValuesHolder propertyValuesHolder4 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
ObjectAnimator.ofPropertyValuesHolder(view,propertyValuesHolder1, propertyValuesHolder2,
propertyValuesHolder3, propertyValuesHolder4).setDuration(1000).start();
PropertyValuesHolder 類(lèi)似動(dòng)畫(huà)中的AnimationSet ,在屬性動(dòng)畫(huà)中欢峰,如果針對(duì)同一個(gè)對(duì)象的多個(gè)屬性葬荷,要同時(shí)控制多種動(dòng)畫(huà)涨共, 可以通過(guò)PropertyValuesHolder 來(lái)實(shí)現(xiàn)。
ValueAnimator
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,100);
valueAnimator.setTarget(v);
valueAnimator.setDuration(1000).start();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float value =(Float) animation.getAnimatedValue();
//TODO use the value
}
});
ValueAnimator 在屬性動(dòng)畫(huà)中占有非常重要的地位宠漩, (雖然我并沒(méi)有感受到0.0)举反,
ValueAnimator 本身 不提供任何動(dòng)畫(huà)效果,一段代碼寫(xiě)完扒吁,屏幕點(diǎn)碎了火鼻,沒(méi)見(jiàn)什么動(dòng)靜,真是糟心暗癖馈魁索;
ValueAnimator 的一般使用方法是在AnimatorUpdateListener中監(jiān)聽(tīng)數(shù)值的變化 ,從而完成動(dòng)畫(huà)的變化盼铁;
AnimatorSet
ObjectAnimator animator1 = ObjectAnimator.ofFloat(v, "translationX", 300);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(v, "scaleX", 1f, 0, 1f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(v, "scaleY", 1f, 0, 1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(1000);
animatorSet.playTogether(animator1, animator2, animator3);
animatorSet.start();
對(duì)于一個(gè)屬性同事作用多個(gè)屬性動(dòng)畫(huà)效果粗蔚, 前面已經(jīng)用PropertyValuesHolder 實(shí)現(xiàn)過(guò)了,但是呢饶火,請(qǐng)廣大彩民同志注意了鹏控,"playTogether",顧名思義肤寝,AnimatorSet不僅能實(shí)現(xiàn)這樣的效果当辐,還可以精確的控制動(dòng)畫(huà)執(zhí)行的順序;
AnimaotrSet正是通過(guò) playTogether()鲤看、playSequentially()缘揪、animSet.play().with()、before()刨摩、after()這些方法來(lái)控制多個(gè)動(dòng)畫(huà)的協(xié)同工作方式寺晌;
what ? 什么意思? 百度澡刹!