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>

自定义圆环progressbar的更多相关文章

  1. Android自定义圆形ProgressBar

    闲来无事做了一个自定义的进度条,大致效果图如下: progressbar.gif 废话不多说,下面直接上代码: 自定义控件代码CircleProgressBar.java: public class ...

  2. Android开发 View_自定义圆环进度条View

    前言 一个实现,空心圆环的自定义View,已经封装完好,可以直接使用. 效果图 代码 import android.content.Context; import android.graphics.C ...

  3. Android简单自定义圆形和水平ProgressBar

    ProgressBar简介 继承于View类,直接子类有AbsSeekBar和ContentLoadingProgressBar,其中AbsSeekBar的子类有SeekBar和RatingBar,可 ...

  4. Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)

      Android 高手进阶(21)  版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明地址:http://blog.csdn.net/xiaanming/article/detail ...

  5. Android 自定义View修炼-自定义View-带百分比进度的圆形进度条(采用自定义属性)

    很多的时候,系统自带的View满足不了我们功能的需求,那么我们就需要自己来自定义一个能满足我们需求的View,自定义View我们需要先继承View,添加类的构造方法,重写父类View的一些方法,例如o ...

  6. Android 自定义通用的loadingview

    介绍 好久没有写博客啦,最近在接近新年了,年前的工作都要收尾,所以特别忙,周末抽空写了个通用的加载view,写篇博客分享出来. 功能 1.显示加载视图,加载失败的时候显示加载失败视图,数据为空时显示数 ...

  7. Android ProgressBar的使用

    Android 基础教程之-------Android ProgressBar的使用http://blog.csdn.net/Android_Tutor/article/details/5695170 ...

  8. Android-自定义圆环

    效果图: 布局的代码,指定引用自定义View类: <!-- 绘制圆环 --> <LinearLayout xmlns:android="http://schemas.and ...

  9. 中级实训Android学习记录——Toast、AlertDialog、ProgressBar

    学习记录 2020/11/22 Toast Toast Toast是一个消息提示组件 我们可以设置其显示的位置 自定义其显示的内容 对Toast的简单封装可以达到不同的目的 Toast的默认用法 To ...

随机推荐

  1. php url rewrite

    1.检测Apache是否支持mod_rewrite 通过php提供的phpinfo()函数查看环境配置,通过Ctrl+F查找到“Loaded Modules”,其中列出了所有apache2handle ...

  2. (转)SpringSecurity扩展User类,获取Session

    1.在session中取得spring security的登录用户名如下 ${session.SPRING_SECURITY_CONTEXT.authentication.principal.user ...

  3. 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接

    长久以来,我们被教导字符串的连接最好用StringBuffer.StringBuilder,但是我们却不知道这两者之间的区别.跟字符串相关的一些方法中总是有CharSequence.StringBuf ...

  4. [chrome插件分享] gitlab-tree 更方便的浏览Gitlab上的代码

    说明 经常玩Github的人肯定都知道大名鼎鼎的octotree吧,这款chrome插件可以说是浏览代码的神器,利用左侧的树形菜单可以很方便的打开目录.浏览文件等,加上Github全站本身使用了pja ...

  5. Linux 进程间通信(一)

    Linux 进程间通信 进程是一个独立的资源分配单位,不同进程之间的资源是相互独立的,没有关联,不能在一个进程中直接访问另一个进程中的资源.但是,进程不是孤立的,不同的进程之间需要信息的交换以及状态的 ...

  6. 免费好用的web应用托管平台-续

    上一篇博客给大家推荐了目前处于免费阶段的PAAS平台,可以托管各种应用,大家反响很不错,说明大家还是很需要和认可这个免费托管各种web应用的京东云擎平台.但是很多用户还是很担心未来可能还是会收费,对于 ...

  7. ios 项目里常用的宏

    NSLog(@"__func__ :  %s", __func__);//oc测试环境,打印文件名,方法名 NSLog(@"__FUNCTION__ : %s" ...

  8. [Java拾遗三]JavaWeb基础之Servlet

    Servlet    1,servlet介绍        servlet是一项动态web资源开发技术.        运行在服务器端.        作用:处理业务逻辑,生成动态的内容,返回给浏览器 ...

  9. paip.php 与js 的相似性以及为什么它们这么烂还很流行。。

    paip.php 与js 的相似性以及为什么它们这么烂还很流行.. php与js异常的流行,web 90%都被他们统治了.发现了他们有意思的一些共性.. 结构一番总结,得出了它们共有的特点.特性: = ...

  10. LLVM和GCC的区别

    最近在Mac OS X Mountain Lion下用Xcode进行开发,发现在编译选项里有如下所示的这两种编译器:一个是Apple LLVM compiler 4.2,另外一个是LLVM GCC 4 ...