前言

  一个实现,空心圆环的自定义View,已经封装完好,可以直接使用。

效果图

代码

  1. import android.content.Context;
  2. import android.graphics.Canvas;
  3. import android.graphics.Color;
  4. import android.graphics.Paint;
  5. import android.graphics.RectF;
  6. import android.util.AttributeSet;
  7. import android.view.View;
  8.  
  9. import androidx.annotation.ColorInt;
  10. import androidx.annotation.Nullable;
  11.  
  12. public class RingProgressBar extends View {
  13. private Paint mPaint;
  14. private int mBgRingColor = Color.BLACK;
  15. private int mProgressRingColor = Color.RED;
  16. private int mBgRingWidth = 20;
  17. private int mProgressRingWidth = 20;
  18. private int mMax = 100;
  19. private int mCurrentProgress = 0;
  20. private int width = 0;
  21. private int height = 0;
  22.  
  23. public RingProgressBar(Context context) {
  24. super(context);
  25. }
  26.  
  27. public RingProgressBar(Context context, @Nullable AttributeSet attrs) {
  28. super(context, attrs);
  29. mPaint = new Paint();
  30. }
  31.  
  32. public RingProgressBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  33. super(context, attrs, defStyleAttr);
  34. mPaint = new Paint();
  35. }
  36.  
  37. public RingProgressBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
  38. super(context, attrs, defStyleAttr, defStyleRes);
  39. mPaint = new Paint();
  40. }
  41.  
  42. @Override
  43. protected void onDraw(Canvas canvas) {
  44. super.onDraw(canvas);
  45. drawBgRing(canvas);
  46. drawProgressRing(canvas);
  47. }
  48.  
  49. /**
  50. * 测量尺寸
  51. */
  52. @Override
  53. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  54. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  55. width = MeasureSpec.getSize(widthMeasureSpec);
  56. height = MeasureSpec.getSize(heightMeasureSpec);
  57. setMeasuredDimension(width, height);
  58. }
  59.  
  60. public void setBgRing(@ColorInt int bgRingColor, int ringWidth) {
  61. mBgRingColor = bgRingColor;
  62. mBgRingWidth = dip2px(ringWidth);
  63. postInvalidate();
  64. }
  65.  
  66. public void setProgressRing(@ColorInt int progressRingColor, int ringWidth) {
  67. mProgressRingColor = progressRingColor;
  68. mProgressRingWidth = dip2px(ringWidth);
  69. postInvalidate();
  70.  
  71. }
  72.  
  73. /**
  74. * 设置最大值
  75. *
  76. * @param max
  77. */
  78. public void setMax(int max) {
  79. mMax = max;
  80. postInvalidate();
  81.  
  82. }
  83.  
  84. /**
  85. * 设置进度
  86. *
  87. * @param progress
  88. */
  89. public void setProgress(int progress) {
  90. mCurrentProgress = progress;
  91. postInvalidate(); //请求失效,重新绘制
  92.  
  93. }
  94.  
  95. /**
  96. * 绘制背景环
  97. * @param canvas
  98. */
  99. private void drawBgRing(Canvas canvas) {
  100. mPaint.setColor(mBgRingColor); //设置画笔颜色
  101. mPaint.setStyle(Paint.Style.STROKE);//设置画笔为描边
  102. mPaint.setStrokeWidth(mBgRingWidth);//设置描边宽度
  103. mPaint.setStrokeCap(Paint.Cap.BUTT);//设置画笔收笔类型
  104. mPaint.setAntiAlias(true); //抗锯齿
  105. canvas.drawCircle(width / 2, height / 2, (width - mBgRingWidth) / 2, mPaint); //画圆形
  106. mPaint.reset();
  107. }
  108.  
  109. /**
  110. * 绘制进度环
  111. * @param canvas
  112. */
  113. private void drawProgressRing(Canvas canvas) {
  114. mPaint.setStyle(Paint.Style.STROKE);
  115. mPaint.setStrokeCap(Paint.Cap.BUTT);
  116. mPaint.setColor(mProgressRingColor);
  117. mPaint.setStrokeWidth(mProgressRingWidth);
  118. mPaint.setAntiAlias(true);
  119. RectF rectF = new RectF();
  120. rectF.left = 0 + mProgressRingWidth / 2;
  121. rectF.right = width - mProgressRingWidth / 2;
  122. rectF.top = 0 + mProgressRingWidth / 2;
  123. rectF.bottom = height - mProgressRingWidth / 2;
  124. float progress = 0;
  125. if (mCurrentProgress < mMax) {
  126. float proportion = (float) 360 / (float) mMax;
  127. progress = mCurrentProgress * proportion;
  128. } else {
  129. progress = 360;
  130. }
  131. canvas.drawArc(rectF, 270, progress, false, mPaint); //画圆弧
  132. mPaint.reset();
  133. }
  134.  
  135. /**
  136. * 根据手机分辨率从DP转成PX
  137. * @param dpValue
  138. * @return
  139. */
  140. public int dip2px(float dpValue) {
  141. float scale = getResources().getDisplayMetrics().density;
  142. return (int) (dpValue * scale + 0.5f);
  143. }
  144. }

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. 第一章 Linux是什么

    Linux是核心与系统调用接口两层中间的操作系统 不同硬件的功能函数并不相同,IBM的Power CPU与Inter的x86架构不同,所以同一套操作系统是不能在不同的硬件平台上面运行的.也就是说,每种 ...

  2. add a characteristic in enovia PLM

    Problem: add a new Char. name D_COI6 that the description is Injected coloration #7 (COI6) in the D_ ...

  3. line-height 行高的使用

    line-height:normal; 默认  字体 line-height:1.5; line-height:200%; line-height:50px;  ps : 固定的值 line-heig ...

  4. 常用的Docker镜像及处理命令

    常用的镜像命令 docker run -d --name dockerui -p : -v /var/run/docker.sock:/var/run/docker.sock abh1nav/dock ...

  5. laydate日期插件弹出闪退和多次闪退问题解决

    情况:点击第一个input 日期,可以正常选择日期,之后点击任何一个,都会闪一下然后消失,无法正常选择: 原因:lay-key的值的问题,需要循环重新为lay-key赋值 解决: <input ...

  6. Python 刷题知识点

    if : elif : else : print('{0} \n{1} \n{2}' .format((a + b), (a - b), (a * b))) print(*[num**2 for nu ...

  7. Perl 条件语句

    Perl 条件语句 Perl 条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: 注意,数字 0, 字符串 '0' . & ...

  8. java 直接调用micorosoft office (2003-2007和2010版本)中excel中计算函数

    主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx 读取excel和MySQL相关: java的poi技 ...

  9. [JZOJ 5817] 抄代码

    题意: 给定2T个串,带修的判断两个串是否按规则一样?? 思路: 两个串是"抄袭的"肯定就是: 1.长度一样. 2.特殊字符位置一样 3.对于每个\(x\)在两个串中出现位置一样, ...

  10. Photon Server的服务器端配置

    Photon Server与Unity3D的交互分为3篇博文实现 (1)Photon Server的服务器端配置 (2)Photon Server的Unity3D客户端配置 (3)Photon Ser ...