Android动画之Property属性动画
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
?
為什么引入屬性動畫?
大家都知道Android常見的動畫有tween動畫,frame動畫。但是隨著人們對動畫的要求不斷提高,上述兩種方式已經(jīng)不能實現(xiàn)一些復(fù)雜的動畫效果,所以在3.0(API 11)以后提供了另外的一種強(qiáng)大的動畫——屬性動畫。所謂的屬性動畫,即可以改變對象的屬性來實現(xiàn)動畫,比如tween動畫實現(xiàn)平移效果,但是對象的變化過程中的動畫卻無法實現(xiàn),屬性動畫可以在實現(xiàn)動畫的過程中改變對象的某些屬性來實現(xiàn)復(fù)雜的動畫,某種意義上講,屬性動畫可以替代tween動畫。tween動畫有一定的局限性,動畫完成以后雖然改變了原來的位置,但是這時候你去點擊對象是不會觸發(fā)點擊事件的,因為tween動畫只是改變了原來對象的位置,相當(dāng)于重繪了一次。但是控件的實際位置還是原來的位置。屬性動畫就很好的解決了這一問題,屬性動畫改變的是空間的屬性信息來實現(xiàn)動畫效果的。
ValueAnimator?
ValueAnimator是屬性動畫的一個核心類之一。ValueAnimator完成了動畫從初始值到結(jié)束值之間的計算過程,我們只需要給出變化的初始值和結(jié)束值即可,當(dāng)然他還可以設(shè)置動畫的播放模式、播放次數(shù)、設(shè)置監(jiān)聽器等。下面我們來看一下他的使用方法。
ValueAnimator?anim?=?ValueAnimator.ofFloat(0f,?1f);?? anim.setDuration(300);?? anim.start();代碼很簡單,首先利用ofFloat設(shè)置了動畫的初始值和結(jié)束值,表示動畫從0到1的變化過程,當(dāng)然可以傳入多個值,例如ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f,2f,3f);表示動畫從0到1,再到2再到3的過程。然后設(shè)置了持續(xù)時間,也就是300毫秒內(nèi)從0到1。那到底0到1的過程是不是隨時變化的呢,我們來設(shè)置一個監(jiān)聽函數(shù)來打印一下log。
ValueAnimator?anim?=?ValueAnimator.ofFloat(0f,?1f);?? anim.setDuration(300);?? anim.addUpdateListener(new?ValueAnimator.AnimatorUpdateListener()?{??@Override??public?void?onAnimationUpdate(ValueAnimator?animation)?{??float?currentValue?=?(float)?animation.getAnimatedValue();??Log.d("TAG",?"cuurent?value?is?"?+?currentValue);??}?? });?? anim.start();通過添加addUpdateListener來監(jiān)聽動畫過程中的變化情況,Log打印:
除了ofFloat()以外還有ofInt()、ofObject()方法。
ObjectAnimator
ObjectAnimator相對ValueAnimator更常用一些,他可以具體到對某個VIEW的動畫操作,比如實現(xiàn)對一個控件的平移旋轉(zhuǎn)等操作。
ObjectAnimator?animator?=?ObjectAnimator.ofFloat(textview,?"rotation",?0f,?360f);?? animator.setDuration(5000);?? animator.start();上述代碼實現(xiàn)了對一個textview旋轉(zhuǎn)360度的動畫,當(dāng)然下面這段代碼實現(xiàn)了透明度從1到0再到1的 變化。
ObjectAnimator?animator?=?ObjectAnimator.ofFloat(textview,?"alpha",?1f,?0f,?1f);當(dāng)然我們還可以傳入“translationY”Y軸平移;“translationX”X軸平移;"scaleX"X軸放大;"scaleY"Y軸放大
?組合動畫
有了單個的動畫,當(dāng)然也可以把他們組合起來使用。把它們組合起來就要用到AnimatorSet這個類了,這個類有一個play()方法,傳入一個Animator(ObjectAnimator或ValueAnimator)對象,返回一個AnimatorSet.Builder實例,實例包含下面四個方法:
after(Animator anim) ? 將現(xiàn)有動畫插入到傳入的動畫之后執(zhí)行
after(long delay) ? 將現(xiàn)有動畫延遲指定毫秒后執(zhí)行
before(Animator anim) ? 將現(xiàn)有動畫插入到傳入的動畫之前執(zhí)行
with(Animator anim) ? 將現(xiàn)有動畫和傳入的動畫同時執(zhí)行
有了這四個方法就可以對動畫進(jìn)行組合使用了。比如我們要實現(xiàn)同時旋轉(zhuǎn)透明度在平移之后進(jìn)行,代碼如下:
ObjectAnimator?moveIn?=?ObjectAnimator.ofFloat(textview,?"translationX",?-500f,?0f);?? ObjectAnimator?rotate?=?ObjectAnimator.ofFloat(textview,?"rotation",?0f,?360f);?? ObjectAnimator?fadeInOut?=?ObjectAnimator.ofFloat(textview,?"alpha",?1f,?0f,?1f);?? AnimatorSet?animSet?=?new?AnimatorSet();?? animSet.play(rotate).with(fadeInOut).after(moveIn);?? animSet.setDuration(5000);?? animSet.start();監(jiān)聽器
在很多時候,我們希望可以監(jiān)聽到動畫的各種事件,比如動畫何時開始,何時結(jié)束,然后在開始或者結(jié)束的時候去執(zhí)行一些邏輯處理。這個功能是完全可以實現(xiàn)的,Animator類當(dāng)中提供了一個addListener()方法,這個方法接收一個AnimatorListener,我們只需要去實現(xiàn)這個AnimatorListener就可以監(jiān)聽動畫的各種事件了。
大家已經(jīng)知道,ObjectAnimator是繼承自ValueAnimator的,而ValueAnimator又是繼承自Animator的,因此不管是ValueAnimator還是ObjectAnimator都是可以使用addListener()這個方法的。另外AnimatorSet也是繼承自Animator的,因此addListener()這個方法算是個通用的方法。
添加一個監(jiān)聽器的代碼如下所示:
anim.addListener(new?AnimatorListener()?{??@Override??public?void?onAnimationStart(Animator?animation)?{//動畫開始調(diào)用}??@Override??public?void?onAnimationRepeat(Animator?animation)?{//動畫重復(fù)調(diào)用?}??@Override??public?void?onAnimationEnd(Animator?animation)?{//動畫結(jié)束調(diào)用??}??@Override??public?void?onAnimationCancel(Animator?animation)?{//動畫取消調(diào)用??}?? });?這個接口實現(xiàn)了四個方法,有時候可能我們并不需要這么多的方法。怎么辦呢?Android還給我們提供了一個AnimatorListenerAdapter類,代碼如下:
anim.addListener(new?AnimatorListenerAdapter()?{?//在下面重寫你需要實現(xiàn)的方法?@Override??public?void?onAnimationEnd(Animator?animation)?{??}?? });通過上面的介紹,屬性動畫的基本用法我們已經(jīng)能夠熟悉了,要想實現(xiàn)更復(fù)雜的動畫還需要學(xué)習(xí)屬性動畫的高級用法,下一篇博客我們將介紹他的高級用法。
轉(zhuǎn)載于:https://my.oschina.net/tomcater/blog/659580
總結(jié)
以上是生活随笔為你收集整理的Android动画之Property属性动画的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用JavaStcript对数组元素去重
- 下一篇: 产后抑郁症的食疗方法有什么