第一种:ViewPropertyAnimator
专门针对view设计的,使用简单操作方便,但是不易于扩展
使用方式:
view
.animate()
.scale(1)
.translationX(300)
.setDuration(2000)
.start();
第二种:ObjectAnimator
继承自ValueAnimator
实际上是通过调用view里面的setter()
方法来更新参数值,例如下面的alpha实际上是调用的view里面的setAlpha()方法来更新值
使用方式
旋转 rotation
、rotationX
、rotationY
- rotationX:表示围绕 X 轴旋转,rotationX 表示旋转度数
- rotationY:表示围绕 Y 轴旋转,rotationY 表示旋转度数
- rotation:表示围绕 Z 旋转,rotation 表示旋转度数
移动 translationX
、translationY
- translationX :表示在 X 轴上的平移距离,以当前控件为原点,向右为正方向,参数 translationX 表示移动的距离。
- translationY :表示在 Y 轴上的平移距离,以当前控件为原点,向下为正方向,参数 translationY 表示移动的距离。
缩放 scaleX
、scaleY
- scaleX:在 X 轴上缩放,scaleX 表示缩放倍数
- scaleY:在 Y 轴上缩放,scaleY 表示缩放倍数
透明度 alpha
- alpha:改变透明度 范围:0-1
- 1:不透明 0:完全透明
ObjectAnimator animator = ObjectAnimator.ofFloat(view,"alpha",1,0,1);
animator.setDuration(2000);
animator.start();
第三种方式: ValueAnimator
- ValueAnimator 是 ObjectAnimator 的父类,实际上,ValueAnimator 就是一个不能指定目标对象版本的 ObjectAnimator。
- 无法指定view对象,而是通过自身不断变化的值,自己手动去调用某个view的setter()方法来变化参数值
- 适用于第三方库控件里面属性没有对应的setter / getter 方法的时候,会需要用到它
使用方式:
ValueAnimator animator = ValueAnimator.ofInt(0,400);//创建一个值从0到400的动画
animator.setDuration(1000);//动画时长为1s
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int curValue = (int)animation.getAnimatedValue();
tv.layout(curValue,curValue,curValue+tv.getWidth(),curValue+tv.getHeight());
}
});
三种方式的区别:
- ViewPropertyAnimator、ObjectAnimator、ValueAnimator 这三种 Animator,它们其实是一种递进的关系:从左到右依次变得更加难用,也更加灵活。
- 它们的性能是一样的,因为 ViewPropertyAnimator 和 ObjectAnimator 的内部实现其实都是 ValueAnimator,ObjectAnimator 更是本来就是 ValueAnimator 的子类,它们三个的性能并没有差别。它们的差别只是使用的便捷性以及功能的灵活性。所以在实际使用时候的选择,只要遵循一个原则就行:尽量用简单的。能用 View.animate() 实现就不用 ObjectAnimator,能用 ObjectAnimator 就不用 ValueAnimator。
网友评论