又和大家见面了,这几天一直在忙大创项目,所以没有更新博客,而且我发现看源码这个东西必须写个博客或者笔记啊,这之前一段时机笔者已经看了ValueAnimator和ObjectAnimator的源码了,但是这才过了几天,搞了会别的事情就忘得几乎一干二净了。现在又要重头看一遍很痛苦额-。+。
另外,笔者已经在简书写了关于属性动画的比较系统的详细的文章,之后会陆续在CSDN上重新写的(是重新写,不是复制过去哦,因为第一次写的实在是太烂了-。=)
好了不继续扯皮了,我们看来一下今天想要讲的东西——ObjectAnimator的源码分析(使用部分)。
ObjectAnimator使用部分源码
我们都知道属性动画使用分为三部分:创建、添加属性、启动。而我们今天要讲的就是关于创建和添加属性。首先来看创建的源码吧:
创建
代码可能有点多,不过这不是主要的,我们今天关注的只是属性动画,所以我们只需要看里面的startAnimation方法和setMove方法就好:首先看一下今天所有用到的背景:
写了一个自定义的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); } } }
- setMove:由于我们知道属性动画ObjectAnimator类是通过将propertyName拼接成对应的set方法,然后通过反射机制去调用该方法,所以我们需要有一个对应的set方法。
- startAnimation:这个方法我们用来设置我们的