由于Animation在功能上具有一定局限性,谷歌推出了Animator。
1. ObjectAnimator
ofFloat
方法
// 比如设置一个ImageView平移的动画,时间1s
ObjectAnimator.ofFloat(imageView, "rotation", 0, 360f).setDuration(1000).start();
// 多个动作同时执行,是个异步的过程
ObjectAnimator.ofFloat(imageView, "rotation", 0, 360f).setDuration(1000).start();
ObjectAnimator.ofFloat(imageView, "translationX", 0, 200f).setDuration(1000).start();
ObjectAnimator.ofFloat(imageView, "translationY", 0, 200f).setDuration(1000).start();
ofPropertyValuesHolder
方法
// PropertyValuesHolder对动画进行了一些优化,下面的代码跟前面效果一致。
PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("rotation", 0, 360f);
PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("translationX", 0, 200f);
PropertyValuesHolder p3 = PropertyValuesHolder.ofFloat("translationY", 0, 200f);
ObjectAnimator.ofPropertyValuesHolder(imageView, p1, p2, p3).setDuration(1000).start();
AnimatorSet
// 效果跟前面一致
ObjectAnimator animator1 = ObjectAnimator.ofFloat(imageView, "rotation", 0, 360f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(imageView, "translationX", 0, 200f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(imageView, "translationY", 0, 200f);
AnimatorSet set = new AnimatorSet();
set.playTogether(animator1, animator2, animator3);
set.setDuration(1000);
set.start();
AnimatorSet
还提供了更加丰富的动画控制效果,比如:
// 顺序执行三个动作
set.playSequentially(animator1, animator2, animator3);
// 先同时执行后面两个动作,再执行第一个旋转的动作
set.play(animator2).with(animator3);
set.play(animator1).after(animator2);
2. 动画的监听事件
- 方式1:
动画调用addListener(Animator.Animator.Listener listener)
方法,为动画添加监听器,如果这些方法,我们就可以在动画的各个阶段执行一些逻辑。
animator.setListener(new Animator.AnimatorListener() {
@Override
pubic void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}
- 方式2:
// 只实现其中一部分方法
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
Toast.makeText(MyActivity.this, "anim end", Toast.LENGTH_SHORT).show();
}
}
3. ValueAnimator
- ValueAnimator是什么?
通过数值来控制动画,它是ObjectAnimator的基类。 - ValueAnimator怎么用?
Button button = view;
ValueAnimator animator = ValueAnimator.ofInt(0, 100);
animator.setDuration(5000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = (Integer) animation.getAnimationValue();
// 实现一个计时器的动画效果
button.setText("" + value);
}
}
animator.start();
4. 总结
4.1 常用属性
translationX
,translationY
rotation
,rotationX
,rotationY
scaleX
,scaleY
X
,Y
alpha
4.2 常用方法和类
ValueAnimator
数值发生器,可以实现很多很灵活的动画效果ObjectAnimator
ValueAnimator的一个子类,封装了ValueAnimator,可以更加轻松地使用AnimatorUpdateListener
AnimatorListenerAdapter
做监听事件PropertyValuesHolder
AnimatorSet
控制动画集合的显示效果、顺序以及流程控制等TypeEvaluators
Interpolators
值计算器和插入器,用来控制产生数值的变化规律、变化状态等