转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24500107

一个朋友今天有这么个需求(下图),我觉得那自定义View来做还是很适合的,就做了下,顺便和大家分享下,对于自定义View多练没坏处么。如果你看了前两篇,那么这篇一定so easy 。

效果就这样,分析了一下,大概有这几个属性,两个颜色,一个速度,一个圆环的宽度。

还是我们自定View的那几个步骤:

1、自定义View的属性

2、在View的构造方法中获得我们自定义的属性

[ 3、重写onMesure ]

4、重写onDraw

-------------------------------------------------------------------------------------------------------------------

1、自定义属性:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <attr name="firstColor" format="color" />
  4. <attr name="secondColor" format="color" />
  5. <attr name="circleWidth" format="dimension" />
  6. <attr name="speed" format="integer" />
  7. <declare-styleable name="CustomProgressBar">
  8. <attr name="firstColor" />
  9. <attr name="secondColor" />
  10. <attr name="circleWidth" />
  11. <attr name="speed" />
  12. </declare-styleable>
  13. </resources>

2、在View的构造方法中获得我们自定义的属性

  1. /**
  2. * 第一圈的颜色
  3. */
  4. private int mFirstColor;
  5. /**
  6. * 第二圈的颜色
  7. */
  8. private int mSecondColor;
  9. /**
  10. * 圈的宽度
  11. */
  12. private int mCircleWidth;
  13. /**
  14. * 画笔
  15. */
  16. private Paint mPaint;
  17. /**
  18. * 当前进度
  19. */
  20. private int mProgress;
  21. /**
  22. * 速度
  23. */
  24. private int mSpeed;
  25. /**
  26. * 是否应该开始下一个
  27. */
  28. private boolean isNext = false;
  29. public CustomProgressBar(Context context, AttributeSet attrs)
  30. {
  31. this(context, attrs, 0);
  32. }
  33. public CustomProgressBar(Context context)
  34. {
  35. this(context, null);
  36. }
  37. /**
  38. * 必要的初始化,获得一些自定义的值
  39. *
  40. * @param context
  41. * @param attrs
  42. * @param defStyle
  43. */
  44. public CustomProgressBar(Context context, AttributeSet attrs, int defStyle)
  45. {
  46. super(context, attrs, defStyle);
  47. TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomProgressBar, defStyle, 0);
  48. int n = a.getIndexCount();
  49. for (int i = 0; i < n; i++)
  50. {
  51. int attr = a.getIndex(i);
  52. switch (attr)
  53. {
  54. case R.styleable.CustomProgressBar_firstColor:
  55. mFirstColor = a.getColor(attr, Color.GREEN);
  56. break;
  57. case R.styleable.CustomProgressBar_secondColor:
  58. mSecondColor = a.getColor(attr, Color.RED);
  59. break;
  60. case R.styleable.CustomProgressBar_circleWidth:
  61. mCircleWidth = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
  62. TypedValue.COMPLEX_UNIT_PX, 20, getResources().getDisplayMetrics()));
  63. break;
  64. case R.styleable.CustomProgressBar_speed:
  65. mSpeed = a.getInt(attr, 20);// 默认20
  66. break;
  67. }
  68. }
  69. a.recycle();
  70. mPaint = new Paint();
  71. // 绘图线程
  72. new Thread()
  73. {
  74. public void run()
  75. {
  76. while (true)
  77. {
  78. mProgress++;
  79. if (mProgress == 360)
  80. {
  81. mProgress = 0;
  82. if (!isNext)
  83. isNext = true;
  84. else
  85. isNext = false;
  86. }
  87. postInvalidate();
  88. try
  89. {
  90. Thread.sleep(mSpeed);
  91. } catch (InterruptedException e)
  92. {
  93. e.printStackTrace();
  94. }
  95. }
  96. };
  97. }.start();
  98. }

3、直接重写onDraw,这不需要重写onMeasure

  1. @Override
  2. protected void onDraw(Canvas canvas)
  3. {
  4. int centre = getWidth() / 2; // 获取圆心的x坐标
  5. int radius = centre - mCircleWidth / 2;// 半径
  6. mPaint.setStrokeWidth(mCircleWidth); // 设置圆环的宽度
  7. mPaint.setAntiAlias(true); // 消除锯齿
  8. mPaint.setStyle(Paint.Style.STROKE); // 设置空心
  9. RectF oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius); // 用于定义的圆弧的形状和大小的界限
  10. if (!isNext)
  11. {// 第一颜色的圈完整,第二颜色跑
  12. mPaint.setColor(mFirstColor); // 设置圆环的颜色
  13. canvas.drawCircle(centre, centre, radius, mPaint); // 画出圆环
  14. mPaint.setColor(mSecondColor); // 设置圆环的颜色
  15. canvas.drawArc(oval, -90, mProgress, false, mPaint); // 根据进度画圆弧
  16. } else
  17. {
  18. mPaint.setColor(mSecondColor); // 设置圆环的颜色
  19. canvas.drawCircle(centre, centre, radius, mPaint); // 画出圆环
  20. mPaint.setColor(mFirstColor); // 设置圆环的颜色
  21. canvas.drawArc(oval, -90, mProgress, false, mPaint); // 根据进度画圆弧
  22. }
  23. }

