本章主要讲解ObjectAnimator 的使用方法,由于ObjectAnimator是派生自ValueAnimator的,主要是在补充ValueAnimator的动画部分,将动画的属性值设置给指定的对象,二者最大的不同是需要指定动画的具体对象和对象的属性名。
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
target 用于指定这个动画要操作的控件
propertyName 指定这个动画要操作这个控件的属性
values 可变长参数,指定一组变化的数据。
//1、透明度:alpha
public void setAlpha(float alpha) //设置透明度
//2、旋转度数:rotation、rotationX、rotationY
public void setRotation(float rotation) //表示围绕Z轴旋转,rotation表示旋转度数
public void setRotationX(float rotationX) //表示围绕X轴旋转,rotationX表示旋转度数
public void setRotationY(float rotationY) //表示围绕Y轴旋转,rotationY表示旋转度数
//3、平移:translationX、translationY
//表示在X轴上的平移距离,以当前控件为原点,向右为正方向,参数translationX表示移动的距离。
public void setTranslationX(float translationX)
表示在Y轴上的平移距离,以当前控件为原点,向下为正方向,参数translationY表示移动的距离。
public void setTranslationY(float translationY)
//缩放:scaleX、scaleY
//在X轴上缩放,scaleX表示缩放倍数
public void setScaleX(float scaleX)
//在Y轴上缩放,scaleY表示缩放倍数
public void setScaleY(float scaleY)
ObjectAnimator的使用:
//这里的属性对象和set方法中相对应。
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "alpha", 1, 0, 1);
animator.setDuration(2000);
animator.start();
ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"rotationX",0,270,0);
animator.setDuration(2000);
animator.start();
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "translationX", 0, 200, -200,0);
animator.setDuration(2000);
animator.start();
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "scaleY", 0, 3, 1);
animator.setDuration(2000);
animator.start();
ObjectAnimator的动画设置流程:ObjectAnimator需要指定操作的控件对象,在开始动画时,到控件类中去寻找设置属性所对应的set函数,然后把动画中间值做为参数传给这个set函数并执行它。
所以控件类中必须所要设置属性所要对应的set函数。所以为了自由控制控件的实现,我们这里自定义一个控件。设置一个set函数与我们自定义的属性相对应。
这里还是使用网上的案例解析:
自定义一个Circle对象,包涵一个半径的属性,实现set 方法:
public class MyObjectView extends View {
public static final float RADIUS = 70f;// 圆的半径 = 70
private Circle currentCircle;// 当前点坐标
private Paint mPaint;// 绘图画笔
public MyObjectView(Context context) {
super(context);
}
public MyObjectView(Context context, AttributeSet attrs) {
super(context, attrs);
// 初始化画笔
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.BLUE);
mPaint.setStyle(Paint.Style.FILL);
currentCircle = new Circle(100);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (currentCircle != null) {
canvas.drawCircle(300, 300, currentCircle.getRadius(), mPaint);
}
}
//定义set方法,设置属性
public void setRadius(int radius){
currentCircle.setRadius(radius);
invalidate();
}
}
MyObjectView myPointView = (MyObjectView) findViewById(R.id.myView);
//这里的属性名称和自定义View中的set方法后半部分名称是同名的,“radius”
ObjectAnimator animator = ObjectAnimator.ofInt(myPointView, "radius", 0, 300, 100);
animator.setDuration(2000);
animator.start();
可以看到代码的逻辑是十分清楚明了的。设置radius的属性值,传入后不断的重绘,实现动画效果。
我们在介绍一下ArgbEvalutor的用法:直接贴代码:
ObjectAnimator animator = ObjectAnimator.ofInt(tv, "BackgroundColor", 0xffff00ff, 0xffffff00, 0xffff00ff);
animator.setDuration(8000);
animator.setEvaluator(new ArgbEvaluator());
animator.start();
ArgbEvaluator的返回值是Integer类型,所以我们要使用ArgbEvaluator的话,构造ObjectAnimator时必须使用ofInt();
Evaluator 是用来控制属性动画如何计算属性值的,他的接口定义是TypeEvaluator
public interface TypeEvaluator {
public T evaluate(float fraction, T startValue, T endValue);
}
常见的实现类就是我们已经使用过的 IntEvaleator,FloatEvaleator,ArgbEvalutor,就是根据初始值和结束之计算一个进度比。