Android进度条,自定义进度条,显示百分比

昨天搞了一个圆形加载框 传送门,睡了一晚重温一下,今天搞一个条形加载框巩固一下,比圆形要简单点,两个矩形即可,一个总的,一个加载进度的,然后添加一个文字在后面,先上图,后上代码,讲解在注释里直观又方便

在这里插入图片描述

/**
 *           自定义进度条
 * */
public class JinDuView extends View {

    private Paint mPaint; //画笔
    private int canvasHeight; //画板高度
    private int canvasWidth; //画板宽度
    private int nowNumber = 0; //当前数字
    private int maxNumber = 0; //最大数字

    public JinDuView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        //调用该View方法,这里测试写到这里,使用时 fb 找到控件后调用即可
        intoData(70);
    }

    /**
     *动态设置数据
     * */
    public void intoData(int bigNumber){
        maxNumber = bigNumber; //获取最大百分比
        thread.start(); //开启线程
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //画笔
        mPaint = new Paint();
        //防锯齿
        mPaint.setAntiAlias(true);
        //获取画板高度
        canvasHeight = getMeasuredHeight();
        //获取画板宽度
        canvasWidth = getMeasuredWidth();

        //设置颜色
        mPaint.setColor(Color.GREEN);
        //设置宽度-宽度为画板宽度
        mPaint.setStrokeWidth(canvasWidth);
        //画矩形
        //canvas.drawRect(0, 0, canvasWidth, canvasHeight, mPaint);
        //画椭圆形
        canvas.drawRoundRect(0,0,canvasWidth,canvasHeight,30,30,mPaint);


        //设置颜色
        mPaint.setColor(Color.BLACK);
        //画矩形
        // canvas.drawRect(0,0,canvasWidth/100*nowNumber,canvasHeight,mPaint);
        //画椭圆形
        canvas.drawRoundRect(0,0,canvasWidth/100*nowNumber,canvasHeight,30,30,mPaint);

        //设置文字
        String str = nowNumber + " %";
        //设置模板
        Rect rect = new Rect();
        //设置字体大小
        mPaint.setTextSize(24);
        //设置字体颜色
        mPaint.setColor(Color.RED);
        //将文字模板转移到画笔上,此时画笔的属性代表了该文字的属性
        mPaint.getTextBounds(str,0,str.length(),rect);
        //画到画板上
        canvas.drawText(str,canvasWidth/100*nowNumber+5,canvasHeight/2+rect.height()/2,mPaint);


    }
    /**
     * 结束事件
     * */
    private void stopThread(){
//        这里进行弹窗,附加小知识点:
//        问:子线程中能不能吐司?
//        答:经源码分析,吐司需要Looper对象,子线程中并没有声明Looper对象,
//        所以通过此方法及时添加和解除Looper对象就可以吐司了,奥里给
        Looper.prepare();
        Toast.makeText(getContext(),"加载完毕",Toast.LENGTH_SHORT).show();
        Looper.loop();
        //结束线程
        thread.stop();
    }

    /**
     * 通过线程来动态设置View达到动画效果
     * */
    private Thread thread = new Thread(){
        @Override
        public void run() {
            while(true){
                try {
                    /**如果当前数字小于设置的最大数字就一直加
                     * 否则进入结束事件
                     * */
                    if (nowNumber < maxNumber){
                        nowNumber = nowNumber+1;
                    }else {
                        stopThread();
                    }
                    /**休息时间*/
                    Thread.sleep(70);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                /**
                 * 刷新界面 - 无需在UI线程,在工作线程即可被调用,invalidate()必须在UI线程
                 * */
                postInvalidate();
            }
        }
    };
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值