【Android自己定义控件】圆圈交替,仿progress效果
还是我们自定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效果的更多相关文章
- android自己定义控件系列教程-----仿新版优酷评论剧集卡片滑动控件
我们先来看看优酷的控件是怎么回事? 仅仅响应最后也就是最顶部的卡片的点击事件,假设点击的不是最顶部的卡片那么就先把它放到最顶部.然后在移动到最前面来.重复如次. 知道了这几条那么我们就非常好做了. 里 ...
- Android 自己定义控件实现刮刮卡效果 真的就仅仅是刮刮卡么
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40162163 , 本文出自:[张鸿洋的博客] 非常久以前也过一个html5的刮刮 ...
- Android自己定义控件系列五:自己定义绚丽水波纹效果
尊重原创!转载请注明出处:http://blog.csdn.net/cyp331203/article/details/41114551 今天我们来利用Android自己定义控件实现一个比較有趣的效果 ...
- Android自己定义控件:进度条的四种实现方式
前三种实现方式代码出自: http://stormzhang.com/openandroid/2013/11/15/android-custom-loading/ (源代码下载)http://down ...
- android 自己定义控件
Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs ...
- Android自己定义控件皮肤
Android自己定义控件皮肤 对于Android的自带控件,其外观仅仅能说中规中矩,而我们平时所示Android应用中,一个简单的button都做得十分美观.甚至于很多button在按下时的外观都有 ...
- android 自己定义控件属性(TypedArray以及attrs解释)
近期在捣鼓android 自己定义控件属性,学到了TypedArray以及attrs.在这当中看了一篇大神博客Android 深入理解Android中的自己定义属性.我就更加深入学习力一番.我就沿着这 ...
- Android自己定义控件系列三:自己定义开关button(二)
接上一篇自己定义开关button(一)的内容继续.上一次实现了一个开关button的基本功能.即自己定义了一个控件.开关button,实现了点击切换开关状态的功能.今天我们想在此基础之上.进一步实现触 ...
- Android自己定义控件之应用程序首页轮播图
如今基本上大多数的Android应用程序的首页都有轮播图.就是像下图这种(此图为转载的一篇博文中的图.拿来直接用了): 像这种组件我相信大多数的应用程序都会使用到,本文就是自己定义一个这种组件,能够动 ...
- Android自己定义控件(状态提示图表)
[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重分享成果] 1 背景 前面分析那么多系统源代码了.也该暂停下来歇息一下,趁昨晚闲着看见一个有意思的需求就操 ...
随机推荐
- day60 pymysql
预知扩展内容,详见地址如下(关于数据库备份和恢复) http://www.cnblogs.com/linhaifeng/articles/7525619.html 我们一般写程序都是在py文件里面,那 ...
- 关于HttpModule和HttpHandler以及HttpApplication
HttpRuntime打交道的是http协议跟IIS层面的东西,HttpApplication则具体到应用程序这一级别(也就是一个网站,这个跟web.config关系是基本一一对应的,像Module跟 ...
- thinkphp5控制器
// 定义应用目录 define('APP_PATH', __DIR__ . '/../app/'); // 定义配置文件目录和应用目录同级 define('CONF_PATH', __DIR__.' ...
- UVA 796 Critical Links(模板题)(无向图求桥)
<题目链接> 题目大意: 无向连通图求桥,并将桥按顺序输出. 解题分析: 无向图求桥的模板题,下面用了kuangbin的模板. #include <cstdio> #inclu ...
- CVE-2011-0762环境搭建与EXP利用
CVE-2011-0762 vsftpd拒绝服务漏洞 危害:通过发送特殊构造的数据包.利用漏洞使应用程序崩溃 条件:连接上vsftpd才能发包 发现时间:2011-03-01 需求:找到EXP运行发送 ...
- 004.Ansible Ad-Hoc命令集
一 Ad-Hoc使用场景 Ad-Hoc更倾向于解决简单.临时性任务. 1.1 Ad-Hoc基础命令 基本语法: 1 ansible <host-pattern> [options] < ...
- Rendering React components to the document body
React一个比较好用的功能是其简单的API,一个组件可以简单到一个return了组件结构的render函数.除了一个简单的函数之外,我们还有了一段有用且可复用的代码片段. 问题 不过有时候可能会受到 ...
- 安装mysql以及修改mysql字符集问题
1.安装mysql sudo apt-get install mysql-server sudo apt-get install mysql-client 2.部分命令: sudo service ...
- linux 硬盘分区与格式化挂载
1. 硬件设备与文件名的对应关系(详见linux系统管理P297)1) 掌握在Linux系统中,每个设备都被当初一个文件来对待.2) 掌握各种设备在Linux中的文件名 2. 硬盘的结构及硬盘分区(详 ...
- [Python]list.append字典的时候,修改字典会导致list内容变化的问题
今天写了这样的一段代码,出现了BUG. log_message["EventName"] = "上架->可用" log_message["Eve ...