android動畫二·動畫之間的關係
動畫—屬性動畫
ValueAnimator
ValueAnimator是整個屬性動畫機制當中最核心的一個類,實際開發中不常用,ValueAnimator中ofFloat(),ofInt(),ofObject()這三個方法常用
- ValueAnimator只是對值進行了一個平滑的動畫過渡
ValueAnimator anim = ValueAnimator.ofFloat(0f, 20f);
anim.setDuration(1000);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener () {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();
}
});
anim.start();
ValueAnimator anim = ValueAnimator.ofInt(0, 10);
anim.setDuration(1000);
anim.start();
ObjectAnimator
不過雖說ObjectAnimator會更加常用一些,但是它其實是繼承自ValueAnimator的,底層的動畫實現機制也是基於ValueAnimator來完成的,因此ValueAnimator仍然是整個屬性動畫當中最核心的一個類。
- ObjectAnimator對任意物件的任意屬性進行動畫的操作,“translationX”、“scaleY”、“alpha”、“rotation”
float curTranslationX = textview.getTranslationX();
ObjectAnimator animator = ObjectAnimator. ofFloat(textview, "translationX", curTranslationX, -300f, curTranslationX);
animator.setDuration(5000);
animator.start();
View當中一定也存在著setRotation()、getRotation()、setTranslationX()、getTranslationX()、setScaleY()、getScaleY()這些方法
- AnimatorSet組合動畫
AnimatorSet.Builder中包括以下四個方法:
after(Animator anim) 將現有動畫插入到傳入的動畫之後執行
after(long delay) 將現有動畫延遲指定毫秒後執行
before(Animator anim) 將現有動畫插入到傳入的動畫之前執行
with(Animator anim) 將現有動畫和傳入的動畫同時執行
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();
- Animator監聽器
ObjectAnimator是繼承自ValueAnimator的,而ValueAnimator又是繼承自Animator的,因此不管是ValueAnimator還是ObjectAnimator都是可以使用addListener()這個方法的。另外AnimatorSet也是繼承自Animator的,因此addListener()這個方法算是個通用的方法。
anim.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
});
為了方便,android提供了一個適配類,叫AnimatorListenerAdapter,使用這個類可以解決實現介面繁瑣問題。
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
}
});
使用XML編寫動畫
通過XML來編寫動畫可能會比通過程式碼來編寫動畫要慢一些,但是在重用方面將會變得非常輕鬆,比如某個將通用的動畫編寫到XML裡面,我們就可以在各個介面當中輕鬆去重用它。
-
如果想要使用XML來編寫動畫,首先要在res目錄下面新建一個animator資料夾,所有屬性動畫的XML檔案都應該存放在這個資料夾當中。然後在XML檔案中我們一共可以使用如下三種標籤:
- 對應程式碼中的ValueAnimator
- 對應程式碼中的ObjectAnimator
- 對應程式碼中的AnimatorSet
講一個檢視從0過渡到100,就可以這樣寫:
<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"/>
將一個檢視先從螢幕外移動進螢幕,然後開始旋轉360度,旋轉的同時進行淡入淡出操作,就可以這樣寫:
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially" >
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:valueFrom="-500"
android:valueTo="0"
android:valueType="floatType" >
</objectAnimator>
<set android:ordering="together" >
<objectAnimator
android:duration="3000"
android:propertyName="rotation"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" >
</objectAnimator>
<set android:ordering="sequentially" >
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType" >
</objectAnimator>
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" >
</objectAnimator>
</set>
</set>
</set>
最後XML檔案是編寫好了,在程式碼中把檔案載入動畫只需呼叫如下程式碼即可:
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);
animator.setTarget(view);
animator.start();
參考:[http://blog.csdn.net/guolin_blog/article/details/43536355]