1. /**
  2. * @FileName CircleProgressBar.java
  3. * @Package com.read.view
  4. * @Description TODO
  5. * @Author Alpha
  6. * @Date 2015-7-30 下午4:52:24
  7. * @Version V1.0
  8.  
  9. */
  10. package com.read.view;
  11. import com.read.cnblogs.R;
  12.  
  13. import android.animation.Animator;
  14. import android.animation.ObjectAnimator;
  15. import android.animation.ValueAnimator;
  16. import android.content.Context;
  17. import android.content.res.TypedArray;
  18. import android.graphics.Canvas;
  19. import android.graphics.Color;
  20. import android.graphics.ColorFilter;
  21. import android.graphics.Paint;
  22. import android.graphics.PixelFormat;
  23. import android.graphics.Rect;
  24. import android.graphics.RectF;
  25. import android.graphics.Paint.Cap;
  26. import android.util.AttributeSet;
  27. import android.util.Property;
  28. import android.view.View;
  29. import android.view.animation.AccelerateDecelerateInterpolator;
  30. import android.view.animation.DecelerateInterpolator;
  31. import android.view.animation.Interpolator;
  32. import android.view.animation.LinearInterpolator;
  33.  
  34. public class CircleProgressBar extends View {
  35.  
  36. private static final Interpolator ANGLE_INTERPOLATOR = new LinearInterpolator();
  37. private static final Interpolator SWEEP_INTERPOLATOR = new AccelerateDecelerateInterpolator();
  38. private static final int ANGLE_ANIMATOR_DURATION = 2000;
  39. private static final int SWEEP_ANIMATOR_DURATION = 900;
  40. private static final int MIN_SWEEP_ANGLE = 30;
  41. private static final int DEFAULT_BORDER_WIDTH = 3;
  42. private final RectF fBounds = new RectF();
  43.  
  44. private ObjectAnimator mObjectAnimatorSweep;
  45. private ObjectAnimator mObjectAnimatorAngle;
  46. private boolean mModeAppearing = true;
  47. private Paint mPaint;
  48. private float mCurrentGlobalAngleOffset;
  49. private float mCurrentGlobalAngle;
  50. private float mCurrentSweepAngle;
  51. private float mBorderWidth;
  52. private boolean mRunning;
  53. private int[] mColors;
  54.  
  55. public CircleProgressBar(Context context) {
  56. this(context, null);
  57. }
  58.  
  59. public CircleProgressBar(Context context, AttributeSet attrs) {
  60. this(context, attrs, 0);
  61. }
  62.  
  63. public CircleProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
  64. super(context, attrs, defStyleAttr);
  65.  
  66. float density = context.getResources().getDisplayMetrics().density;
  67. TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircularProgress, defStyleAttr, 0);
  68. mBorderWidth = a.getDimension(R.styleable.CircularProgress_borderWidth,
  69. DEFAULT_BORDER_WIDTH * density);
  70. a.recycle();
  71. mColors = new int[2];
  72. mColors[0] = context.getResources().getColor(R.color.pink);
  73. //mColors[1]=context.getResources().getColor(R.color.pink);
  74.  
  75. // mCurrentColorIndex = 0;
  76. // mNextColorIndex = 1;
  77.  
  78. mPaint = new Paint();
  79. mPaint.setAntiAlias(true);
  80. mPaint.setStyle(Paint.Style.STROKE);
  81. mPaint.setStrokeCap(Cap.ROUND);
  82. mPaint.setStrokeWidth(mBorderWidth);
  83. mPaint.setColor(mColors[0]);
  84.  
  85. setupAnimations();
  86. }
  87.  
  88. private void start() {
  89. if (mRunning) {
  90. return;
  91. }
  92. mRunning = true;
  93. mObjectAnimatorAngle.start();
  94. mObjectAnimatorSweep.start();
  95. invalidate();
  96. }
  97.  
  98. private void stop() {
  99. if (!mRunning) {
  100. return;
  101. }
  102. mRunning = false;
  103. mObjectAnimatorAngle.cancel();
  104. mObjectAnimatorSweep.cancel();
  105. invalidate();
  106. }
  107.  
  108. @Override
  109. protected void onVisibilityChanged(View changedView, int visibility) {
  110. super.onVisibilityChanged(changedView, visibility);
  111. if (visibility == VISIBLE) {
  112. start();
  113. } else {
  114. stop();
  115. }
  116. }
  117.  
  118. @Override
  119. protected void onAttachedToWindow() {
  120. start();
  121. super.onAttachedToWindow();
  122. }
  123.  
  124. @Override
  125. protected void onDetachedFromWindow() {
  126. stop();
  127. super.onDetachedFromWindow();
  128. }
  129. @Override
  130. protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  131. super.onSizeChanged(w, h, oldw, oldh);
  132. fBounds.left = mBorderWidth / 2f + .5f;
  133. fBounds.right = w - mBorderWidth / 2f - .5f;
  134. fBounds.top = mBorderWidth / 2f + .5f;
  135. fBounds.bottom = h - mBorderWidth / 2f - .5f;
  136. }
  137.  
  138. @Override
  139. public void draw(Canvas canvas) {
  140. super.draw(canvas);
  141. float startAngle = mCurrentGlobalAngle - mCurrentGlobalAngleOffset;
  142. float sweepAngle = mCurrentSweepAngle;
  143. if (mModeAppearing) {
  144. mPaint.setColor(mColors[0]);
  145. sweepAngle += MIN_SWEEP_ANGLE;
  146. } else {
  147. startAngle = startAngle + sweepAngle;
  148. sweepAngle = 360 - sweepAngle - MIN_SWEEP_ANGLE;
  149. }
  150. canvas.drawArc(fBounds, startAngle, sweepAngle, false, mPaint);//画弧线
  151. }
  152.  
  153. // private static int gradient(int color1, int color2, float p) {
  154. // int r1 = (color1 & 0xff0000) >> 16;
  155. // int g1 = (color1 & 0xff00) >> 8;
  156. // int b1 = color1 & 0xff;
  157. // int r2 = (color2 & 0xff0000) >> 16;
  158. // int g2 = (color2 & 0xff00) >> 8;
  159. // int b2 = color2 & 0xff;
  160. // int newr = (int) (r2 * p + r1 * (1 - p));
  161. // int newg = (int) (g2 * p + g1 * (1 - p));
  162. // int newb = (int) (b2 * p + b1 * (1 - p));
  163. // return Color.argb(200, newr, newg, newb);
  164. // }
  165.  
  166. private void toggleAppearingMode() {
  167. mModeAppearing = !mModeAppearing;
  168. if (mModeAppearing) {
  169. // mCurrentColorIndex = ++mCurrentColorIndex % 4;
  170. // mNextColorIndex = ++mNextColorIndex % 4;
  171. mCurrentGlobalAngleOffset = (mCurrentGlobalAngleOffset + MIN_SWEEP_ANGLE * 2) % 360;
  172. }
  173. }
  174. // ////////////////////////////////////////////////////////////////////////////
  175. // ////////////// Animation
  176.  
  177. private Property<CircleProgressBar, Float> mAngleProperty = new Property<CircleProgressBar, Float>(Float.class, "angle") {
  178. @Override
  179. public Float get(CircleProgressBar object) {
  180. return object.getCurrentGlobalAngle();
  181. }
  182.  
  183. @Override
  184. public void set(CircleProgressBar object, Float value) {
  185. object.setCurrentGlobalAngle(value);
  186. }
  187. };
  188.  
  189. private Property<CircleProgressBar, Float> mSweepProperty = new Property<CircleProgressBar, Float>(Float.class, "arc") {
  190. @Override
  191. public Float get(CircleProgressBar object) {
  192. return object.getCurrentSweepAngle();
  193. }
  194.  
  195. @Override
  196. public void set(CircleProgressBar object, Float value) {
  197. object.setCurrentSweepAngle(value);
  198. }
  199. };
  200.  
  201. private void setupAnimations() {
  202. mObjectAnimatorAngle = ObjectAnimator.ofFloat(this, mAngleProperty, 360f);
  203. mObjectAnimatorAngle.setInterpolator(ANGLE_INTERPOLATOR);
  204. mObjectAnimatorAngle.setDuration(ANGLE_ANIMATOR_DURATION);
  205. mObjectAnimatorAngle.setRepeatMode(ValueAnimator.RESTART);
  206. mObjectAnimatorAngle.setRepeatCount(ValueAnimator.INFINITE);
  207.  
  208. mObjectAnimatorSweep = ObjectAnimator.ofFloat(this, mSweepProperty, 360f - MIN_SWEEP_ANGLE * 2);
  209. mObjectAnimatorSweep.setInterpolator(SWEEP_INTERPOLATOR);
  210. mObjectAnimatorSweep.setDuration(SWEEP_ANIMATOR_DURATION);
  211. mObjectAnimatorSweep.setRepeatMode(ValueAnimator.INFINITE);
  212. mObjectAnimatorSweep.setRepeatCount(ValueAnimator.INFINITE);
  213. mObjectAnimatorSweep.addListener(new Animator.AnimatorListener() {
  214. @Override
  215. public void onAnimationStart(Animator animation) {
  216.  
  217. }
  218.  
  219. @Override
  220. public void onAnimationEnd(Animator animation) {
  221.  
  222. }
  223.  
  224. @Override
  225. public void onAnimationCancel(Animator animation) {
  226.  
  227. }
  228.  
  229. @Override
  230. public void onAnimationRepeat(Animator animation) {
  231. toggleAppearingMode();
  232. }
  233. });
  234.  
  235. }
  236.  
  237. public void setCurrentGlobalAngle(float currentGlobalAngle) {
  238. mCurrentGlobalAngle = currentGlobalAngle;
  239. invalidate();
  240. }
  241.  
  242. public float getCurrentGlobalAngle() {
  243. return mCurrentGlobalAngle;
  244. }
  245.  
  246. public void setCurrentSweepAngle(float currentSweepAngle) {
  247. mCurrentSweepAngle = currentSweepAngle;
  248. invalidate();
  249. }
  250.  
  251. public float getCurrentSweepAngle() {
  252. return mCurrentSweepAngle;
  253. }
  254. }

