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图片效果太差) 那来看看真实图片: 假设你要更改样式,请改动例如 ...
随机推荐
- Linux - 虚拟机中的三种网络连接,桥接、NAT、Host-only详解
虚拟机中的三种网络连接 1.桥接 2.NAT 3.Host-only 桥接方便做实验,配置ip方便.可以和局域网中的其他机器进行通信,也可以和公网进行通信.缺点是会占用一个ip. NAT,可以和主机进 ...
- angular里使用vue/vue组件怎么在angular里用
欢迎加入前端交流群交流知识&&获取视频资料:749539640 如何在angularjs(1)中使用vue参考: https://medium.com/@graphicbeacon/h ...
- discuz “欣” “衡” 用户不能注册 bug修改
discuz “欣” “衡” 用户不能注册 原因是 discuz 有这样一段代码 function check_username($username) { $guestexp = '\xA1\xA1| ...
- POJ3087 Shuffle'm Up
题目: 现有字符串s1.s2.s12,其中s1.s2的长度为len,s12的长度为2*len. 是否可以通过一些操作使s1和s2转换合并成s12? 变换的操作规则如下: 假设s1=11111,s2=0 ...
- vcpkg错误分析方法
最近在使用vcpkg时,经常会碰到CMake错误. 有些以前能编译通过的包, 过一段时间又不能编译错误了. 错误提示一般是CMake错误, 弄得很郁闷. 我采用以下步骤解决了问题: 分析错误 查看错误 ...
- 初探.net framework 下的异步多线程
初探.net framework 下的异步多线程 目录 1.多线程的出现条件 2.Thread和ThreadPool的相关Api及用法 3.Task和Parallel的相关Api及用法 4.Async ...
- DB2大数据量优化查询解决方案
利用DB2表分区的功能对大数据量的表进行分区,可以优化查询. 表分区介绍: 表分区是一种数据组织方案,它根据一列或多列中的值把表数据划分为多个称为数据分区 的存储对象. (我觉得表分区就类似于Wind ...
- Android 自定义控件——图片剪裁
如图: 思路:在一个自定义View上绘制一张图片(参照前面提到的另一篇文章),在该自定义View上绘制一个自定义的FloatDrawable,也就是图中的浮层.绘制图片和FloatDrawable的交 ...
- 使用JDK和axis2发布webservice
最近使用webservice进行远程调用一直很火,自从JDK1.6版本发布后,发布一个webservice项目变得更加简单了 笔者由于工作的需要针对JDK和axis2如何发布webservice做过相 ...
- IIS网站调用FFMPEG执行截图命令失败的原因(暂时记录)
之前有个功能是用户上传视频后,网站对其进行截图处理.功能采用FFMPEG操作,在本机新建一个小程序进行调试时是没有问题的. 可功能原封不动挪到项目里,截图竟然失败了,于是开始排查. 期初以为是参数设置 ...