当前位置:网站首页>三重半圆环进度条,直接拿去就能用
三重半圆环进度条,直接拿去就能用
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();
}
}
边栏推荐
猜你喜欢
运算放大器应用汇总1
再AD 的 界面顶部(菜单栏)创建常用的快捷图标
Free PHP online decryption tool source code v1.2
What is Ba? How about Ba? What is the relationship between Ba and Bi?
Flutter3.0, the applet is not only run across mobile applications
22. (ArcGIS API for JS) ArcGIS API for JS Circle Collection (sketchviewmodel)
维护万星开源向量数据库是什么体验
PHP lightweight Movie Video Search Player source code
[safe office and productivity application] Shanghai daoning provides you with onlyoffice download, trial and tutorial
Function reentry, function overloading and function rewriting are understood by yourself
随机推荐
Kalman filter-1
23.(arcgis api for js篇)arcgis api for js椭圆采集(SketchViewModel)
接口数据安全保证的10种方式
23. (ArcGIS API for JS) ArcGIS API for JS ellipse collection (sketchviewmodel)
Restcloud ETL Community Edition June featured Q & A
[dpdk] dpdk sample source code analysis III: dpdk-l3fwd_ 001
未来发展路线确认!数字经济、数字化转型、数据...这次会议很重要
Mobile measurement and depth link platform - Branch
Gpt-3 is a peer review online when it has been submitted for its own research
Delete data in SQL
Probability formula
我的勇敢对线之路--详细阐述,浏览器输入URL发生了什么
[security attack and Defense] how much do you know about serialization and deserialization?
map和set的实现
The true face of function pointer in single chip microcomputer and the operation of callback function
Kotlin Android environment construction
QT 打开文件 使用 QFileDialog 获取文件名称、内容等
一些常用软件相关
海思万能平台搭建:颜色空间转换YUV2RGB
About Estimation Statistics