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();
}
}
使用Canvas绘制自定义View——三重半圆环进度条
于 2022-07-04 10:22:53 首次发布