ProgressBar 源码的更多相关文章

  1. 45个android实例源码

    分享45个android实例源码,很好很强大http://www.apkbus.com/android-20978-1-1.html andriod闹钟源代码http://www.apkbus.com ...

  2. 分享45个android实例源码,很好很强大

    分享45个android实例源码,很好很强大 http://www.apkbus.com/android-20978-1-1.html 分享45个android实例源码,很好很强大http://www ...

  3. android 在线升级借助开源中国App源码

    android 在线升级借助开源中国App源码 http://www.cnblogs.com/luomingui/p/3949429.html android 在线升级借助开源中国App源码分析如下: ...

  4. AsyncTask源码分析

    在Android中,主线程是UI线程,当需要根据其他数据进行更新UI时,如果获取数据的操作比较耗时的话,会触发ANR,所以我们应该讲耗时的操作进行异步操作,尤其是请求网络数据的操作应该放在后台线程进行 ...

  5. ExtJS学习之路第四步:看源码,实战MessageBox

    可以通过看MessageBox.js的源码来深入认识,记住它的主要用法.Ext.MessageBox是实用类,用于生成不同风格的消息框,它是Singleton(单例),别名Ext.Msg.注意Mess ...

  6. android源码解析(十七)-->Activity布局加载流程

    版权声明:本文为博主原创文章,未经博主允许不得转载. 好吧,终于要开始讲讲Activity的布局加载流程了,大家都知道在Android体系中Activity扮演了一个界面展示的角色,这也是它与andr ...

  7. 转--2014年最新810多套android源码2.46GB免费一次性打包下载

    转载自:http://www.eoeandroid.com/thread-497046-1-1.html 感谢该博客主人无私奉献~~ 下面的源码是从今年3月份开始不断整理源码区和其他网站上的安卓例子源 ...

  8. 非常出色的一款WinForm窗体重绘GUI类库源码

    基本控件的演示 ScrollBar滚动条 各种圆形进度条 ProgressBar进度条 Mdi演示,仿谷歌浏览器 多种皮肤可供选择 一套专业级别的GUI控件,目前包含了窗体.进度条.滚动条以及MDI多 ...

  9. C#源码大汇总

    C#高仿QQ2013可在广域网部署聊天系统GG叽叽 动态显示硬盘分区容量饼图 自定义ProgressBar控件高仿Win8进度条 多皮肤精美在线QQ悬浮客服插件 jQuery仿天猫首页多格焦点图片轮播 ...

