ViewPropertyAnimator、ObjectAnimator、ValueAnimator 這三種 Animator,
它們其實是一種遞進的關係:從左到右依次變得更加難用,也更加靈活。
它們的性能是一樣的,因爲 ViewPropertyAnimator 和 ObjectAnimator 的內部實現其實都是 ValueAnimator,ObjectAnimator 更是本來就是 ValueAnimator 的子類,它們三個的性能並沒有差別。
它們的差別只是使用的便捷性以及功能的靈活性。
所以在實際使用時候的選擇,只要遵循一個原則就行:儘量用簡單的。
能用 View.animate() 實現就不用 ObjectAnimator,
能用 ObjectAnimator 就不用 ValueAnimator。
老版本屬性動畫
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.playTogether(objectAnimator,objectAnimator1);
animatorSet.start();
簡化版屬性動畫:
btnShow.animate()
.setDuration(2000)
.translationX(300)
.rotation(360)
.start();
ViewPropertyAnimator
View類的animate()方法,是在Android 3.1系統上新增的一個方法,其作用就是返回ViewPropertyAnimator的實例對象。
/**
* This method returns a ViewPropertyAnimator object, which can be used to animate
* specific properties on this View.
*
* @return ViewPropertyAnimator The ViewPropertyAnimator associated with this View.
*/
public ViewPropertyAnimator animate() {
if (mAnimator == null) {
mAnimator = new ViewPropertyAnimator(this);
}
return mAnimator;
}
特點:
1、專門針對View對象動畫而操作的類。
2、提供了更簡潔的鏈式調用設置多個屬性動畫,這些動畫可以同時進行的。
3、擁有更好的性能,多個屬性動畫是一次同時變化,只執行一次UI刷新(也就是隻調用一次invalidate,而n個ObjectAnimator就會進行n次屬性變化,就有n次invalidate)。
4、每個屬性提供兩種類型方法設置。
5、該類只能通過View的animate()獲取其實例對象的引用
參考:屬性動畫-Property Animation之ViewPropertyAnimator 你應該知道的一切
Android動畫-屬性動畫-ViewPropertyAnimator
常見設置
如下:
view.animate()//獲取ViewPropertyAnimator對象
//動畫持續時間
.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())//回彈
.setInterpolator(new AccelerateDecelerateInterpolator())//加速再減速
.setInterpolator(new AccelerateInterpolator())//加速
.setInterpolator(new DecelerateInterpolator())//減速
.setInterpolator(new LinearInterpolator())//線性
//動畫延遲
.setStartDelay(1000)
//是否開啓硬件加速
.withLayer()
//監聽
.setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.i("MainActivity", "run: onAnimationStart");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.i("MainActivity", "run: onAnimationEnd");
}
@Override
public void onAnimationCancel(Animator animation) {
Log.i("MainActivity", "run: onAnimationCancel");
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.i("MainActivity", "run: onAnimationRepeat");
}
})
.setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Log.i("MainActivity", "run: onAnimationUpdate==");
}
})
.withEndAction(new Runnable() {
@Override
public void run() {
Log.i("MainActivity", "run: end");
}
})
.withStartAction(new Runnable() {
@Override
public void run() {
Log.i("MainActivity", "run: start");
}
}) .start();