美文网首页Android
Android 高仿iOS加载动画

Android 高仿iOS加载动画

作者: 窝窝_头 | 来源:发表于2020-07-29 10:36 被阅读0次

    效果图

    gggggg.gif

    无需多言, 代码

    • java 类 (直接拷贝使用)
    /**
     * Project: android
     * ClassName: LoadingView
     * Date: 2020/7/28 15:34
     * Creator: voisen
     * Email: voisen@icloud.com
     * Version: 1.0
     * Description:  this is LoadingView description !
     */
    public class LoadingView extends View {
        private String TAG = "LoadingView";
    
        //自定义变量区域
        private int num = 12;
        private float strokeWidth = 5;
        private int changeDelay = 75;
        private int color;
        private int minAlpha = 20;
    
        //以下变量为自计算, 无需修改
        private Paint mPaint;
        private PointF center = new PointF(0,0);
        private int alphaStep = 0;
        private float angleStep = 0f;
        private float baseAngle = 0f;
        private float maxRadius = 0.0f;
        private float minRadius = 0.0f;
        private Timer timer;
    
        private TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                float a = baseAngle - angleStep;
                if (a % 360 == 0){
                    a = 0;
                }
                baseAngle = a;
                postInvalidate();
            }
        };
    
        public LoadingView(@NonNull Context context) {
            this(context, null);
        }
    
        public LoadingView(@NonNull Context context, @Nullable AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public LoadingView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.LoadingView);
            initAttrs(attributes);
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setDither(true);
            mPaint.setStrokeWidth(strokeWidth);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeJoin(Paint.Join.ROUND);
            mPaint.setStrokeCap(Paint.Cap.ROUND);
            mPaint.setColor(color);
            alphaStep = (0xff-minAlpha)/num;
            angleStep = -360.0f/num;
            timer = new Timer(false);
            timer.schedule(timerTask,0, changeDelay);
            setWillNotDraw(false);
        }
    
        private void initAttrs(TypedArray attributes) {
            minAlpha = attributes.getInt(R.styleable.LoadingView_minAlpha,0x11);
            changeDelay = attributes.getInt(R.styleable.LoadingView_runDuration,75);
            num = attributes.getInt(R.styleable.LoadingView_lineCount,12);
            strokeWidth = attributes.getDimension(R.styleable.LoadingView_lineWidth,5);
            color = attributes.getColor(R.styleable.LoadingView_lineColor,Color.parseColor("#555555"));
        }
    
        @Override
        protected void onAttachedToWindow() {
            super.onAttachedToWindow();
        }
    
        @Override
        protected void onDetachedFromWindow() {
            timerTask.cancel();
            timer.cancel();
            super.onDetachedFromWindow();
        }
    
        @Override
        protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
            super.onLayout(changed, left, top, right, bottom);
            if (changed){
                center.x = getWidth()/2.0f;
                center.y = getHeight()/2.0f;
                maxRadius = Math.min(getWidth(),getHeight())/2 - strokeWidth - 5;
                minRadius = maxRadius/1.75f;
            }
        }
    
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int desiredWidth = 80;
            int desiredHeight = 80;
            int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            int heightSize = MeasureSpec.getSize(heightMeasureSpec);
            int width;
            int height;
            if (widthMode == MeasureSpec.EXACTLY) {
                width = widthSize;
            } else if (widthMode == MeasureSpec.AT_MOST) {
                width = Math.min(desiredWidth, widthSize);
            } else {
                width = desiredWidth;
            }
            if (heightMode == MeasureSpec.EXACTLY) {
                height = heightSize;
            } else if (heightMode == MeasureSpec.AT_MOST) {
                height = Math.min(desiredHeight, heightSize);
            } else {
                height = desiredHeight;
            }
            setMeasuredDimension(width, height);
    
            center.x = getWidth()/2.0f;
            center.y = getWidth()/2.0f;
            maxRadius = Math.min(getWidth(),getHeight())/2 - strokeWidth - 5;
            minRadius = maxRadius/1.75f;
        }
    
        @Override
        public void draw(Canvas canvas) {
            super.draw(canvas);
            double a;
            float x1,y1,x2,y2;
            for (int i = 0; i < num; i++) {
                a = angleStep * i + baseAngle;
                x1 = (float) (Math.cos(Math.PI*a/180.0) * minRadius);
                x2 = (float) (Math.cos(Math.PI*a/180.0) * maxRadius);
    
                y1 = (float) (Math.sin(Math.PI*a/180.0) * minRadius);
                y2 = (float) (Math.sin(Math.PI*a/180.0) * maxRadius);
    
                Path path = new Path();
                path.moveTo(center.x+x1,center.y+y1);
                path.lineTo(center.x+x2,center.y+y2);
    
                int alpha = 0xff - (i * alphaStep);
                mPaint.setAlpha(alpha);
                canvas.drawPath(path,mPaint);
            }
        }
    }
    
    
    • styleable
    
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="LoadingView">
            <attr name="minAlpha" format="integer"/>
            <attr name="runDuration" format="integer"/>
            <attr name="lineCount" format="integer"/>
            <attr name="lineWidth" format="dimension"/>
            <attr name="lineColor" format="color"/>
        </declare-styleable>
    </resources>
    
    

    作者言

    喜欢请收藏点赞 ❤️

    相关文章

      网友评论

        本文标题:Android 高仿iOS加载动画

        本文链接:https://www.haomeiwen.com/subject/kdxhrktx.html