Android 动画机制(三)

Android 动画机制(三)

ObjectAnimator

本章主要讲解ObjectAnimator 的使用方法,由于ObjectAnimator是派生自ValueAnimator的,主要是在补充ValueAnimator的动画部分,将动画的属性值设置给指定的对象,二者最大的不同是需要指定动画的具体对象和对象的属性名。

  • ObjectAnimator 实例方法
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)

target 用于指定这个动画要操作的控件
propertyName 指定这个动画要操作这个控件的属性
values 可变长参数,指定一组变化的数据。

  • View中的setter函数
//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的动画设置流程: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的用法

我们在介绍一下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

Evaluator 是用来控制属性动画如何计算属性值的,他的接口定义是TypeEvaluator

public interface TypeEvaluator {
	 public T evaluate(float fraction, T startValue, T endValue);
}

常见的实现类就是我们已经使用过的 IntEvaleator,FloatEvaleator,ArgbEvalutor,就是根据初始值和结束之计算一个进度比。

你可能感兴趣的:(android)