小鱼吃虾米动画加载框(仿CSDN发布文章动画)

小鱼吃虾米动画加载框(仿CSDN发布文章动画)_第1张图片

小鱼吃虾米动画加载框(仿CSDN发布文章动画)_第2张图片

小鱼吃虾米动画加载框(仿CSDN发布文章动画)_第3张图片
AV画质凑活看吧

因为这个没啥技术含量,而且代码质量比较粗糙,也没做迭代和优化;就是突然看到了别人有,我也想有。

直接贴代码了:

package com.xiey.anim;

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.Nullable;

public class EatFish extends View {

    private Paint mPaint;
    private RectF mRectF;
    private float mMaxAngle = 90f;
    private float mHalfMaxAngle = mMaxAngle / 2;

    private Paint mPaintFood;
    private float mMaxY = 200f;
    private float mFootX1 = mMaxY;
    private float mFootX2 = mMaxY;
    private float mFootX3 = mMaxY;
    private float mFootX4 = mMaxY;
    private float mWidth = 50f;
    private float mPadding = 50f;
    private long mEatTime = 400;


    public EatFish(Context context) {
        this(context, null);
    }

    public EatFish(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, -1);
    }

    public EatFish(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }


    private void init(Context context) {

        //
        mPaint = new Paint();
        mPaint.setStrokeWidth(15);
        mPaint.setColor(Color.WHITE);
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);

        //
        mPaintFood = new Paint();
        mPaintFood.setStrokeWidth(7);
        mPaintFood.setColor(Color.WHITE);
        mPaintFood.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaintFood.setStrokeCap(Paint.Cap.ROUND);

        //
        mRectF = new RectF(mPadding, mPadding, mPadding + mWidth, mPadding + mWidth);
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawPoint(mFootX1, mPadding + mWidth / 2, mPaintFood);
        canvas.drawPoint(mFootX2, mPadding + mWidth / 2, mPaintFood);
        canvas.drawPoint(mFootX3, mPadding + mWidth / 2, mPaintFood);
        canvas.drawPoint(mFootX4, mPadding + mWidth / 2, mPaintFood);
        canvas.drawArc(mRectF, 0f + mHalfMaxAngle, 360f - mHalfMaxAngle * 2, true, mPaint);

    }

    private ValueAnimator anim;
    private ValueAnimator animFood1;
    private ValueAnimator animFood2;
    private ValueAnimator animFood3;
    private ValueAnimator animFood4;


    public void startAnimation() {

        //
        anim = ValueAnimator.ofFloat(45, 12, 45);
        anim.setRepeatCount(ValueAnimator.INFINITE);//设置无限重复
        anim.setRepeatMode(ValueAnimator.RESTART);//设置重复模式
        anim.setDuration(mEatTime);
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mHalfMaxAngle = (Float) animation.getAnimatedValue();
                postInvalidate();
            }
        });
        anim.start();

        //
        animFood1 = ValueAnimator.ofFloat(mMaxY, 75);
        animFood1.setRepeatCount(ValueAnimator.INFINITE);//设置无限重复
        animFood1.setRepeatMode(ValueAnimator.RESTART);//设置重复模式
        animFood1.setDuration(mEatTime * 4);
        animFood1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mFootX1 = (Float) animation.getAnimatedValue();
            }
        });
        animFood1.start();

        //
        animFood2 = ValueAnimator.ofFloat(mMaxY, 75);
        animFood2.setRepeatCount(ValueAnimator.INFINITE);//设置无限重复
        animFood2.setRepeatMode(ValueAnimator.RESTART);//设置重复模式
        animFood2.setDuration(mEatTime * 4);
        animFood2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mFootX2 = (Float) animation.getAnimatedValue();
            }
        });
        animFood2.setStartDelay(mEatTime);
        animFood2.start();

        //
        animFood3 = ValueAnimator.ofFloat(mMaxY, 75);
        animFood3.setRepeatCount(ValueAnimator.INFINITE);//设置无限重复
        animFood3.setRepeatMode(ValueAnimator.RESTART);//设置重复模式
        animFood3.setDuration(mEatTime * 4);
        animFood3.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mFootX3 = (Float) animation.getAnimatedValue();
            }
        });
        animFood3.setStartDelay(mEatTime * 2);
        animFood3.start();

        //
        animFood4 = ValueAnimator.ofFloat(mMaxY, 75);
        animFood4.setRepeatCount(ValueAnimator.INFINITE);//设置无限重复
        animFood4.setRepeatMode(ValueAnimator.RESTART);//设置重复模式
        animFood4.setDuration(mEatTime * 4);
        animFood4.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mFootX4 = (Float) animation.getAnimatedValue();
            }
        });
        animFood4.setStartDelay(mEatTime * 3);
        animFood4.start();


    }

    public void stopAnimation() {
        if (anim != null) {
            anim.cancel();
            anim = null;
        }
        if (animFood1 != null) {
            animFood1.cancel();
            animFood1 = null;
        }
        if (animFood2 != null) {
            animFood2.cancel();
            animFood2 = null;
        }
        if (animFood3 != null) {
            animFood3.cancel();
            animFood3 = null;
        }
        if (animFood4 != null) {
            animFood4.cancel();
            animFood4 = null;
        }
    }

}

还有很大的代码优化空间,等我想优化的时候再说吧!

所有代码扔到GitHub上。


你可能感兴趣的:(小鱼吃虾米动画加载框(仿CSDN发布文章动画))