使用Canvas绘制自定义View——三重半圆环进度条


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.util.Log;

import android.view.View;



public class HalfCircleView extends View {



    private int maxProgress = 100;

    private float progress = 30f;

    private float progress2 = 30f;

    private float progress3 = 30f;



    private int circleLineStrokeWidth = 50;  //圆弧的宽度



    private final int txtStrokeWidth = 3;



    // 画圆所在的距形区域,RecF表示矩形区域,一个矩形区域对应一个椭圆,精度为Float,RECT精度为Int

    private final RectF progressRectF;

    private final Paint progressPaint;



    private final RectF progressRectF2;

    private final Paint progressPaint2;



    private final RectF progressRectF3;

    private final Paint progressPaint3;



    public HalfCircleView(Context context, AttributeSet attrs) {

        super(context, attrs);

        progressRectF = new RectF();

        progressPaint = new Paint();



        progressRectF2 = new RectF();

        progressPaint2 = new Paint();



        progressRectF3 = new RectF();

        progressPaint3 = new Paint();

    }



    @Override

    protected void onDraw(Canvas canvas) {

        super.onDraw(canvas);

        int radius = getRadius();



        drawBackgroundRecf(radius);

        drawProgress(canvas);

        // 绘制进度百分比显示

//        drawText(canvas, radius);

    }



    private void drawBackgroundRecf(int radius) {

        // 位置

        progressRectF.left = circleLineStrokeWidth / 2;

        progressRectF.top = circleLineStrokeWidth / 2;

        progressRectF.right = radius - circleLineStrokeWidth / 2;

        progressRectF.bottom = radius - circleLineStrokeWidth / 2;



        progressRectF2.left = circleLineStrokeWidth * 4;

        progressRectF2.top = circleLineStrokeWidth * 4;

        progressRectF2.right = radius - circleLineStrokeWidth * 4;

        progressRectF2.bottom = radius - circleLineStrokeWidth * 4;



        progressRectF3.left = circleLineStrokeWidth * 8;

        progressRectF3.top = circleLineStrokeWidth * 8;

        progressRectF3.right = radius - circleLineStrokeWidth * 8;

        progressRectF3.bottom = radius - circleLineStrokeWidth * 8;



    }





    private int getRadius() {

        int width = this.getWidth() - circleLineStrokeWidth * 2;

        //因为你要画的是一个半圆,半圆一定是在一个矩形里的

        //而在画半圆的时候其实是在一个正方形里绘制一个整圆的一部分

        //那么我们整圆的半径就是扣除半圆进度条的宽度

        return width;

    }



    private void drawProgress(Canvas canvas) {

        canvas.drawColor(Color.TRANSPARENT); //画布颜色

        progressPaint.setAntiAlias(true); //设置是否抗锯齿

        progressPaint.setColor(Color.rgb(0xe9, 0xe9, 0xe9));

        progressPaint.setStrokeWidth(circleLineStrokeWidth);  //设置边框宽度

        progressPaint.setStyle(Paint.Style.STROKE); //stroke代表中断不填充,即圆环

        canvas.drawArc(progressRectF, 180, 180, false, progressPaint); // startAngel 表示圆弧起始的角度,sweepAngle表示圆弧的角度(跨度),  useCenter 表示是否将中心包括在内,绘制成扇形!

        if (progress > 80) {

            progressPaint.setColor(Color.rgb(34,219,126)); //大于80则进度条为绿色

        } else {

            progressPaint.setColor(Color.rgb(247, 169, 45)); //小于80则为橙色

        }

        canvas.drawArc(progressRectF, 180, (progress / maxProgress) * 180, false, progressPaint);



        progressPaint2.setAntiAlias(true); //设置是否抗锯齿

        progressPaint2.setColor(Color.rgb(0xe9, 0xe9, 0xe9));

        progressPaint2.setStrokeWidth(circleLineStrokeWidth);  //设置边框宽度

        progressPaint2.setStyle(Paint.Style.STROKE); //stroke代表中断不填充,即圆环

        canvas.drawArc(progressRectF2, 180, 180, false, progressPaint2); // startAngel 表示圆弧起始的角度,sweepAngle表示圆弧的角度(跨度),  useCenter 表示是否将中心包括在内,绘制成扇形!

        if (progress2 > 80) {

            progressPaint2.setColor(Color.rgb(34,219,126)); //大于80则进度条为绿色

        } else {

            progressPaint2.setColor(Color.rgb(247, 169, 45)); //小于80则为橙色

        }

        canvas.drawArc(progressRectF2, 180, (progress2 / maxProgress) * 180, false, progressPaint2);



        progressPaint3.setAntiAlias(true); //设置是否抗锯齿

        progressPaint3.setColor(Color.rgb(0xe9, 0xe9, 0xe9));

        progressPaint3.setStrokeWidth(circleLineStrokeWidth);  //设置边框宽度

        progressPaint3.setStyle(Paint.Style.STROKE); //stroke代表中断不填充,即圆环

        canvas.drawArc(progressRectF3, 180, 180, false, progressPaint3); // startAngel 表示圆弧起始的角度,sweepAngle表示圆弧的角度(跨度),  useCenter 表示是否将中心包括在内,绘制成扇形!

        if (progress3 > 80) {

            progressPaint3.setColor(Color.rgb(34,219,126)); //大于80则进度条为绿色

        } else {

            progressPaint3.setColor(Color.rgb(247, 169, 45)); //小于80则为橙色

        }

        canvas.drawArc(progressRectF3, 180, (progress3 / maxProgress) * 180, false, progressPaint3);

    }



    private void drawText(Canvas canvas, int radius) {

        progressPaint.setStrokeWidth(txtStrokeWidth);

        String progressText = progress + "%";

        progressPaint.setTextSize(radius / 4);

        int textWidth = (int) progressPaint.measureText(progressText, 0, progressText.length());

        progressPaint.setStyle(Paint.Style.FILL);

        canvas.drawText(progressText, radius / 2 - textWidth / 2, radius / 2, progressPaint);

    }



    public void setProgress(float progress, float progress2, float progress3) {

        this.progress = progress;

        this.progress2 = progress2;

        this.progress3 = progress3;

        this.invalidate();

    }



    public void setProgressNotInUiThread(float progress) {

        this.progress = progress;

        this.postInvalidate();

    }



    public void setCircleLineStrokeWidth(int circleLineStrokeWidth) {

        this.circleLineStrokeWidth = circleLineStrokeWidth;

        this.invalidate();

    }

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麻辣璐璐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值