Android之屬性動畫(二),android灞炴€у姩鐢?/a>android鍔ㄧ敾
上一篇文章(連結:http://www.cnblogs.com/jerehedu/p/4458928.html ),我們對屬性動畫有了簡單的認識,並實際動手使用ObjectAnimator、AnimatorSet完了一個簡單的例子,本次繼續對剩餘內容進行學習。
首先讓我們先來瞭解一下動畫是如何計算的呢?從官方文檔上我們可以看到下面這張圖:
圖中描述了動畫過程中相互工作的主要類,其中ValueAnimator對象可以記錄動畫時間軌跡。ValueAnimator中含有一個TimeInterpo;ator,此屬性用於描述動畫的時間插值;含有一個TypeEvaluator,此屬性用於指定動畫屬性值是如何被計算出來的。
建立一個ValueAnimator並啟動動畫後,ValueAnimator在動畫運行期間會計算一個0到1的分數,這個分數用於表示整個動畫啟動並執行百分比。當ValueAnimator計算好一個運行分數後,會調用當前設定的TimeInterpolator去計算插值分數;插值分數計算好後,ValueAnimator調用TypeEvaluator根據插值分數計算屬性的值。
這裡的ValueAnmiator就是我們在上一章中使用的ObjectAnimator的父類,需要注意的是ValueAnimator不會直接操作一個對象或者屬性,也就意味著我們如果想使用ValueAnimator完成動畫,就必須為ValueAnimator添加一個監聽器:
ValueAnimator animator = ValueAnimator.ofFloat(0.0f, 360f); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { //當前動畫進度 float curValue = (Float) animation.getAnimatedValue(); imageView.setRotationX(curValue); } }); animator.setDuration(4000); animator.setInterpolator(new DecelerateInterpolator()); animator.start();
:
當ValueAnimator的ofInt、ofFloat不能滿足需求是,我們可以使用ofObject方法,這時候需要繼承TypeEvaluaot<T>自訂即可。
除了AnimatorUpdateListener之外,屬性動畫架構為我們提供了Animator.AnimatorListener監聽器:
Android提供了一個此監聽器的預設實現AnimatorListenerAdapter,我們只需要繼承此類即可,參考代碼如下:
animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { PropertyValuesHolder holderX =PropertyValuesHolder.ofFloat("translationX",0f,260f); PropertyValuesHolder holderY=PropertyValuesHolder.ofFloat("translationY",0f,260f); ObjectAnimator.ofPropertyValuesHolder(imageView,holderX,holderY) .setDuration(4000) .start(); } });
屬性動畫中常用的屬性有:
TranslationX、TranslatioinY:相對於版面配置容器的左邊和上邊的座標值
Rotation、rotationX、rotationY:旋轉屬性
scalX、scalY:縮放屬性
pivotX、pivotY:設定旋轉、縮放時的中心點
x、y:座標
alpha:透明度
和view動畫一樣,除了使用java程式碼完成動畫外,我們同樣可以使用xml文檔來編寫屬性動畫。要注意的是xml檔案的目錄不再是anim,而是要在res下建立一個animator檔案夾用於存放。
Xml代碼如下:
<set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially"> <set android:ordering="together"> <objectAnimator android:propertyName="translationX" android:valueFrom="0" android:valueTo="260" android:duration="2000" android:valueType="floatType"/> <objectAnimator android:propertyName="translationY" android:valueFrom="0" android:valueTo="260" android:valueType="floatType" android:duration="2000"/> </set> <objectAnimator android:propertyName="alpha" android:valueFrom="1" android:valueTo="0" android:duration="2000"/></set>
在java中使用:
AnimatorSet animatorSet = (AnimatorSet)AnimatorInflater.loadAnimator(this,R.animator.myanimator); animatorSet.setTarget(imageView); animatorSet.start();
想要深入學習的同學,可以點擊下載源碼,查看更多詳細內容!