Android View体系(三)属性动画
上一篇文章講了View滑動(dòng)的六種方法,其中一種是使用動(dòng)畫(huà),這篇文章我們來(lái)講一講動(dòng)畫(huà)的其中一種:屬性動(dòng)畫(huà)。
1.android視圖動(dòng)畫(huà)和屬性動(dòng)畫(huà)
視圖動(dòng)畫(huà)我們都了解,它提供了AlphaAnimation,RotateAnimation,TranslateAnimation,ScaleAnimation四種動(dòng)畫(huà)方式,并提供了AnimationSet動(dòng)畫(huà)集合來(lái)混合使用多中動(dòng)畫(huà)。隨著android3.0屬性動(dòng)畫(huà)的推出,視圖動(dòng)畫(huà)就不再風(fēng)光,相比屬性動(dòng)畫(huà)視圖動(dòng)畫(huà)非常大的缺陷是不具有交互性,當(dāng)某個(gè)元素發(fā)生視圖動(dòng)畫(huà)后,其響應(yīng)事件的位置依然在動(dòng)畫(huà)前的地方,所以視圖動(dòng)畫(huà)只能做普通的動(dòng)畫(huà)效果,避免交互的發(fā)生。但是它的優(yōu)點(diǎn)也非常明顯:效率比較高使用也方便。
2.android屬性動(dòng)畫(huà)
由于android3.0之前已有的動(dòng)畫(huà)框架Animation存在一些局限性:動(dòng)畫(huà)改變的只是顯示,并不能響應(yīng)事件。因此,在android3.0之后,谷歌就推出了新的動(dòng)畫(huà)框架,幫助開(kāi)發(fā)者實(shí)現(xiàn)更加豐富的動(dòng)畫(huà)效果。
在Animator框架中使用最多的就是AnimatorSet和ObjectAnimator配合,使用ObjectAnimator進(jìn)行更精細(xì)化的控制,控制一個(gè)對(duì)象和一個(gè)屬性值,而使用多個(gè)ObjectAnimator組合到AnimatorSet形成一個(gè)動(dòng)畫(huà)。屬性動(dòng)畫(huà)通過(guò)調(diào)用屬性get,set方法來(lái)真實(shí)地控制了一個(gè)View的屬性值,因此強(qiáng)大的屬性動(dòng)畫(huà)框架,基本可以實(shí)現(xiàn)所有的動(dòng)畫(huà)效果。
ObjectAnimator
ObjectAnimator是屬性動(dòng)畫(huà)最重要的類(lèi),創(chuàng)建一個(gè)ObjectAnimator只需通過(guò)他的靜態(tài)工廠類(lèi)直接返還一個(gè)ObjectAnimator對(duì)象。參數(shù)包括一個(gè)對(duì)象和對(duì)象的屬性名字,但這個(gè)屬性必須有g(shù)et和set函數(shù),內(nèi)部會(huì)通過(guò)java反射機(jī)制來(lái)調(diào)用set函數(shù)修改對(duì)象的屬性值。
來(lái)看看平移動(dòng)畫(huà)是如何實(shí)現(xiàn)的:
通過(guò)ObjectAnimator 的靜態(tài)工廠方法,創(chuàng)建一個(gè)ObjectAnimator 對(duì)象,第一個(gè)對(duì)象是要操作的View,第二個(gè)參數(shù)則是要操縱的屬性,最后一個(gè)參數(shù)是一個(gè)可變的數(shù)組參數(shù),需要傳進(jìn)去一個(gè)該屬性變化的一個(gè)取值的過(guò)程,這里設(shè)置了一個(gè)參數(shù),變化到200。與視圖動(dòng)畫(huà)一樣,也可以給屬性動(dòng)畫(huà)設(shè)置顯示時(shí)長(zhǎng),差值器等屬性。在使用ObjectAnimator的時(shí)候,有一個(gè)非常重要,那就是是要操縱的屬性必須要有g(shù)et,set方法,不然ObjectAnimator 就無(wú)法起效。下面就是一些常用的可以直接使用的屬性動(dòng)畫(huà)的屬性值:
- translationX和translationY:這兩個(gè)屬性作為增量控制View對(duì)象從他的布局容器的左上角開(kāi)始位置。
- rotation、rotationX、rotationY:這三個(gè)屬性控制View對(duì)象圍繞它的支點(diǎn)進(jìn)行2D和3D旋轉(zhuǎn)。
- PrivotX和PrivotY:控制View對(duì)象的支點(diǎn)位置,圍繞這個(gè)支點(diǎn)進(jìn)行旋轉(zhuǎn)和縮放變換處理。默認(rèn)該支點(diǎn)位置就是View對(duì)象的中心點(diǎn)。
- alpha:透明度,默認(rèn)是1(不透明),0代表完全透明。
- x和y:描述View對(duì)象在它容器中的最終位置,它是最初的做上角坐標(biāo)和translationX,translationY值的累計(jì)的和。
如果一個(gè)屬性沒(méi)有g(shù)et,set方法,也可以通過(guò)自定義一個(gè)屬性類(lèi)或則包裝類(lèi)來(lái)間接地給這個(gè)屬性增加get和set方法。來(lái)看看如何通過(guò)包裝類(lèi)的方法給一個(gè)屬性增加get和set方法:
private static class MyView{private View mTarget;private MyView(View mTarget){this.mTarget=mTarget;}public int getWidth(){return mTarget.getLayoutParams().width;}public void setWidth(int width){mTarget.getLayoutParams().width=width;mTarget.requestLayout();} } View Code使用時(shí)只需要操縱包類(lèi)就可以調(diào)用get,set方法:
MyView mMyView=new MyView(mButton); ObjectAnimator.ofInt(mMyView,"width",500).setDuration(500).start(); View CodeValueAnimator
ValueAnimator不提供任何動(dòng)畫(huà)效果,它更像一個(gè)數(shù)值發(fā)生器,用來(lái)產(chǎn)生一定規(guī)律數(shù)字,從而讓調(diào)用者來(lái)控制動(dòng)畫(huà)的實(shí)現(xiàn)過(guò)程。通常情況下,在ValueAnimator的AnimatorUpdateListener中監(jiān)聽(tīng)數(shù)值的變化,從而完成動(dòng)畫(huà)的變換:
ValueAnimator mValueAnimator=ValueAnimator.ofFloat(0,100); mValueAnimator.setTarget(view); mValueAnimator.setDuration(1000).start(); mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {Float mFloat=(Float)animation.getAnimatedValue();}});} View Code動(dòng)畫(huà)的監(jiān)聽(tīng)
完整的動(dòng)畫(huà)具有start,Repeat,End,Cancel四個(gè)過(guò)程:
ObjectAnimator animator=ObjectAnimator.ofFloat(view,"alpha",1.5f);animator.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}});} View Code大部分時(shí)候我們只關(guān)心onAnimationEnd事件,android也提供了AnimatorListenterAdaper來(lái)讓我門(mén)選擇必要的事件進(jìn)行監(jiān)聽(tīng):
ObjectAnimator animator=ObjectAnimator.ofFloat(view,"alpha",1.5f);animator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);} }); View Code組合動(dòng)畫(huà)-AnimatorSet
這個(gè)類(lèi)提供了一個(gè)play()方法,如果我們向這個(gè)方法中傳入一個(gè)Animator對(duì)象(ValueAnimator或ObjectAnimator)將會(huì)返回一個(gè)AnimatorSet.Builder的實(shí)例,AnimatorSet.Builder中包括以下四個(gè)方法:
- after(Animator anim) 將現(xiàn)有動(dòng)畫(huà)插入到傳入的動(dòng)畫(huà)之后執(zhí)行
- after(long delay) 將現(xiàn)有動(dòng)畫(huà)延遲指定毫秒后執(zhí)行
- before(Animator anim) 將現(xiàn)有動(dòng)畫(huà)插入到傳入的動(dòng)畫(huà)之前執(zhí)行
- with(Animator anim) 將現(xiàn)有動(dòng)畫(huà)和傳入的動(dòng)畫(huà)同時(shí)執(zhí)行
組合動(dòng)畫(huà)-PropertyValuesHolder
除了上面AnimatorSet類(lèi)還可以使用PropertyValuesHolder類(lèi)來(lái)實(shí)現(xiàn)組合動(dòng)畫(huà),不過(guò)這個(gè)組合動(dòng)畫(huà)就沒(méi)有上面的豐富了,使用PropertyValuesHolder類(lèi)只能多個(gè)動(dòng)畫(huà)一起執(zhí)行。當(dāng)然我們得結(jié)合 ObjectAnimator.ofPropertyValuesHolder(Object target,
PropertyValuesHolder… values);方法來(lái)使用。第一個(gè)參數(shù)是動(dòng)畫(huà)的目標(biāo)對(duì)象,之后的參數(shù)是PropertyValuesHolder類(lèi)的實(shí)例,可以有多個(gè)這樣的實(shí)例。代碼如下:
xml中使用屬性動(dòng)畫(huà)
和視圖動(dòng)畫(huà)一樣,屬性動(dòng)畫(huà)也可以直接寫(xiě)在xml中:
在res文件中新建animator文件,在里面新建一個(gè)scale.xml,里面的內(nèi)容如下:
程序中引用xml定義的屬性動(dòng)畫(huà)
Animator animator=AnimatorInflater.loadAnimator(this,R.animator.scale); animator.setTarget(view); animator.start(); View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/ganchuanpu/p/6034338.html
總結(jié)
以上是生活随笔為你收集整理的Android View体系(三)属性动画的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 12种高效率热门编程语言,你会用几个?
- 下一篇: Android游戏开发笔记(一)