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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
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上。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值