Android 下载进度条HorizontalProgressView 基础版

一个最基础的自定义View 水平横向进度条,只有圆角、下载进度控制;可二次定制度高;

核心代码:

复制代码
    @Override
    protected void onDraw(@NonNull Canvas canvas) {
        super.onDraw(canvas);
        int mW = getMeasuredWidth();
        int mH = getMeasuredHeight();
        Log.i(TAG, "onDraw: "+mW +"-" +mH);

        //先剪切出进度条的形状、主要是圆角
        Path path = new Path();
        path.addRoundRect(0,0,mW,mH ,radius,radius, Path.Direction.CCW);
        canvas.clipPath(path);

        //画背景色
        paint.setColor(backgroundColor);
        Rect rectBg = new Rect(0,0,mW,mH);
        canvas.drawRect(rectBg,paint);

        //画进度条颜色
        double ratio  = Math.min(progress / max , 1.00) ;
//        canvas.clipRect(0, 0, (int) (mW*ratio), mH);
//        canvas.drawColor(loadingColor);
        paint.setColor(loadingColor);
        Rect rect = new Rect(0, 0,  (int)(mW * ratio), mH);
        canvas.drawRect(rect,paint);
    }

全部代码:

复制代码
package com.cuichen.mytestdemo.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.cuichen.mytestdemo.R;

public class HorizontalProgressView extends View {
    private final String TAG = HorizontalProgressView.class.getSimpleName();
    public HorizontalProgressView(Context context) {
        super(context);
    }

    public HorizontalProgressView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initAttrs(attrs);
    }

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

    public HorizontalProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        initAttrs(attrs);
    }

    private void initAttrs( @Nullable AttributeSet attrs){
        TypedArray typedArray = getContext().obtainStyledAttributes(attrs , R.styleable.HorizontalProgress);
        try{
            backgroundColor = typedArray.getColor(R.styleable.HorizontalProgress_backgroundColor , Color.parseColor("#FF03DAC5"));
            loadingColor = typedArray.getColor(R.styleable.HorizontalProgress_progressColor ,Color.parseColor("#FF018786"));
            radius = (int) typedArray.getDimension(R.styleable.HorizontalProgress_radiusDp , 0);
            max = typedArray.getInt(R.styleable.HorizontalProgress_max , 100);
            progress = typedArray.getInt(R.styleable.HorizontalProgress_progress , 50);
        }catch (Exception e){
            typedArray.recycle();
        }

    }


    private int radius = 18;
    private float progress = 0f;
    private float max = 100f;
    private int backgroundColor;
    private int loadingColor;

    final int DEFAULT_HEIGHT_DP = 36;

    Paint paint;
    void init(){
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.FILL);

    }

    public void setProgress(int progress){
        this.progress = progress;
        invalidate();
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Log.i(TAG, "onMeasure: ");
        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
        int height = 0;
        switch (heightSpecMode){
            case MeasureSpec.AT_MOST:
                height = dp2px(DEFAULT_HEIGHT_DP);
                break;
            case MeasureSpec.EXACTLY:
            case MeasureSpec.UNSPECIFIED:
                height = heightSpecSize;
                break;
        }
        setMeasuredDimension(widthSpecSize, height);

        if(paint == null) {
            init();
        }
    }

    //RectF
    //left:左边坐标;在绘制中常表示为起点的Y轴坐标
    //top:上边左边;在绘制中常表示为起点的X轴坐标
    //right:右边坐标;在绘制中常表示为终点的X轴坐标
    //bottom:下边坐标;在绘制中常表示为终点的Y轴坐标
    @Override
    protected void onDraw(@NonNull Canvas canvas) {
        super.onDraw(canvas);
        int mW = getMeasuredWidth();
        int mH = getMeasuredHeight();
        Log.i(TAG, "onDraw: "+mW +"-" +mH);

        //先剪切出进度条的形状、主要是圆角
        Path path = new Path();
        path.addRoundRect(0,0,mW,mH ,radius,radius, Path.Direction.CCW);
        canvas.clipPath(path);

        //画背景色
        paint.setColor(backgroundColor);
        Rect rectBg = new Rect(0,0,mW,mH);
        canvas.drawRect(rectBg,paint);

        //画进度条颜色
        double ratio  = Math.min(progress / max , 1.00) ;
//        canvas.clipRect(0, 0, (int) (mW*ratio), mH);
//        canvas.drawColor(loadingColor);
        paint.setColor(loadingColor);
        Rect rect = new Rect(0, 0,  (int)(mW * ratio), mH);
        canvas.drawRect(rect,paint);
    }
    private int dp2px(int dp){
        float density = getContext().getResources().getDisplayMetrics().density;
        return (int) (dp * density);
    }
}

    <declare-styleable name="HorizontalProgress">
        <attr name="backgroundColor" format="color"/>
        <attr name="progressColor" format="color"/>
        <attr name="radiusDp" format="dimension"/>
        <attr name="max" format="integer"/>
        <attr name="progress" format="integer"/>
    </declare-styleable>
相关推荐
友人.22714 分钟前
Android 底部导航栏 (BottomNavigationView) 制作教程
android
努力学习的小廉41 分钟前
初识MYSQL —— 事务
android·mysql·adb
阿里云云原生1 小时前
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
android
.豆鲨包1 小时前
【Android】Android内存缓存LruCache与DiskLruCache的使用及实现原理
android·java·缓存
JulyYu2 小时前
【Android】针对非SDK接口的限制解决方案
android·客户端
猪哥帅过吴彦祖3 小时前
Flutter 系列教程:应用导航 - Navigator 1.0 与命名路由
android·flutter·ios
2501_916008893 小时前
iOS 跨平台开发实战指南,从框架选择到开心上架(Appuploader)跨系统免 Mac 发布全流程解析
android·macos·ios·小程序·uni-app·iphone·webview
stevenzqzq4 小时前
Android Hilt教程_构造函数
android
鹏多多4 小时前
flutter图片选择库multi_image_picker_plus和image_picker的对比和使用解析
android·flutter·ios