Android 自定义View (三) 圆环交替 等待效果
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24500107
一个朋友今天有这么个需求(下图),我觉得那自定义View来做还是很适合的,就做了下,顺便和大家分享下,对于自定义View多练没坏处么。如果你看了前两篇,那么这篇一定so easy 。
效果就这样,分析了一下,大概有这几个属性,两个颜色,一个速度,一个圆环的宽度。
还是我们自定View的那几个步骤:
1、自定义View的属性
2、在View的构造方法中获得我们自定义的属性
[ 3、重写onMesure ]
4、重写onDraw
-------------------------------------------------------------------------------------------------------------------
1、自定义属性:
- <?xml version="1.0" encoding="utf-8"?>
 - <resources>
 - <attr name="firstColor" format="color" />
 - <attr name="secondColor" format="color" />
 - <attr name="circleWidth" format="dimension" />
 - <attr name="speed" format="integer" />
 - <declare-styleable name="CustomProgressBar">
 - <attr name="firstColor" />
 - <attr name="secondColor" />
 - <attr name="circleWidth" />
 - <attr name="speed" />
 - </declare-styleable>
 - </resources>
 
2、在View的构造方法中获得我们自定义的属性
- /**
 - * 第一圈的颜色
 - */
 - private int mFirstColor;
 - /**
 - * 第二圈的颜色
 - */
 - private int mSecondColor;
 - /**
 - * 圈的宽度
 - */
 - private int mCircleWidth;
 - /**
 - * 画笔
 - */
 - private Paint mPaint;
 - /**
 - * 当前进度
 - */
 - private int mProgress;
 - /**
 - * 速度
 - */
 - private int mSpeed;
 - /**
 - * 是否应该开始下一个
 - */
 - private boolean isNext = false;
 - public CustomProgressBar(Context context, AttributeSet attrs)
 - {
 - this(context, attrs, 0);
 - }
 - public CustomProgressBar(Context context)
 - {
 - this(context, null);
 - }
 - /**
 - * 必要的初始化,获得一些自定义的值
 - *
 - * @param context
 - * @param attrs
 - * @param defStyle
 - */
 - public CustomProgressBar(Context context, AttributeSet attrs, int defStyle)
 - {
 - super(context, attrs, defStyle);
 - TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomProgressBar, defStyle, 0);
 - int n = a.getIndexCount();
 - for (int i = 0; i < n; i++)
 - {
 - int attr = a.getIndex(i);
 - switch (attr)
 - {
 - case R.styleable.CustomProgressBar_firstColor:
 - mFirstColor = a.getColor(attr, Color.GREEN);
 - break;
 - case R.styleable.CustomProgressBar_secondColor:
 - mSecondColor = a.getColor(attr, Color.RED);
 - break;
 - case R.styleable.CustomProgressBar_circleWidth:
 - mCircleWidth = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
 - TypedValue.COMPLEX_UNIT_PX, 20, getResources().getDisplayMetrics()));
 - break;
 - case R.styleable.CustomProgressBar_speed:
 - mSpeed = a.getInt(attr, 20);// 默认20
 - break;
 - }
 - }
 - a.recycle();
 - mPaint = new Paint();
 - // 绘图线程
 - new Thread()
 - {
 - public void run()
 - {
 - while (true)
 - {
 - mProgress++;
 - if (mProgress == 360)
 - {
 - mProgress = 0;
 - if (!isNext)
 - isNext = true;
 - else
 - isNext = false;
 - }
 - postInvalidate();
 - try
 - {
 - Thread.sleep(mSpeed);
 - } catch (InterruptedException e)
 - {
 - e.printStackTrace();
 - }
 - }
 - };
 - }.start();
 - }
 
3、直接重写onDraw,这不需要重写onMeasure
- @Override
 - protected void onDraw(Canvas canvas)
 - {
 - int centre = getWidth() / 2; // 获取圆心的x坐标
 - int radius = centre - mCircleWidth / 2;// 半径
 - mPaint.setStrokeWidth(mCircleWidth); // 设置圆环的宽度
 - mPaint.setAntiAlias(true); // 消除锯齿
 - mPaint.setStyle(Paint.Style.STROKE); // 设置空心
 - RectF oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius); // 用于定义的圆弧的形状和大小的界限
 - if (!isNext)
 - {// 第一颜色的圈完整,第二颜色跑
 - mPaint.setColor(mFirstColor); // 设置圆环的颜色
 - canvas.drawCircle(centre, centre, radius, mPaint); // 画出圆环
 - mPaint.setColor(mSecondColor); // 设置圆环的颜色
 - canvas.drawArc(oval, -90, mProgress, false, mPaint); // 根据进度画圆弧
 - } else
 - {
 - mPaint.setColor(mSecondColor); // 设置圆环的颜色
 - canvas.drawCircle(centre, centre, radius, mPaint); // 画出圆环
 - mPaint.setColor(mFirstColor); // 设置圆环的颜色
 - canvas.drawArc(oval, -90, mProgress, false, mPaint); // 根据进度画圆弧
 - }
 - }
 
