属性动画源码分析篇——ObjectAnimator(创建、添加)

本文主要分析ObjectAnimator的源码,包括构造方法、setObjectValues和setEvaluator等关键步骤,探讨如何创建和设置属性。文章以创建一个自定义View的小球移动效果为例,逐步解析ObjectAnimator的创建过程,并简要提及添加属性的方法,如setInterpolator、setDuration等。
摘要由CSDN通过智能技术生成
又和大家见面了,这几天一直在忙大创项目,所以没有更新博客,而且我发现看源码这个东西必须写个博客或者笔记啊,这之前一段时机笔者已经看了ValueAnimator和ObjectAnimator的源码了,但是这才过了几天,搞了会别的事情就忘得几乎一干二净了。现在又要重头看一遍很痛苦额-。+。


另外,笔者已经在简书写了关于属性动画的比较系统的详细的文章,之后会陆续在CSDN上重新写的(是重新写,不是复制过去哦,因为第一次写的实在是太烂了-。=)

好了不继续扯皮了,我们看来一下今天想要讲的东西——ObjectAnimator的源码分析(使用部分)。

ObjectAnimator使用部分源码

我们都知道属性动画使用分为三部分:创建、添加属性、启动。而我们今天要讲的就是关于创建和添加属性。首先来看创建的源码吧:

创建

首先看一下今天所有用到的背景:

写了一个自定义的View——PointView,用来实现一个小球的移动效果,PointView代码如下(可以不用看-。+):

public class PointView extends View {
    private Point mCurrentPoint;
    private Paint paint;

    /**
     * 两个构造方法*/
    public PointView(Context context) {
        super(context);
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.CYAN);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
    }

    public PointView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.CYAN);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
    }

    /**
     * onDraw开始使用画笔,如果mCurrentPoint为空,就创建Point对象,
     * 否则就直接调用drawPoint方法*/
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mCurrentPoint == null) {
            mCurrentPoint = new Point(500, 500);
            drawPoint(canvas);
        } else {
            drawPoint(canvas);
        }
    }

    /**
     * 设置一个属性添加的方法*/
    public void setMove(Point point) {
        mCurrentPoint = point;
        invalidate();
    }

    /*启动动画*/
    private void startAnimation() {

        ObjectAnimator animator = ObjectAnimator.ofObject(PointView.this, "Move", new BallEvaluator(),
                new Point(500, 500),
                new Point(500, 800), new Point(700, 800));
        animator.setInterpolator(new LinearInterpolator());
        animator.setDuration(5000);
        animator.start();
    }

    /*
    * 在外部调用的方法,通过此方法,开启小球动作的动画。*/
    public void moveBall() {
        startAnimation();
    }

    private void drawPoint(Canvas canvas) {
        canvas.drawCircle(mCurrentPoint.getX(), mCurrentPoint.getY(), 30, paint);
    }

    /*
    * 小球对象的估值器*/
    public class BallEvaluator implements TypeEvaluator<Point> {

        float x;
        float y;

        @Override
        public Point evaluate(float fraction, Point startValue, Point endValue) {
            float startX = startValue.getX();
            float startY = startValue.getY();
            float endX = endValue.getX();
            float endY = endValue.getY();

            x = fraction * (endX - startX);
            y = fraction * (endY - startY);
            Log.e("ASDSAD", "x = " + x + "y = " + y);
            return new Point(startX + x, startY + y);
        }
    }
}
代码可能有点多,不过这不是主要的,我们今天关注的只是属性动画,所以我们只需要看里面的startAnimation方法和setMove方法就好:
  • setMove:由于我们知道属性动画ObjectAnimator类是通过将propertyName拼接成对应的set方法,然后通过反射机制去调用该方法,所以我们需要有一个对应的set方法。
  • startAnimation:这个方法我们用来设置我们的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值