想想之前使用组合动画的时候,是不是这样的:

1
2
3
4
5
6
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();

或者这样的:

1
2
3
4
5
6
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();

达到的效果是:

初见

然而,还能用下面的方法实现这个效果:

1
2
3
4
5
btnShow.animate()
.setDuration(2000)
.translationX(300)
.rotation(360)
.start();

简单了很多有没有 !

概述

平常所做的动画大部分是针对View的,而View经常会需要集中动画混合在一起做,因此提供了一个ViewPropertyAnimator类来快速的实现多个动画的混合。

ViewPropertyAnimator对同时进行多个动画进行了性能优化,虽然有多个动画同时进行,但是一次只刷新一次ui,不会让每个动画都去刷新ui。而且很明显他的写法非常简单。

获取ViewPropertyAnimator

只能通过View.animate()获取ViewPropertyAnimator。

常用方法

这里把能链式调用的全列举出来,感受一下他的方便之处:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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();
  1. 动画的方法名和ObjectAnimator中药填写的属性名是一样的,很容易明白。
  2. 每个动画都有一个By的后缀的方法。加上By的意思是,继续动画这么多数值。不加By的意思是动画到这个数值。
  3. 也可以设置插值器和Animator.AnimatorListener监听以及ValueAnimator.AnimatorUpdateListener监听
  4. 可以直接设置动画开始和结束时的回调方法。
  5. 但是好像没有重复动画的功能

关于By

下面用旋转来演示一下By的区别。

按钮初始旋转角度已经旋转了90, 当点击按钮执行的动画是下面这样的时候,表示旋转到180:

1
2
3
4
btnShow.animate()
.setDuration(2000)
.rotation(180)
.start();

第一次点击会从90旋转到180,再次点击会从180旋转到180,因为已经是180了,所以看着没动。

如果是By呢?:

1
2
3
4
btnShow.animate()
.setDuration(2000)
.rotationBy(180)
.start();