主要运用Drawable动画进行绘制。
public class ThreeBallsLoadingDrawable extends Drawable implements Animatable {
准备三只画笔,分别绘制三个圆形图案
private Paint mLeftPaint,mMiddlePaint,mRightPaint;
@Override
public void draw(Canvas canvas) {
canvas.save();
canvas.translate(translateX,0);
canvas.drawCircle(RADIUS,mHeight/2,RADIUS,mLeftPaint);
canvas.restore();
canvas.save();
canvas.drawCircle(mWidth/2,mHeight/2,RADIUS,mMiddlePaint);
canvas.restore();
canvas.save();
canvas.translate(-translateX,0);
canvas.drawCircle(mWidth-RADIUS,mHeight/2,RADIUS,mRightPaint);
canvas.restore();
进行动画部分代码编写,主要运用ValueAnimator
分析动画,左侧圆形图案,向右平移到中间,然后变换颜色,在反向平移到原来位置。所以我们动画分为两部分,向内平移和向外平移。向内平移动画结束,变化圆形图案颜色(变化策略在上方)
* 向内平移
private void innerMove() {
final ValueAnimator translateXInnerAnimation = ValueAnimator.ofFloat(0,170);
translateXInnerAnimation.setDuration(ANIMATION_DURATION);
translateXInnerAnimation.setInterpolator(new AccelerateInterpolator());
translateXInnerAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
translateX = (float) translateXInnerAnimation.getAnimatedValue();
invalidateSelf();
translateXInnerAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
exchangeColor();
expendMove();
translateXInnerAnimation.start();
* 向外平移
private void expendMove(){
final ValueAnimator translateXExpendAnimation = ValueAnimator.ofFloat(170,0);
translateXExpendAnimation.setDuration(ANIMATION_DURATION);
translateXExpendAnimation.setInterpolator(new DecelerateInterpolator());
translateXExpendAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
translateX = (float) translateXExpendAnimation.getAnimatedValue();
invalidateSelf();
translateXExpendAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
innerMove();
translateXExpendAnimation.start();
* 变换颜色方法
private void exchangeColor(){
int mLeftPaintColor = mLeftPaint.getColor();
int mRightPaintColor = mRightPaint.getColor();
int mMiddlePaintColor = mMiddlePaint.getColor();
mLeftPaint.setColor(mRightPaintColor);
mRightPaint.setColor(mMiddlePaintColor);
mMiddlePaint.setColor(mLeftPaintColor);
在ImageView中设置drawable即可
ThreeBallsLoadingDrawable threeBallsLoadingDrawable = new ThreeBallsLoadingDrawable();
imageView.setImageDrawable(threeBallsLoadingDrawable);
threeBallsLoadingDrawable.start();
GitHub地址
有用记得点颗小星星
往期文章地址
Android动画 - 仿抖音加载动画
Android动画 - 仿58同城加载动画