随机推荐

  1. 查看当前正在运行的activity

    找到sdk的安装路径,比如我的是 D:\prostu\Android\android-sdk\tools该路径下的: hierarchyviewer.bat 双击,可以用此工具查看设备跑的是当前的哪个 ...

  2. 在ubuntu上配置nginx+php+mysql+phpmyadmin

    1.先更新ubuntu系统 更新命令 sudo apt-get update sudo apt-get upgrade 2 添加ubuntu nginx更新源镜像 cd /etc/apt/ sudo ...

  3. C++模板&泛型编程

    ---恢复内容开始--- 一.泛型编程 定义:编写与类型无关的逻辑代码,是代码复用的一种手段.模板是泛型编程的基础 模板分为:函数模板和类模板 函数模板:代表了一个函数家族,该函数与类型无关,在使用时 ...

  4. 在docker里部署网络服务

    之前试着玩玩docker有一阵子了,今天算是头一回正式在docker里部署网络服务. 本来想和lxc差不多的东西那自然是手到擒来,没想到还是改了很多. 第一个遇到的问题是,远程连到docker宿主机干 ...

  5. Xml文件并发读写的解决方法

    之前对xml的操作大都是通过XmlDocument对象来进行,但是这样的情况对于没有并发的是非常合适的,最近遇到了并发读写xml文件的情况.通过文件流来操作能解决大部分的并发情况,对于极端的情况会有问 ...

  6. SQL Server选取本周或上一周数据

    有关SQL Server中有关周的数据查询主要思路来自下面这个语句 select getdate(), dateadd(wk, datediff(wk, 0, DateAdd(Day,-1,getda ...

  7. Linux 网络编程(多路复用)

    服务器端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/soc ...

  8. 免费打造自己的个人网站,免费域名、免费空间、FTP、数据库什么的,一个不能少,没钱,也可以这么任性

    作为一名程序猿,拥有自己的个人网站,是一件多么有逼格的事~~至于个人网站的好处嘛?那是多的说都说不完啊~~例如我们可以放自己的作品,展示自己的风采,放自己女神的照片(女神看到后会怎么样,自己想吧,哈哈 ...

  9. COM思想的背后

    最近看公司的一些新产品和框架 , 发现清一色的“COM思想架构 ”, 这里说的“COM思想架构”是指不完全是标准COM组件的方式,而是指在设计上用到了COM思想. COM组件技术大概在1993年产生, ...

  10. 《OOC》笔记(4)——自动化地将C#代码转化为C代码(结构版)

    <OOC>笔记(4)——自动化地将C#代码转化为C代码(结构版) 我在<C表达面向对象语言的机制——C#版>中已经说明了从C#到C的转换方法.这次看<OOC>也是想 ...