大功完成了,当然了,唯一比较纠结的地方就是两个颜色何时切换,如何切换,我采用上面的办法,你也可以自己想想怎么实现。
好了,各位看官留个言,顶一个吧~
源码点击下载
Android 自定义View (三) 圆环交替 等待效果的更多相关文章
- Android自定义View之圆环交替 等待效果
		
学习了前面两篇的知识,对于本篇实现的效果,相信大家都不会感觉太困难,我要实现的效果是什么样呢?下面请先看效果图: 看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制. 首 ...
 - Android自定义View——彩色圆环统计图
		
1.初始化变量 圆的粗细:圆环的大小. 标注:文字前面的圆点. 分配比例大小:由于需要计算圆环扫过的角度,计算方法使用:(比例/100)*360度,用百分比算出360度占用了多少,由于比例/100 ...
 - android自定义view实现公章效果
		
上次去一个公司面试,面试官问了一个题,怎么用android的自定义view实现一个公章的效果,据说这是华为之前的面试题,我想了下,要是公章的效果,最外层是一个圆,里面是一个五角星,但是这文字怎么画呢, ...
 - Android自定义View 画弧形,文字,并增加动画效果
		
一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类 B ...
 - Android 自定义 view(三)—— onDraw 方法理解
		
前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...
 - Android自定义View(LimitScrollerView-仿天猫广告栏上下滚动效果)
		
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/53303872 本文出自:[openXu的博客] 1分析 2定义组合控件布局 3继承最外层控件 ...
 - 【朝花夕拾】Android自定义View篇之(四)自定义View的三种实现方式及自定义属性使用介绍
		
前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10979161.html],谢谢! 尽管Android系统提供了不少控件,但是有很多酷炫效果仍然 ...
 - Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程
		
转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...
 - Android自定义View(三、深入解析控件测量onMeasure)
		
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51490283 本文出自:[openXu的博客] 目录: onMeasure什么时候会被调用 ...
 
随机推荐
- tomcat报404
			
很久没有用eclipse了,尝试了使用下,竟然将简单的配置tomcat都忘了. 自己新建一个工程,在tomcat发布以后,报404,经查Serves下的web.xml中,欢迎页面是index.jsp, ...
 - 使用<pre>标签为你的网页加入大段代码
			
在上节中介绍加入一行代码的标签为<code>,但是在大多数情况下是需要加入大段代码的,如下图: 怎么办?不会是每一代码都加入一个<code>标签吧,没有这么复杂,这时候就可以使 ...
 - Swift - 12 - 区间运算符和for-in
			
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
 - python下	help()使用方法
			
查看python所有的modules:help("modules") 单看python所有的modules中包含指定字符串的modules: help("modules ...
 - 12_RHEL7.1普通用户添加sudo权限
			
1.关于sudo Sudo是linux系统中,非root权限的用户提升自己权限来执行某些特性命令的方式,它使普通用户在不知道超级用户的密码的情况下,也可以暂时的获得root权限. 一 ...
 - z-index的理解 z-index 属性仅在节点的 position 属性为 relative, absolute 或者 fixed 时生效.
			
今天做游戏的Exercise模式的时候,发现把所有的div设置为position:absolute;后,点击play进入到游戏界面的时候,鼠标点击数字的时候,完全没反应.经过我的反复检查,发现只要给所 ...
 - 使用grunt压缩css是能否设置background-size不压缩进去呢?否则ie8不能识别
			
.index-bg{ background:url(img/index-bg-t.5344b19d.jpg) center center/cover no-repeat } 比如上面这样ie8不能识别 ...
 - Subversion 1.7 Eclipse integration in Ubuntu12(转载)
			
原文链接:http://steveliles.github.io/subversion_1_7_eclipse_integration_in_ubuntu.html Getting Subversio ...
 - history对象属性和方法
			
history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起,history是window对象的属性,因此每个浏览器窗口.每个标签页乃至每个框架,都有自 己的history对象和特定的wind ...
 - Python学习笔记:07异常
			
异常 Python用异常对象(Exception Object)来表示异常情况,当异常未被捕获时,就会产生回溯(Traceback) 异常分类 內建异常类:Exception,AttributeErr ...