当前位置:网站首页>三重半圆环进度条,直接拿去就能用
三重半圆环进度条,直接拿去就能用
2022-07-06 21:09:00 【超努力的金蟾菇】
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();
}
}
边栏推荐
- 25. (ArcGIS API for JS) ArcGIS API for JS line modification line editing (sketchviewmodel)
- 2022夏每日一题(一)
- 1200.Minimum Absolute Difference
- Preprocessing - interpolation
- QT thread and other 01 concepts
- Ubuntu 20 installation des enregistrements redisjson
- SSL certificate deployment
- 1.19.11.SQL客户端、启动SQL客户端、执行SQL查询、环境配置文件、重启策略、自定义函数(User-defined Functions)、构造函数参数
- Introduction to opensea platform developed by NFT trading platform (I)
- NoSQL之Redis配置与优化
猜你喜欢
21.(arcgis api for js篇)arcgis api for js矩形采集(SketchViewModel)
21. (article ArcGIS API for JS) ArcGIS API for JS rectangular acquisition (sketchviewmodel)
Can the applet run in its own app and realize live broadcast and connection?
Implementation steps of docker deploying mysql8
Huawei and Xiaomi "copy each other"
ggplot 分面的细节调整汇总
史上最全学习率调整策略lr_scheduler
Enumeration general interface & enumeration usage specification
RestClould ETL 社区版六月精选问答
map和set的实现
随机推荐
Summer 2022 daily question 1 (1)
ubuntu20安装redisjson记录
Clock in during winter vacation
力扣------路径总和 III
22.(arcgis api for js篇)arcgis api for js圆采集(SketchViewModel)
Depth analysis of compilation constants, classloader classes, and system class loaders
23. (ArcGIS API for JS) ArcGIS API for JS ellipse collection (sketchviewmodel)
Delete data in SQL
未来发展路线确认!数字经济、数字化转型、数据...这次会议很重要
Index of MySQL
GPT-3当一作自己研究自己,已投稿,在线蹲一个同行评议
SSL证书部署
. Net interface can be implemented by default
Graphical tools package yolov5 and generate executable files exe
MySQL storage engine
Preprocessing - interpolation
预处理——插值
Ggplot facet detail adjustment summary
How to customize the shortcut key for latex to stop running
【开发软件】 tilipa开发者软件