前言

  一个实现,空心圆环的自定义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.view.View; import androidx.annotation.ColorInt;
import androidx.annotation.Nullable; public class RingProgressBar extends View {
private Paint mPaint;
private int mBgRingColor = Color.BLACK;
private int mProgressRingColor = Color.RED;
private int mBgRingWidth = 20;
private int mProgressRingWidth = 20;
private int mMax = 100;
private int mCurrentProgress = 0;
private int width = 0;
private int height = 0; public RingProgressBar(Context context) {
super(context);
} public RingProgressBar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
} public RingProgressBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint();
} public RingProgressBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mPaint = new Paint();
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawBgRing(canvas);
drawProgressRing(canvas);
} /**
* 测量尺寸
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = MeasureSpec.getSize(widthMeasureSpec);
height = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(width, height);
} public void setBgRing(@ColorInt int bgRingColor, int ringWidth) {
mBgRingColor = bgRingColor;
mBgRingWidth = dip2px(ringWidth);
postInvalidate();
} public void setProgressRing(@ColorInt int progressRingColor, int ringWidth) {
mProgressRingColor = progressRingColor;
mProgressRingWidth = dip2px(ringWidth);
postInvalidate(); } /**
* 设置最大值
*
* @param max
*/
public void setMax(int max) {
mMax = max;
postInvalidate(); } /**
* 设置进度
*
* @param progress
*/
public void setProgress(int progress) {
mCurrentProgress = progress;
postInvalidate(); //请求失效,重新绘制 } /**
* 绘制背景环
* @param canvas
*/
private void drawBgRing(Canvas canvas) {
mPaint.setColor(mBgRingColor); //设置画笔颜色
mPaint.setStyle(Paint.Style.STROKE);//设置画笔为描边
mPaint.setStrokeWidth(mBgRingWidth);//设置描边宽度
mPaint.setStrokeCap(Paint.Cap.BUTT);//设置画笔收笔类型
mPaint.setAntiAlias(true); //抗锯齿
canvas.drawCircle(width / 2, height / 2, (width - mBgRingWidth) / 2, mPaint); //画圆形
mPaint.reset();
} /**
* 绘制进度环
* @param canvas
*/
private void drawProgressRing(Canvas canvas) {
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeCap(Paint.Cap.BUTT);
mPaint.setColor(mProgressRingColor);
mPaint.setStrokeWidth(mProgressRingWidth);
mPaint.setAntiAlias(true);
RectF rectF = new RectF();
rectF.left = 0 + mProgressRingWidth / 2;
rectF.right = width - mProgressRingWidth / 2;
rectF.top = 0 + mProgressRingWidth / 2;
rectF.bottom = height - mProgressRingWidth / 2;
float progress = 0;
if (mCurrentProgress < mMax) {
float proportion = (float) 360 / (float) mMax;
progress = mCurrentProgress * proportion;
} else {
progress = 360;
}
canvas.drawArc(rectF, 270, progress, false, mPaint); //画圆弧
mPaint.reset();
} /**
* 根据手机分辨率从DP转成PX
* @param dpValue
* @return
*/
public int dip2px(float dpValue) {
float scale = getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}

Android开发 View_自定义圆环进度条View的更多相关文章

  1. 【Android 应用开发】 自定义 圆形进度条 组件

    转载著名出处 : http://blog.csdn.net/shulianghan/article/details/40351487 代码下载 : -- CSDN 下载地址 : http://down ...

  2. 自定义环形进度条RoundProgressBar

    一.效果图: Canvas画圆环说明: 圆环宽度不必在意,只是画笔宽度设置后达到的效果. 二.实现步骤 1.自定义View-RoundProgressBar 2.设置属性resources(decle ...

  3. ProgressBar学习笔记,自定义横向进度条的样式(包含ActionBar上面的进度条)

     点显示进度条后→   android:max="100" 进度条的最大值 android:progress  进度条已经完成的进度值 android:progressDrawab ...

  4. Android笔记(二十三) Android中的ProgressBar(进度条)

    圆形进度条和水平进度条 进度条也是UI界面一种非常实用的组件,通常用于向用户显示某个耗时操作完成的百分比,进度条可以动态的显示进度,避免长时间的执行某个耗时操作时,让用户感觉程序失去了相应,从而更好的 ...

  5. android开发之自定义组件

    android开发之自定义组件 一:自定义组件: 我认为,自定义组件就是android给我们提供的的一个空白的可以编辑的图片,它帮助我们实现的我们想要的界面,也就是通过自定义组件我们可以把我们要登入的 ...

  6. canvas绘制百分比圆环进度条

    开发项目,PM会跟踪项目进度:完成某个事情,也可以设置一个完成的进度. 这里用canvas绘制一个简单百分比圆环进度条. 看下效果: 1. 动画方式   2. 静默方式   // 贴上代码,仅供参考 ...

  7. Vue/React圆环进度条

    数据展示,一直是各行各业乐此不疲的需求,具体到前端开发行业,则是各种各种图表数据展示,各种表格数据展示,烦不胜烦(繁不胜繁)! 前几天刚做了折线图.柱状图.饼状图之类的图表数据展示效果,今天又碰到了类 ...

  8. 两种CSS3圆环进度条详解

    晚上睡觉之前,我抽了1个多小时,研究了一下圆环进度条,结合从网上查阅的资料,我终于掌握了两种圆环的生成方法. 这次的效果就是单纯的CSS3效果,也没有写具体的JS,等以后有时间在好好整理一下吧~. 第 ...

  9. Android再学习-20141018-布局-进度条

    20141018-Android再学习 对齐至控件的基准线 为了保证印刷字母的整齐而划定的线(四线三格的第三条线). android:layout_alignBaseline 与父控件的四个边缘对齐( ...

随机推荐

  1. static变量、static函数与普通变量、普通函数的区别

    转自:http://blog.163.com/sunshine_linting/blog/static/44893323201191294825184/ 全局变量(外部变量)的说明之前再冠以stati ...

  2. xshell6 远程连接时提示 WARNING! The remote SSH server rejected X11 forwarding request.

    1.输入命令 vi /etc/ssh/sshd_config ,修改配置文件 2.将UserLogin no 的注释解除   3.执行yum install -y xorg-x11-font xorg ...

  3. Servilet初步

    以http://locahost:8080/......开头,或者以/开头,都是绝对路径以路径开头:相对路径 路径/路径 Servlet执行流程:(只用自己编写执行的代码,执行的细节全是tomcat封 ...

  4. 记一次批量修改SQLServer表数据

    前提: 1.数据有上百万条,分成10几张excel表,从数据库中导出,由业务部门修改: 2.数据没什么规律: 3.和数据库DB商量后决定先把从excel导进数据库中,再通过关联查询修改数据 将 Exc ...

  5. git提交遇到.suo文件无法提交的问题

    这个只是我个人遇到的一个问题小记 由于最近做的项目使用VS编辑器的,在用它集成创建的项目里,每次提交都会有个后缀名为.suo的文件在修改的文件列表里.这时直接进行提交会报错, 1.我将xx.suo/x ...

  6. zabbix--添加host

    在client配置好zabbix_agent后,如果server端没配置自动发现,那就需要创建添加host. 首先找到地方.Configuration--Hosts--Create Host 创建ho ...

  7. 1、如何在列表,字典,集合种根据条件筛选数据?2、如何为元组中的每个元素命名,提高程序的可读性3、如何统计出序列中元素出现的频度4、如何根据字典中value的大小,对字典的key进行排序

    一.数据筛选: 处理方式: 1.filter函数在py3,返回的是个生成式. from random import randint data = [randint(-100,100) for i in ...

  8. 前端 css 进阶

    内容目录: 1.css盒子模型 2.浮动 float 3.溢出 overflow 4.定位 position 5. z-index 6.opacity 1.css盒子模型 margin:用来调节盒子与 ...

  9. w - 显示已经登录的用户以及他们在做什么

    总览 (SYNOPSIS) w - [husfV] [user] 描述 (DESCRIPTION) w 显示 系统中 当前用户 的 信息, 以及 他们 的 进程. 第一行 中 依次 显示 当前时间, ...

  10. js求三个数的最大值运算

    js代码: <script> // var num1 = 32, // num2 = 43, // num3 = 98; // if (num1 > num2) { // if (n ...