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. emum类(2)

    emum定义如下: public abstract class Enum<E extends Enum<E>>extends Objectimplements Comparab ...

  2. java中Class.getResource用法

    用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file ...

  3. 通过LinQ查询字符出现次数

    在一个项目中使用到一个问卷调查,在用户完成之后,需要统计所有题目中哪一个选项被选中次数最多. 我的实现方法是将所有题目选中的选项拼接为一个字符串,如:ABCADAA 在分析被选中次数的时候最初是将字符 ...

  4. .NET Socket TCP 50W在线连接交互测试

    在平常的交流中经常有人问.net socket能支持多少在线?和C++或linux下比起来应该差很远吧?其实产生这样问题的主要原因是.net很少人去做这方面的测试,而在linux下则经常听到什么100 ...

  5. ASP.NET MVC 4源码分析之如何定位控制器

    利用少有的空余时间,详细的浏览了下ASP.NET MVC 4的源代码.照着之前的步伐继续前进(虽然博客园已经存在很多大牛对MVC源码分析的博客,但是从个人出发,还是希望自己能够摸索出这些).首先有一个 ...

  6. Helios与Katana的区别

    Helios与Katana都是微软开发的基于IIS的OWIN实现. 它们之间的区别很简单:Helios不依赖于ASP.NET Runtime,Katana依赖于ASP.NET Runtime. Hel ...

  7. SRS用列建模

    基本规则: 五子棋是两个人之间进行的竞技活动,由于对黑方白方 规则不同,黑棋必须先行.五子棋专用盘为 15×15 , 五连子的方向为横.竖.斜. 禁手是对局中被判为负的行棋手段.白棋无禁手. 在棋盘上 ...

  8. [51单片机] nRF24L01 无线模块 测试 按键-灯-远程控制

    哈哈,穷吊死一个,自己做的一个超简单的板还没有电源提供,只得借助我的大开发板啦.其实这2个模块是完全可以分开的,无线嘛,你懂得!进入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过 ...

  9. iOS——Command-Line 查看当前SDK版本并修改默认SDK版本

    在工作中可能会碰到用命令行编译.打包iOS应用程序的情况(xcodebuild相关命令). 但是由于SDK版本问题,会报错,说某SDK版本不对,可能是因为升级Xcode导致的SDK版本升级,为了避免高 ...

  10. Java面向对象概述

    一.什么是面向对象? 现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,如人类.书桌.计算机.高楼大厦等.人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的 ...