RoundProgressBar.java

  1. /**
  2. * RoundProgressBar.java [v1.0.0]
  3. * classes: com.example.audiorecordingtest.RoundProgressBar
  4. * Amanda Create at 2014年10月10日 下午4:16:45
  5. * Copyright 阳光健康信息技术有限公司
  6. */
  7. package com.example.audiorecordingtest.view;
  8. /**
  9. * com.example.audiorecordingtest.RoundProgressBar
  10. * @author Amanda
  11. * create at 2014年10月10日 下午4:16:45
  12. */
  13. import com.example.audiorecordingtest.R;
  14. import com.example.audiorecordingtest.R.styleable;
  15. import android.content.Context;
  16. import android.content.res.TypedArray;
  17. import android.graphics.Canvas;
  18. import android.graphics.Color;
  19. import android.graphics.Paint;
  20. import android.graphics.RectF;
  21. import android.graphics.Typeface;
  22. import android.util.AttributeSet;
  23. import android.view.View;
  24. /**
  25. * 仿iphone带进度的进度条,线程安全的View,可直接在线程中更新进度
  26. *
  27. */
  28. public class RoundProgressBar extends View {
  29. /**
  30. * 画笔对象的引用
  31. */
  32. private Paint paint;
  33. /**
  34. * 圆环的颜色
  35. */
  36. private int roundColor;
  37. /**
  38. * 圆环进度的颜色
  39. */
  40. private int roundProgressColor;
  41. /**
  42. * 中间进度百分比的字符串的颜色
  43. */
  44. private int textColor;
  45. /**
  46. * 中间进度百分比的字符串的字体
  47. */
  48. private float textSize;
  49. /**
  50. * 圆环的宽度
  51. */
  52. private float roundWidth;
  53. /**
  54. * 最大进度
  55. */
  56. private int max;
  57. /**
  58. * 当前进度
  59. */
  60. private int progress;
  61. /**
  62. * 是否显示中间的进度
  63. */
  64. private boolean textIsDisplayable;
  65. /**
  66. * 进度的风格,实心或者空心
  67. */
  68. private int style;
  69. public static final int STROKE = 0;
  70. public static final int FILL = 1;
  71. public RoundProgressBar(Context context) {
  72. this(context, null);
  73. }
  74. public RoundProgressBar(Context context, AttributeSet attrs) {
  75. this(context, attrs, 0);
  76. }
  77. public RoundProgressBar(Context context, AttributeSet attrs, int defStyle) {
  78. super(context, attrs, defStyle);
  79. paint = new Paint();
  80. TypedArray mTypedArray = context.obtainStyledAttributes(attrs,
  81. R.styleable.RoundProgressBar);
  82. //获取自定义属性和默认值
  83. roundColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.rgb(245, 252, 248));
  84. roundProgressColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.rgb(62, 187, 102));
  85. textColor = mTypedArray.getColor(R.styleable.RoundProgressBar_textColor, Color.BLACK);
  86. textSize = mTypedArray.getDimension(R.styleable.RoundProgressBar_textSize, 15);
  87. roundWidth = mTypedArray.getDimension(R.styleable.RoundProgressBar_roundWidth, 5);
  88. max = mTypedArray.getInteger(R.styleable.RoundProgressBar_max, 100);
  89. textIsDisplayable = mTypedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable, true);
  90. style = mTypedArray.getInt(R.styleable.RoundProgressBar_style, 0);
  91. mTypedArray.recycle();
  92. }
  93. @Override
  94. protected void onDraw(Canvas canvas) {
  95. super.onDraw(canvas);
  96. /**
  97. * 画最外层的大圆环
  98. */
  99. int centerX = getWidth()/2;
  100. int centerY = getHeight()/2;
  101. int centre = centerX>centerY?centerY:centerX;
  102. int radius = (int) (centre - roundWidth/2); //圆环的半径
  103. paint.setColor(roundColor); //设置圆环的颜色
  104. paint.setStyle(Paint.Style.STROKE); //设置空心
  105. paint.setStrokeWidth(roundWidth); //设置圆环的宽度
  106. paint.setAntiAlias(true); //消除锯齿
  107. canvas.drawCircle(centerX, centerY, radius, paint); //画出圆环
  108. // Log.e("log", centre + "");
  109. /**
  110. * 画进度百分比
  111. */
  112. paint.setStrokeWidth(0);
  113. paint.setColor(textColor);
  114. paint.setTextSize(textSize);
  115. paint.setTypeface(Typeface.DEFAULT_BOLD); //设置字体
  116. int percent = (int)(((float)progress / (float)max) * 100); //中间的进度百分比,先转换成float在进行除法运算,不然都为0
  117. float textWidth = paint.measureText(percent + "%"); //测量字体宽度,我们需要根据字体的宽度设置在圆环中间
  118. if(textIsDisplayable && percent != 0 && style == STROKE){
  119. canvas.drawText(percent + "%", centerX - textWidth / 2, centerY + textSize/2, paint); //画出进度百分比
  120. }
  121. /**
  122. * 画圆弧 ,画圆环的进度
  123. */
  124. //设置进度是实心还是空心
  125. paint.setStrokeWidth(roundWidth); //设置圆环的宽度
  126. paint.setColor(roundProgressColor); //设置进度的颜色
  127. RectF oval = new RectF(centerX - radius, centerY - radius, centerX
  128. + radius, centerY + radius); //用于定义的圆弧的形状和大小的界限
  129. switch (style) {
  130. case STROKE:{
  131. paint.setStyle(Paint.Style.STROKE);
  132. canvas.drawArc(oval, 90, 360 * progress / max, false, paint); //根据进度画圆弧
  133. break;
  134. }
  135. case FILL:{
  136. paint.setStyle(Paint.Style.FILL_AND_STROKE);
  137. if(progress !=0){
  138. canvas.drawArc(oval, 90, 360 * progress / max, true, paint); //根据进度画圆弧
  139. }
  140. break;
  141. }
  142. }
  143. }
  144. public synchronized int getMax() {
  145. return max;
  146. }
  147. /**
  148. * 设置进度的最大值
  149. * @param max
  150. */
  151. public synchronized void setMax(int max) {
  152. if(max < 0){
  153. throw new IllegalArgumentException("max not less than 0");
  154. }
  155. this.max = max;
  156. }
  157. /**
  158. * 获取进度.需要同步
  159. * @return
  160. */
  161. public synchronized int getProgress() {
  162. return progress;
  163. }
  164. /**
  165. * 设置进度,此为线程安全控件,由于考虑多线的问题,需要同步
  166. * 刷新界面调用postInvalidate()能在非UI线程刷新
  167. * @param progress
  168. */
  169. public synchronized void setProgress(int progress) {
  170. if(progress < 0){
  171. throw new IllegalArgumentException("progress not less than 0");
  172. }
  173. if(progress > max){
  174. progress = max;
  175. }
  176. if(progress <= max){
  177. this.progress = progress;
  178. postInvalidate();
  179. }
  180. }
  181. public int getCricleColor() {
  182. return roundColor;
  183. }
  184. public void setCricleColor(int cricleColor) {
  185. this.roundColor = cricleColor;
  186. }
  187. public int getCricleProgressColor() {
  188. return roundProgressColor;
  189. }
  190. public void setCricleProgressColor(int cricleProgressColor) {
  191. this.roundProgressColor = cricleProgressColor;
  192. }
  193. public int getTextColor() {
  194. return textColor;
  195. }
  196. public void setTextColor(int textColor) {
  197. this.textColor = textColor;
  198. }
  199. public float getTextSize() {
  200. return textSize;
  201. }
  202. public void setTextSize(float textSize) {
  203. this.textSize = textSize;
  204. }
  205. public float getRoundWidth() {
  206. return roundWidth;
  207. }
  208. public void setRoundWidth(float roundWidth) {
  209. this.roundWidth = roundWidth;
  210. }
  211. }
