从零开始学Android自定义View之动画系列——属性动画(2)
組合動畫
獨立的動畫能夠實現的視覺效果畢竟是相當有限的,因此將多個動畫組合到一起播放就顯得尤為重要。幸運的是,Android團隊在設計屬性動畫的時候也充分考慮到了組合動畫的功能,因此提供了一套非常豐富的API來讓我們將多個動畫組合到一起。
實現組合動畫功能主要需要借助AnimatorSet這個類,這個類提供了一個play()方法,如果我們向這個方法中傳入一個Animator對象(ValueAnimator或ObjectAnimator)將會返回一個AnimatorSet.Builder的實例,AnimatorSet.Builder中包括以下四個方法:
? after(Animator anim) 將現有動畫插入到傳入的動畫之后執行
? after(long delay) 將現有動畫延遲指定毫秒后執行
? before(Animator anim) 將現有動畫插入到傳入的動畫之前執行
? with(Animator anim) 將現有動畫和傳入的動畫同時執行
好的,有了這四個方法,我們就可以完成組合動畫的邏輯了,那么比如說我們想要讓TextView先從屏幕外移動進屏幕,然后開始旋轉360度,旋轉的同時進行淡入淡出操作,就可以這樣寫:
ObjectAnimator moveIn = ObjectAnimator.ofFloat(textView,"translatationX",-500f,0f); ObjectAnimator rotate = ObjectAnimator.ofFloat(textView,"rotation",0f,360f); ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textView,"alpha",1f,0f,1f); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(moveIn).with(rotate).after(fadeInOut); animatorSet.setDuration(5000); animatorSet.start();可以看到,這里我們先是把三個動畫的對象全部創建出來,然后new出一個AnimatorSet對象之后將這三個動畫對象進行播放排序,讓旋轉和淡入淡出動畫同時進行,并把它們插入到了平移動畫的后面,最后是設置動畫時長以及啟動動畫。運行一下上述代碼,效果如下圖所示:
Animator監聽器
在很多時候,我們希望可以監聽到動畫的各種事件,比如動畫何時開始,何時結束,然后在開始或者結束的時候去執行一些邏輯處理。這個功能是完全可以實現的,Animator類當中提供了一個addListener()方法,這個方法接收一個AnimatorListener,我們只需要去實現這個AnimatorListener就可以監聽動畫的各種事件了。
大家已經知道,ObjectAnimator是繼承自ValueAnimator的,而ValueAnimator又是繼承自Animator的,因此不管是ValueAnimator還是ObjectAnimator都是可以使用addListener()這個方法的。另外AnimatorSet也是繼承自Animator的,因此addListener()這個方法算是個通用的方法。
添加一個監聽器的代碼如下所示:
anim.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {} });可以看到,我們需要實現接口中的四個方法,onAnimationStart()方法會在動畫開始的時候調用,onAnimationRepeat()方法會在動畫重復執行的時候調用,onAnimationEnd()方法會在動畫結束的時候調用,onAnimationCancel()方法會在動畫被取消的時候調用。
但是也許很多時候我們并不想要監聽那么多個事件,可能我只想要監聽動畫結束這一個事件,那么每次都要將四個接口全部實現一遍就顯得非常繁瑣。沒關系,為此Android提供了一個適配器類,叫作AnimatorListenerAdapter,使用這個類就可以解決掉實現接口繁瑣的問題了,如下所示:
這里我們向addListener()方法中傳入這個適配器對象,由于AnimatorListenerAdapter中已經將每個接口都實現好了,所以這里不用實現任何一個方法也不會報錯。那么如果我想監聽動畫結束這個事件,就只需要單獨重寫這一個方法就可以了,如下所示:
anim.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);} });使用XML編寫動畫
過去的補間動畫除了使用代碼編寫之外也是可以使用XML編寫的,因此屬性動畫也提供了這一功能,即通過XML來完成和代碼一樣的屬性動畫功能。
通過XML來編寫動畫可能會比通過代碼來編寫動畫要慢一些,但是在重用方面將會變得非常輕松,比如某個將通用的動畫編寫到XML里面,我們就可以在各個界面當中輕松去重用它。
如果想要使用XML來編寫動畫,首先要在res目錄下面新建一個animator文件夾,所有屬性動畫的XML文件都應該存放在這個文件夾當中。然后在XML文件中我們一共可以使用如下三種標簽:
那么比如說我們想要實現一個從0到100平滑過渡的動畫,在XML當中就可以這樣寫:
<animator xmlns:android="http://schemas.android.com/apk/res/android" android:valueFrom="0" android:valueTo="100" android:valueType="intType"/>而如果我們想將一個視圖的alpha屬性從1變成0,就可以這樣寫:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:valueFrom="1" android:valueTo="0" android:valueType="floatType" android:propertyName="alpha"/>其實XML編寫動畫在可讀性方面還是挺高的,上面的內容相信不用我做解釋大家也都看得懂吧。
另外,我們也可以使用XML來完成復雜的組合動畫操作,比如將一個視圖先從屏幕外移動進屏幕,然后開始旋轉360度,旋轉的同時進行淡入淡出操作,就可以這樣寫:
這段XML實現的效果和我們剛才通過代碼來實現的組合動畫的效果是一模一樣的,每個參數的含義都非常清楚,相信大家都是一看就懂,我就不再一一解釋了。
最后XML文件是編寫好了,那么我們如何在代碼中把文件加載進來并將動畫啟動呢?只需調用如下代碼即可:
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file); animator.setTarget(view); animator.start();調用AnimatorInflater的loadAnimator來將XML動畫文件加載進來,然后再調用setTarget()方法將這個動畫設置到某一個對象上面,最后再調用start()方法啟動動畫就可以了,就是這么簡單。
總結
以上是生活随笔為你收集整理的从零开始学Android自定义View之动画系列——属性动画(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux Qt打包应用程序--利用li
- 下一篇: 系统学Android从零开始,附超全教程