前言

  一个实现,空心圆环的自定义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. java 8 bug

    jpa保存实体的时候,不能用{{}}初始化对象,否则会报异常 org.springframework.dao.InvalidDataAccessApiUsageException: Unknown e ...

  2. hdu6537 /// DP 最长不降子序列->最长公共子序列

    题目大意: 给定一个字符串 字符为0~9 求翻转某个区间后使得串中的最长不降子序列最长 因为字符范围为0~9 假设有一个 0 1 2 3 4 5 6 7 8 9 的序列 此时翻转某个区间得到形如 0 ...

  3. 集成 Swagger2 构建强大的 RESTful API 文档

    微信公众号:一个优秀的废人如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 快过年了,不知道你们啥时候放年假,忙不忙.反正我是挺闲的,所以有时间写 blog.今天给你们带来 SpringBoo ...

  4. Center OS 7 Apache安装配置

    感谢:https://blog.csdn.net/u014157384/article/details/79497761 该作者的帮助. 自己购买了国外的服务器,想把我的网页放到服务器,网页是以web ...

  5. c++11 std::move()

    简单点理解,c++11 中的std::move() 函数,实际上就是将一个左值强制转换成一个右值引用数据类型,从而可以调用相应的对右值引用重载的函数. 如果使用std::move() 的返回值做为参数 ...

  6. webapi JWT 认证

    第一步 使用ng安装JWT组件 第二步 编写登录和生成token代码 byte[] key = Encoding.UTF8.GetBytes("123456789aaaaaaa") ...

  7. bootstrap img自适应

    img 添加class名img-responsive适配屏幕

  8. Json数据交换一Gson

    Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. 添加依赖 <depe ...

  9. 将map转为Object,支持 Date/Boolean

    import lombok.extern.log4j.Log4j2; import java.lang.reflect.Field; import java.lang.reflect.Method; ...

  10. php基本,输出 ,变量

    <?php   //php开头//单行注释/*多行注释*/ echo "hello word";//输出 方式连续输出多个字符串print"hello word&q ...