大致思路:自定义一个类继承Valueanimator可命名为MyAnimator。在该类中定义一个内部类继承Drawble,可以简单命名为MyDrawable。在MyAnimator开始播放时,根据动画返回值,不断触发MyDrawable更新。
代码片段:
Animator:
package com.example.com.myapplication; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Matrix; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; class WaveRobotAnimator extends AbsRobotAnimator implements ValueAnimator.AnimatorUpdateListener { private RobotDrawable mDrawable; WaveRobotAnimator(Context context,boolean left) { this.setDuration(1700); this.setIntValues(0, 1700); this.setInterpolator(new LinearInterpolator()); mDrawable = new RobotDrawable(context,left); addUpdateListener(this); } @Override public void onAnimationUpdate(ValueAnimator animation) { mDrawable.update((int) (animation.getAnimatedValue())); mDrawable.invalidateSelf(); } Drawable getDrawable() { return mDrawable; } private class RobotDrawable extends Drawable { private int mTime; private Body mBody; private EyeLeft mEyeLeft; private EyeRight mEyeRight; private HandLeft mHandLeft; private HandRight mHandRight; private Head mHead; private Mouth mMouth; private int mWidth; private int mHeight; private boolean mIsLeft; RobotDrawable(Context context, boolean left) { mIsLeft = left; mBody = new Body(context); mEyeLeft = new EyeLeft(context); mEyeRight = new EyeRight(context); mHandLeft = new HandLeft(context); mHandRight = new HandRight(context); mHead = new Head(context); mMouth = new Mouth(context); } @Override public void setAlpha(int alpha) { } private void update(int time) { mTime = time; } @Override public void draw(@NonNull Canvas canvas) { if (mWidth == 0 || mHeight == 0) { mWidth = canvas.getWidth(); mHeight = canvas.getHeight(); } canvas.save(); if (mIsLeft) { canvas.scale(-1, 1, canvas.getWidth() / 2f, canvas.getHeight() / 2f); } canvas.translate(mWidth / 2f - 126 / 2, mHeight / 2f - 164 /