原文地址 http://blog.csdn.net/qq_25806863/article/details/70229687
想想之前使用組合動畫的時候,是不是這樣的:
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(btnShow, "translationX", 0, 300);
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(btnShow, "rotation", 0, 360);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.play(objectAnimator).with(objectAnimator1);
animatorSet.start();
或者這樣的:
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(btnShow, "translationX", 0, 300);
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(btnShow, "rotation", 0, 360);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.playTogether(objectAnimator,objectAnimator1);
animatorSet.start();
達到的效果是:
初見
然而,還能用下面的方法實現這個效果:
btnShow.animate()
.setDuration(2000)
.translationX(300)
.rotation(360)
.start();
簡單了很多有沒有 !
概述
平常所做的動畫大部分是針對View的,而View經常會需要集中動畫混合在一起做,因此提供了一個ViewPropertyAnimator類來快速的實現多個動畫的混合。
ViewPropertyAnimator對同時進行多個動畫進行了性能優化,雖然有多個動畫同時進行,但是一次只刷新一次ui,不會讓每個動畫都去刷新ui。而且很明顯他的寫法非常簡單。
獲取ViewPropertyAnimator
只能通過View.animate()獲取ViewPropertyAnimator。
常用方法
這裏把能鏈式調用的全列舉出來,感受一下他的方便之處:
btnShow.animate()
.setDuration(5000)
//透明度
.alpha(0)
.alphaBy(0)
//旋轉
.rotation(360)
.rotationBy(360)
.rotationX(360)
.rotationXBy(360)
.rotationY(360)
.rotationYBy(360)
//縮放
.scaleX(1)
.scaleXBy(1)
.scaleY(1)
.scaleYBy(1)
//平移
.translationX(100)
.translationXBy(100)
.translationY(100)
.translationYBy(100)
.translationZ(100)
.translationZBy(100)
//更改在屏幕上的座標
.x(10)
.xBy(10)
.y(10)
.yBy(10)
.z(10)
.zBy(10)
//監聽及其他設置
.setInterpolator(new BounceInterpolator())
.setStartDelay(1000)
.setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
})
.setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
}
})
.withEndAction(new Runnable() {
@Override
public void run() {
Log.i(TAG, "run: end");
}
})
.withStartAction(new Runnable() {
@Override
public void run() {
Log.i(TAG, "run: start");
}
})
.start();
- 動畫的方法名和ObjectAnimator中藥填寫的屬性名是一樣的,很容易明白。
- 每個動畫都有一個By的後綴的方法。加上By的意思是,繼續動畫這麼多數值。不加By的意思是動畫到這個數值。
- 也可以設置插值器和Animator.AnimatorListener監聽以及ValueAnimator.AnimatorUpdateListener監聽
- 可以直接設置動畫開始和結束時的回調方法。
- 但是好像沒有重複動畫的功能
關於By
下面用旋轉來演示一下By的區別。
按鈕初始旋轉角度已經旋轉了90, 當點擊按鈕執行的動畫是下面這樣的時候,表示旋轉到180:
btnShow.animate()
.setDuration(2000)
.rotation(180)
.start();
第一次點擊會從90旋轉到180,再次點擊會從180旋轉到180,因爲已經是180了,所以看着沒動。
如果是By呢?:
btnShow.animate()
.setDuration(2000)
.rotationBy(180)
.start();