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

1、自己定义View的属性

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

3、重写onMesure (不是必须)

4、重写onDraw

自己定义View的属性

 <?

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="progressStyle">
<attr name="firstColor"/>
<attr name="secondColor"/>
<attr name="circleWidth"/>
<attr name="speed"/>
</declare-styleable>
</resources>

自己定义View,而且使用自己定义的View

public class ProgressView extends View {

    /**
* 第一圈的颜色
*/
private int mFirstColor;
/**
* 第二圈的颜色
*/
private int mSecondColor;
/**
* 圈的宽度
*/
private int mCircleWidth;
/**
* 画笔
*/
private Paint mPaint;
/**
* 当前进度
*/
private int mProgress; /**
* 速度
*/
private int mSpeed; /**
* 是否应该開始下一个
*/
private boolean isNext = false;
public ProgressView(Context context) {
this(context, null);
} public ProgressView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public ProgressView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.progressStyle,defStyleAttr,0); int n = typedArray.getIndexCount(); for (int i =0 ;i < n ; i ++){
int attr =typedArray.getIndex(i);
switch (attr){//这里的0,1,2。3相应attrs中declare-styleable name="progressStyle"数组元素的顺序。我是为了举例方便,实际开发中不要这样写
case 0:
mFirstColor = typedArray.getColor(attr, Color.BLACK);
break;
case 1:
mSecondColor = typedArray.getColor(attr, Color.RED);
break;
case 2:
mCircleWidth = typedArray.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
 16,getResources().getDisplayMetrics()));
