使用ObjectAnimator属性怎么实现动画
本篇文章给大家分享的是有关使用ObjectAnimator属性怎么实现动画,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
成都创新互联主营新区网站建设的网络公司,主营网站建设方案,成都APP应用开发,新区h5小程序开发搭建,新区网站营销推广欢迎新区等地区企业咨询
创建
首先看一下今天所有用到的背景:
写了一个自定义的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{ 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:这个方法我们用来设置我们的动画以及启动动画。setMove方法,很简单,我们只是将传入的新的小球对象赋值给了mCurrentBall,然后调用invalidate方法重新绘制。下面看一下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();
我们看一下先进入ofObject方法(相信ofObject里面的参数大家都看得懂):
public static ObjectAnimator ofObject(Object target, String propertyName, TypeEvaluator evaluator, Object... values) { ObjectAnimator anim = new ObjectAnimator(target, propertyName); anim.setObjectValues(values); anim.setEvaluator(evaluator); return anim; }
我们发现ofObject是一个静态方法:他在里面创建了一个ObjectAnimator对象。然后调用了setObjeectValues和setEvaluator方法,分别添加了数据和估值器。
也就是这个ofObject里面有三个入口等着我们进去:
ObjectAnimator的构造方法
setObjectValues方法
setEvaluator方法
那我们先从ObjectAnimator的构造方法开始看吧。
ObjectAnimator构造方法:
private ObjectAnimator(Object target, String propertyName) { setTarget(target); setPropertyName(propertyName); }
又是两个方法,一个一个去看,先进入setTarget:
@Override public void setTarget(@Nullable Object target) { final Object oldTarget = getTarget(); if (oldTarget != target) { if (isStarted()) { cancel(); } mTarget = target == null ? null : new WeakReference