Android 自己定义View学习(2)
上一篇学习了基本使用方法,今天学一下略微复杂一点的。先看一下效果图
为了完毕上面的效果还是要用到上一期开头的四步
1,属性应该要有颜色,要有速度
<?xml version="1.0" encoding="utf-8"?>
<resources> <attr name="speed" format="integer" />
<attr name="circleColor" format="color" /> <declare-styleable name="ViewCircle">
<attr name="speed" />
<attr name="circleColor" />
</declare-styleable> </resources>
假设对这里有什么不了解能够看我上一篇Android 自己定义View学习(1)
2, 在构造方法中获得这些属性
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.ViewCircle, defStyle, 0);
int n = a.getIndexCount();
for (int i = 0; i < n; i++) {
int attr = a.getIndex(i);
switch (attr) {
case R.styleable.ViewCircle_speed:
mSpeed = a.getInteger(attr, 300);
break;
case R.styleable.ViewCircle_circleColor:
mColor = a.getColor(attr, Color.GREEN);
break;
}
}
a.recycle();
3,这次我们不重写onMeasure
4,重写onDraw
protected void onDraw(Canvas canvas) {
// 居中
canvas.translate(getWidth() / 2, getHeight() / 2);
// 画出三个圆
canvas.drawCircle(0, 0, 200, mCircle);
canvas.drawCircle(0, 0, 180, mCentreCircle);
canvas.drawCircle(0, 0, 160, mNexCircle);
//进度
RectF rectF = new RectF(-180, -180, 180, 180);
canvas.drawArc(rectF, -90, mProgress, true, mTimer);
//算出字体所占大小,使其居中
mLinePaint.getTextBounds(String.valueOf(mProgress), 0,
String.valueOf(mProgress).length(), rect);
canvas.drawText(String.valueOf(mProgress), -rect.width() / 2, 0,
mLinePaint);
//总进度为六十
int count = 60;
//刻度从190--200
int y = 190;
Rect rect = new Rect();
mLinePaint.getTextBounds("00", 0, "00".length(), rect);
//当i%10==0时画一道刻度线
for (int i = 0; i < count; i++) {
if (i % 10 == 0) {
canvas.drawLine(0, y, 0, 200, mLinePaint);
canvas.drawText(String.valueOf(i / 10) + "0",
-rect.width() / 2, 220, mLinePaint);
}
canvas.rotate(360 / count, 0, 0);
}
}
我们注意一下canvas.drawArc(rectF, -90, mProgress, true, mTimer);
我们传进去的为true效果就是
假设我们传进去false
能够明显的看到区别,没事也能够试试我们这个demo传进去false会是什么效果。
接下来为了让这个进度动起来我们就要用到线程来刷新ui
new Thread() {
public void run() {
while (true) {
mProgress++;
if (mProgress == 360) {
mProgress = 0;
}
postInvalidate();
try {
Thread.sleep(mSpeed);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
这样基本就差点儿相同了。
。
接下来看看终于效果
Android 自己定义View学习(2)的更多相关文章
- Android 自己定义View (二) 进阶
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24300125 继续自己定义View之旅.前面已经介绍过一个自己定义View的基础 ...
- Android之自定义View学习(一)
Android之自定义View学习(一) Canvas常用方法: 图片来源 /** * Created by SiberiaDante on 2017/6/3. */ public class Bas ...
- Android 自己定义View须要重写ondraw()等方法
Android 自己定义View须要重写ondraw()等方法.这篇博客给大家说说自己定义View的写法,须要我们继承View,然后重写一些 方法,方法多多,看你须要什么方法 首先写一个自己定义的V ...
- 【Android自己定义View实战】之自己定义超简单SearchView搜索框
[Android自己定义View实战]之自己定义超简单SearchView搜索框 这篇文章是对之前文章的翻新,至于为什么我要又一次改动这篇文章?原因例如以下 1.有人举报我抄袭,原文链接:http:/ ...
- Android自己定义view之measure、layout、draw三大流程
自己定义view之measure.layout.draw三大流程 一个view要显示出来.须要经过測量.布局和绘制这三个过程,本章就这三个流程具体探讨一下.View的三大流程具体分析起来比較复杂,本文 ...
- 手把手带你画一个 时尚仪表盘 Android 自己定义View
拿到美工效果图.咱们程序猿就得画得一模一样. 为了不被老板喷,仅仅能多练啊. 听说你认为前面几篇都so easy,那今天就带你做个相对照较复杂的. 转载请注明出处:http://blog.csdn.n ...
- 自己定义View学习之12/7(进度条之混合模式)
今天重点内容是我们学习自己定义view里面的混合模式.事实上我们的画布就跟photoshop一样.是个图层关系,一层盖着一层.这样就导致有非常多种覆盖模式,这就是我们今天的主题."混合模式& ...
- Android自己定义View的实现方法
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17357967 不知不觉中,带你一步步深入了解View系列的文章已经写到第四篇了.回 ...
- Android自己定义View基础篇(三)之SwitchButton开关
自己定义View基础篇(二) 自己定义View基础篇(一) 自己定义View原理 我在解说之前,先来看看效果图,有图有真相:(转换gif图片效果太差) 那来看看真实图片: 假设你要更改样式,请改动例如 ...
随机推荐
- Swift3.0中关于日期类的使用指引
日期的处理在大大小小的iOS项目中都十分常见,随着Swift3.0正式版的即将推出,语法的改变让NSDate以及相关类的使用都与之前略有不同,这里将会对基于Swift3.0版本的NSDate及相关类的 ...
- Php learn note
Php learn note 1. Between two part of ECHO, there is , sign rather than + sign. echo 'Hello World!!' ...
- Head First 设计模式 —— 装饰器模式
1. 装饰器模式与继承 与装饰器模式相比,继承更容易造成类爆炸: 装饰器模式:利用组合取代继承:
- 关于Mybatis的几个问题
今天在用mybatis开发的时候遇到两个问题,下面一一列出并给出解决方案. 问题一 最开始我设置的实体类中有个字段如isParent为boolean类型,set和get方法是eclispe自动生成的. ...
- hdu2686/hdu3376 最小费用流最大流 拆点
虽然题目求的是最大费用,但是我们可以通过转换就变为最小费用.用一个比最大值更的数与每个数的差作为费用值.最后处理回来就i可以了.有些人用直接每个值都乘以-1,这样更简单. 做这题,我对为什么不拆点就会 ...
- Eclipse中Git的基本使用
以下所有命令如没有特殊说明,均在命令行中完成(cmd窗口) 1.全局设定(需要告诉git自己是谁) git config --global user.name "你的名字或昵称&quo ...
- Java数组的运用
Java数组 应用1: 大乐透彩票模拟器: 规则: 前区01-35中随机生成5个号码 后区01-12中随机生成2个号码 模拟操作,系统自动生成号码组合,并且按从小到大的顺序输出结果 同时要求可以选择生 ...
- 编译OpenCV遇到Qmake问题
1.Ubuntu安装OpenCv,出现:qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or ...
- 关于 Windows 10 如何扩展分区与合并分区
前言 相信大部分人都遇见磁盘不够用的问题吧,然后都在后悔当初为什么就给 x 盘分了 10G 的容量吧. 不过没关系,自从 Windows 7 开始( xp 我也不知道有毛有),Windows 自带的磁 ...
- VS2008中C++打开Excel(MFC)
VS2008中C++打开Excel(MFC)——摘自网络,并加以细化 第一步:建立project(新建项目) 英文版 中文版 选择C++下的MFC Application(基于对话框的项目) 英文版 ...