values/attrs.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="RoundProgressBar">
  4. <attr name="roundColor" format="color"/>
  5. <attr name="roundProgressColor" format="color"/>
  6. <attr name="roundWidth" format="dimension"></attr>
  7. <attr name="textColor" format="color" />
  8. <attr name="textSize" format="dimension" />
  9. <attr name="max" format="integer"></attr>
  10. <attr name="textIsDisplayable" format="boolean"></attr>
  11. <attr name="style">
  12. <enum name="STROKE" value="0"></enum>
  13. <enum name="FILL" value="1"></enum>
  14. </attr>
  15. </declare-styleable>
  16. </resources>
layout/audiorecord.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:android_custom="http://schemas.android.com/apk/res/com.example.audiorecordingtest"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. android:gravity="center">
  8. <FrameLayout
  9. android:layout_width="match_parent"
  10. android:layout_height="0dp"
  11. android:layout_weight="2">
  12. <ImageView
  13. android:id="@+id/img_microfan"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_gravity="center"
  17. android:src="@drawable/microfan"
  18. android:scaleType="centerInside"/>
  19. <com.example.audiorecordingtest.view.RoundProgressBar
  20. android:id="@+id/roundProgressBar"
  21. android:layout_width="match_parent"
  22. android:layout_height="match_parent"
  23. android_custom:roundColor="#f6fcf8"
  24. android_custom:roundProgressColor="#41c36b"
  25. android_custom:textIsDisplayable="false"
  26. android_custom:roundWidth="5dp"/>
  27. </FrameLayout>
  28. <TextView
  29. android:id="@+id/txt_microfan"
  30. android:layout_width="match_parent"
  31. android:layout_height="0dp"
  32. android:layout_weight="1"
  33. android:gravity="center"
  34. android:text="正在录音……"
  35. android:textColor="#3c3c3c"
  36. android:textSize="30px"/>
  37. </LinearLayout>