大功完成了,当然了,唯一比较纠结的地方就是两个颜色何时切换,如何切换,我采用上面的办法,你也可以自己想想怎么实现。

好了,各位看官留个言,顶一个吧~

源码点击下载

Android 自定义View (三) 圆环交替 等待效果的更多相关文章

  1. Android自定义View之圆环交替 等待效果

    学习了前面两篇的知识,对于本篇实现的效果,相信大家都不会感觉太困难,我要实现的效果是什么样呢?下面请先看效果图: 看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制. 首 ...

  2. Android自定义View——彩色圆环统计图

      1.初始化变量 圆的粗细:圆环的大小. 标注:文字前面的圆点. 分配比例大小:由于需要计算圆环扫过的角度,计算方法使用:(比例/100)*360度,用百分比算出360度占用了多少,由于比例/100 ...

  3. android自定义view实现公章效果

    上次去一个公司面试,面试官问了一个题,怎么用android的自定义view实现一个公章的效果,据说这是华为之前的面试题,我想了下,要是公章的效果,最外层是一个圆,里面是一个五角星,但是这文字怎么画呢, ...

  4. Android自定义View 画弧形,文字,并增加动画效果

    一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类   B ...

  5. Android 自定义 view(三)—— onDraw 方法理解

    前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...

  6. Android自定义View(LimitScrollerView-仿天猫广告栏上下滚动效果)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/53303872 本文出自:[openXu的博客] 1分析 2定义组合控件布局 3继承最外层控件 ...

  7. 【朝花夕拾】Android自定义View篇之(四)自定义View的三种实现方式及自定义属性使用介绍

    前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10979161.html],谢谢! 尽管Android系统提供了不少控件,但是有很多酷炫效果仍然 ...

  8. Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程

    转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...

  9. Android自定义View(三、深入解析控件测量onMeasure)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51490283 本文出自:[openXu的博客] 目录: onMeasure什么时候会被调用 ...

随机推荐

  1. 困扰:C#.net 连接Oracle11g 不报错但是在connection时出现 ServerVersion 引发了“System.InvalidOperationException”类型的异常

    今天在使用VS2008 32位 连接 64位的Oracle11g的数据库时出现 “conn.ServerVersion”引发了“System.InvalidOperationException”类型的 ...

  2. cas sso原理(转)

    采用CAS原理构建单点登录 企业的信息化过程是一个循序渐进的过程,在企业各个业务网站逐步建设的过程中,根据各种业务信息水平的需要构建了相应的应用系统,由于这些应用系统一般是 在不同的时期开发完成的,各 ...

  3. [转载]C++中声明与定义的区别

    C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类的实现放在cpp文件中.它们为什么能够关联到一起呢?你知道什么东西可以放在.h文件中,什么不能.什么东西又可以放在cpp文件中.如果 ...

  4. IOS 在Xcode 4.x以上添加静态库

    参考网站:http://my.oschina.net/edwardlau/blog/95924 常用的代码可以通过静态库进行抽出来作为公共类方法,方便在其他地方调用,一般来说我们要准备2套静态库,一套 ...

  5. 疯狂学习java web5(SSI框架)

    其实前面的所有只是铺垫,目的只是为了了解现有工程是怎样的.之前直接上来就看,看了很久依然是云里雾里,所以不得已学习点基础知识,前面的基础只是蜻蜓点水一带而过,希望能起部分作用了. 发现struct2有 ...

  6. linux的du和df命令

    今天也有同学问我Linux下查看目录大小的命令,现在也将前阵子学习到du/df两个命令总结一下吧.前阵子测试工作中有遇到过由于磁盘空间满导致程序无法执行到情况,所以使用了df和du两个命令. du查看 ...

  7. Python md5 sha1 的使用

    版本: Python 2.7 说明: Python 内置的 hashlib 模块中有 md5 和 sha1 加密方法,可以直接使用. md5加密 import hashlib data = 'This ...

  8. inline-block(行内区块元素)的详解和应用

    说inline-block(行内区块元素)之前,先说下他另外的2个兄弟 display:inline; 内联元素,简单来说就是在同一行显示.他没有高度,给内联元素设置width和height是没效果的 ...

  9. PHP5的对象复制

    今天用yii开发程序,一个bug改了一晚上,最后发现问题出在了对象复制机制上,PHP5之前的对象复制只需要$object_a = $object_b即可,但PHP5这样得到的是浅复制,及指针指向,并不 ...

  10. HDU1465 第六周L题(错排组合数)

    L - 计数,排列 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Descrip ...