break;
case 3:
mSpeed = typedArray.getInt(attr,20);
break;
}
}
typedArray.recycle();
mPaint = new Paint();
startMyThread();
} @Override
protected void onDraw(Canvas canvas) {
int center = getWidth() / 2; // 获取圆心的x坐标
int radius = (center - mCircleWidth)/2 ;// 半径 mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(mCircleWidth);
mPaint.setStyle(Paint.Style.STROKE); RectF rectf = new RectF(center-radius,center-radius,center+radius,center+radius);
//颜色的切换
if(!isNext){
canvas.save();
mPaint.setColor(mFirstColor);// 设置圆环的颜色
canvas.drawCircle(center,center,radius,mPaint);//划出圆圈
mPaint.setColor(mSecondColor);
canvas.drawArc(rectf,-90,mProgress,false,mPaint);//依据进度画圆弧
canvas.restore();
}else {
canvas.save();
mPaint.setColor(mSecondColor);// 设置圆环的颜色
canvas.drawCircle(center,center,radius,mPaint);
mPaint.setColor(mFirstColor);
canvas.drawArc(rectf,-90,mProgress,false,mPaint);
canvas.restore();
}
} private void startMyThread() {
new Thread(new Runnable() {
@Override
public void run() {
while (true){
mProgress++;//进度
if(mProgress == 360){//当360度时候值变为初始状态
mProgress = 0; if(!isNext){//设置是否切换颜色开关
isNext = true;
}else {
isNext = false;
} } postInvalidate(); try {
Thread.sleep(mSpeed);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}).start();;
}
<strong>
</strong>



   以上代码就是自己定义View的所有代码,使用的话没什么多说的 直接在Xml中引用这个新建的ProgressView就能够了



重画ondraw   不多解释直接看代码

 @Override
protected void onDraw(Canvas canvas) {
int center = getWidth() / 2; // 获取圆心的x坐标
int radius = (center - mCircleWidth)/2 ;// 半径 mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(mCircleWidth);
mPaint.setStyle(Paint.Style.STROKE); RectF rectf = new RectF(center-radius,center-radius,center+radius,center+radius); if(!isNext){
canvas.save();
mPaint.setColor(mFirstColor);// 设置圆环的颜色
canvas.drawCircle(center,center,radius,mPaint);//划出圆圈
mPaint.setColor(mSecondColor);
canvas.drawArc(rectf,-90,mProgress,false,mPaint);//依据进度画圆弧
canvas.restore();
}else {
canvas.save();
mPaint.setColor(mSecondColor);// 设置圆环的颜色
canvas.drawCircle(center,center,radius,mPaint);
mPaint.setColor(mFirstColor);
canvas.drawArc(rectf,-90,mProgress,false,mPaint);
canvas.restore();
}
}

效果是不是和progress相似呢 。自己试试看吧

由于有的人说效果非常生硬,我就做了个完整的gif图,速度是能够调节的,依据不同的速度值。移动能够调剂频率

【Android自己定义控件】圆圈交替,仿progress效果的更多相关文章

  1. android自己定义控件系列教程-----仿新版优酷评论剧集卡片滑动控件

    我们先来看看优酷的控件是怎么回事? 仅仅响应最后也就是最顶部的卡片的点击事件,假设点击的不是最顶部的卡片那么就先把它放到最顶部.然后在移动到最前面来.重复如次. 知道了这几条那么我们就非常好做了. 里 ...

  2. Android 自己定义控件实现刮刮卡效果 真的就仅仅是刮刮卡么

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40162163 , 本文出自:[张鸿洋的博客] 非常久以前也过一个html5的刮刮 ...

  3. Android自己定义控件系列五:自己定义绚丽水波纹效果

    尊重原创!转载请注明出处:http://blog.csdn.net/cyp331203/article/details/41114551 今天我们来利用Android自己定义控件实现一个比較有趣的效果 ...

  4. Android自己定义控件:进度条的四种实现方式

    前三种实现方式代码出自: http://stormzhang.com/openandroid/2013/11/15/android-custom-loading/ (源代码下载)http://down ...

  5. android 自己定义控件

    Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs ...

  6. Android自己定义控件皮肤

    Android自己定义控件皮肤 对于Android的自带控件,其外观仅仅能说中规中矩,而我们平时所示Android应用中,一个简单的button都做得十分美观.甚至于很多button在按下时的外观都有 ...

  7. android 自己定义控件属性(TypedArray以及attrs解释)

    近期在捣鼓android 自己定义控件属性,学到了TypedArray以及attrs.在这当中看了一篇大神博客Android 深入理解Android中的自己定义属性.我就更加深入学习力一番.我就沿着这 ...

  8. Android自己定义控件系列三:自己定义开关button(二)

    接上一篇自己定义开关button(一)的内容继续.上一次实现了一个开关button的基本功能.即自己定义了一个控件.开关button,实现了点击切换开关状态的功能.今天我们想在此基础之上.进一步实现触 ...

  9. Android自己定义控件之应用程序首页轮播图

    如今基本上大多数的Android应用程序的首页都有轮播图.就是像下图这种(此图为转载的一篇博文中的图.拿来直接用了): 像这种组件我相信大多数的应用程序都会使用到,本文就是自己定义一个这种组件,能够动 ...

  10. Android自己定义控件(状态提示图表)

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重分享成果] 1 背景 前面分析那么多系统源代码了.也该暂停下来歇息一下,趁昨晚闲着看见一个有意思的需求就操 ...

随机推荐

  1. Jupyter运行时出现下面的错误:Unexpected error while saving file: arma/Untitled.ipynb [Errno 13] Permission denied:

    运行环境:Ubuntu16.04+Python2.7执行如下代码修改Jupyter的一部分文件的权限(执行完之后重新启动即可): sudo chmod ~/.local/share/jupyter/ ...

  2. String,StringBuffer与StringBuilder的区别|线程安全与线程不安全

    https://www.cnblogs.com/xingzc/p/6277581.html

  3. H5图片压缩上传

    1.所用到技术 HTML5 API:filereader.canvas 以及 formdata 目前来说,HTML5的各种新API都在移动端的webkit上得到了较好的实现.本次使用到的FileRea ...

  4. 深入理解原型链(Prototype chain) __proto__

    原型链(Prototype chain) 原型对象也是普通的对象,并且也有可能有自己的原型,如果一个原型对象的原型不为null的话,我们就称之为原型链(prototype chain). A prot ...

  5. PPT设计宝典!十招教你做出拿手的PPT

    据说上班用 excel 的比 word 的工资高,用 ppt 的比用 excel 的工资高.无论如何,在职场演讲汇报中,PPT 扮演着至关重要的角色.  在本文我们将用 10 个超级技巧来解决糟糕的演 ...

  6. VeeamOne9.5-t添加监控服务器

    打开 Veeam ONE Monitor 首先会让你配置报警邮件,也可以选择跳过随后配置 点击ADD SERVER 可以选择vCenter也可以选择ESXI主机 输入vCenter的用户名和密码 点击 ...

  7. 1006 Tick and Tick

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1006 题意: 24小时中,三个指针之间超过某个度数的时间占所有时间的百分比是多少. 思路:主要是物理和数学 ...

  8. centos7下使用yum安装pip

    centos7下使用yum安装pip 首先安装epel扩展源: yum -y install epel-release 更新完成之后,就可安装pip: yum -y install python-pi ...

  9. [计算机视觉]掩膜(mask)

    转自->这里 刚开始涉及到图像处理的时候,在OpenCV等库中总会看到mask这么一个参数,非常的不理解,在查询一系列资料之后,写下它们,以供翻阅. 什么是掩膜(mask) 数字图像处理中的掩膜 ...

  10. Ubuntu卸载软件

    在终端中输入 sudo dpkg --list 查看已安装的软件,得知需要卸载的软件名为<programme> 再输入 sudo apt-get --purge remove <pr ...