来自为知笔记(Wiz)

自定义圆环progressbar相关推荐

  1. Android 自定义 圆环,Android 实现自定义圆环

    用途说明: 这是一个自定义的圆环图像,支持动画展示,可以自定义圆环的颜色和占比,主要用以展示一些数据占比方面展示的android圆环. 圆环实现思路: android的自定义圆环实现有很多种方法,这里 ...

  2. Android 自定义 圆环,Android自定义view实现圆环效果实例代码

    先上效果图,如果大家感觉不错,请参考实现代码. 重要的是如何实现自定义的view效果 (1)创建类,继承view,重写onDraw和onMesure方法 public class CirclePerc ...

  3. Android 自定义 圆环,一步步做Android自定义圆环百分比控件

    马上要校招了,有点儿慌,写个自定义控件压压惊 效果图 本来写了一大串近段时间的感慨,还是觉得废话少说比较不容易被喷,直接上效果图 圆环百分比View.gif 就是这个样子,下面记录一下我的编写经历,撸 ...

  4. Android 自定义 圆环,Android自定义View之酷炫圆环(二)

    先看下最终的效果 静态: 动态: 一.开始实现 新建一个DoughnutProgress继承View public class DoughnutProgress extends View { } 先给 ...

  5. 自定义圆环(扇形)绘制

    这个圆环是静态的,没有自动增加的动画 绘制并不复杂,有些细节点容易搞错,这里写出来,算是做个笔记. 先放出源码,细节点,后面会说明.建议看后面的说明.最后,会进行扩展,绘制扇形 需求/功能说明: 1. ...

  6. ios 自定义圆环进度条

    效果 #import <UIKit/UIKit.h>@interface HWCircleView : UIView@property (nonatomic, assign) CGFloa ...

  7. vue3.0 安卓和ios h5 移动端音频自定义圆环可拖拽播放(兼容微信浏览器)

    安装  npm install weixin-js-sdk 引入 import wx from 'weixin-js-sdk' <template> <div class=" ...

  8. 自定义ProgressBar(自定义View和ClipDrawable)

    开发中经常需要自定义ProgressBar,这里用了自定义View和ClipDrawable实现简单的ProgressBar 自定义View效果: public class CustomProgres ...

  9. Android踩坑日记:自定义水平和圆形ProgressBar样式

    自定义水平和圆形ProgressBar样式 1.自定义水平ProgressBar样式 ProgressBar分为两种,我们能明确看到进度,不确定的就是不清楚.不确定一个操作需要多长时间来完成,这个时候 ...

最新文章

  1. DC课程笔记-数字逻辑综合工具-DC Synthesis Optimization Techniques
  2. 巧用ActionFilterAttribute实现API日志的记录
  3. android pdu 编码规则,[转载]PDU编码规则
  4. 多线程下实现自增的几种方式
  5. 经典面试题(32):以下代码将输出的结果是什么?
  6. Vue学习笔记(3)(Vue CLI)
  7. vue验证整数_vue input 输入校验字母数字组合且长度小于30的实现代码
  8. python def函数调用内容_基本的python,def函数和文本菜单的调用
  9. [Django]模型提高部分--聚合(group by)和条件表达式+数据库函数
  10. 超市库存管理java sql_超市仓库管理系统的设计与实现(MySQL)
  11. 程序员10大修炼之道,学会这些月入百万不是梦
  12. 软件设计师刷题(2)
  13. (DDIA)SQL与NoSQL数据模型简介
  14. Intel开发手册下载地址
  15. [紧急]华展云再次连夜更新200余本16年会刊,2016年会刊量级已达全网第一
  16. STM32入门-区别ORD,BSRR,BRR寄存器
  17. CVPR2022——Not All Points Are Equal : IA-SSD
  18. 利用SelectPdf插件将网页生成PDF
  19. 0359-模型训练和部署-Iris数据集
  20. RenPy 对话框(跟随人物移动)

热门文章

  1. Inside Dynamics Axapta源代码赏析(五)
  2. Spring 2.5 基于注解驱动的 Spring MVC
  3. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 抽象业务逻辑函数 )
  4. 【Android 逆向】Android 系统文件分析 ( /system/ 系统命令和系统应用数据目录 | /system/app/ 系统应用目录 | sys Linux 系统内核文件目录 )
  5. 【Android 逆向】x86 汇编 ( push / pop 入栈 / 出栈 指令 | ret / retn 函数调用返回指令 | set 设置目标值指令 )
  6. 【计算机网络】网络层 : 总结 ( 功能 | 数据交换 | IP 数据报 | IPv4 地址 | IPv6 地址 | 路由选择协议 | 路由算法 )★★★
  7. 【Android 性能优化】应用启动优化 ( 阶段总结 | Trace 文件分析及解决方案 | 源码分析梳理 | 设置主题的方案总结 ) ★
  8. clipboard_monitor_in_win7
  9. leetcode(78)子集
  10. 【已解决】wepy中使用分包加载报错