以小米时钟为demo学习自定义view过程总结
首选感谢这位博主的分享,让我等新生有很好的范例学习
http://blog.csdn.net/qq_31715429/article/details/54668668点击打开链接 点击打开链接 点击打开链接 点击打开链接
接下来从头捋一遍。
一开始我是在做一个多功能时钟类的APP,做到一半觉得界面实在是丑,而我当时用的又是小米手机,难免会参考小米的时钟,结果一种强烈的羞耻感就出来了。。。于是我开始 想学动画和ps,想找张有刻度的表盘图片和几个指针图片拼起来,凑成一个闹钟。。。结果ps装不成。。。。很气。。。很绝望。就在这时候,我无意在GitHub上搜索了时钟两个字,打开了新世界大门。。。
attrs.xml文件作用:
刚看代码的时候,第一眼我就发现我不会。我不知道为什么要有个 attrs 。其实很简单,它是为了简化我们的调试,方便修改一些属性值。
例如本例中
<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="MiClockView"><attr name="backgroundColor" format="color" /><attr name="lightColor" format="color" /><attr name="darkColor" format="color" /><attr name="textSize" format="dimension" /></declare-styleable>
</resources>
定义了这些属性,那么我们在布局文件中需要去给他们赋值,
<cn.edu.nuc.mymiclock2.MiClockandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"wy:backgroundColor="#2ffEAD"wy:darkColor="#80ffffff"wy:lightColor="#ffffff"wy:textSize="14sp" />
(那些以wy开头的自定义属性就是attrs中定义的属性)
然后在自定义view类中用
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MiClockView, defStyleAttr, 0);mBackgroundColor = ta.getColor(R.styleable.MiClockView_backgroundColor, Color.parseColor("#237EAD"));setBackgroundColor(mBackgroundColor);mLightColor = ta.getColor(R.styleable.MiClockView_lightColor, Color.parseColor("#ffffff"));mDarkColor = ta.getColor(R.styleable.MiClockView_darkColor, Color.parseColor("#80ffffff"));mTextSize = ta.getDimension(R.styleable.MiClockView_textSize, DensityUtils.sp2px(context, 14));ta.recycle();
来获取我们自定义属性的属性值,这些ta.getXXX()方法的第二个参数都是如果没有第一个参数的情况下的默认值。
TypeArray这一行好像都是标准格式,通常情况下只要把第二个参数改成自己在attrs中定义的declare_styleable name=“XXX”就好了,还有在写attrs文件定义属性时
declare-styleable name="MiClockView"
这一行记得写,不然TypedArray ta = .....的时候怎么知道是要从哪来获取你的自定义属性呢。
然后,回到这段文章的开始。。。定义attrs这些文件的作用:比如当你需要修改你的自定义view内的一个lightColor属性时,有很多组件都使用了这个属性,你直接去代码中一个个改就很麻烦了,这时你定义好这些attrs文件后,就只需在布局文件那像修改其他Android系统提供的组件一样修改lightColor值,这时在TypedArray这段代码内mLightColor的值就改变了,也就是后面的所有用到了它的组件都修改了。就是这么简单,但是我当初却想了很久。。。最后通过动手才了解了。。。
重写view类的三个构造方法(为什么是三个,参数都有什么用)
在构造方法中使用
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MiClockView, defStyleAttr, 0);
来获取到attrs中定义的各个属性值并赋值,在后面,这些属性值可用以设置画笔颜色、线条宽度等。
通常也在构造方法中初始化各个参数(如把上面获取的属性值赋值给一些需要的paint、path等)。
至于为什么是三个构造方法:
- 在代码中直接new一个Custom View(自定义view)实例的时候,会调用第一个构造函数.这个没有任何争议.
- 在xml布局文件中调用Custom View的时候,会调用第二个构造函数.这个也没有争议.
- 在xml布局文件中调用Custom View,并且Custom View标签中还有自定义属性时,这里调用的还是第二个构造函数.
也就是说,系统默认只会调用Custom View的前两个构造函数,至于第三个构造函数的调用,通常是我们自己在构造函数中主动调用的(例如,在第二个构造函数中调用第三个构造函数).
各个参数的含义其实我也不太清楚。。。。
所以推荐一下这篇博客,我也是从在学习到的
http://blog.csdn.net/wzy_1988/article/details/49619773#生成custom-view的自定义属性点击打开链接
接下来是onMeasure方法重写
通常在onMeasure中为自定义view设置大小
而且onMeasure中只需要一个方法
setMeasuredDimension(measureDimension(widthMeasureSpec), measureDimension(heightMeasureSpec))
而其中的measureDimension是自己写的一个测量方法
private int measureDimension(int measureSpec) {int result;int mode = MeasureSpec.getMode(measureSpec);int size = MeasureSpec.getSize(measureSpec);if (mode == MeasureSpec.EXACTLY) {result = size;} else {result = 800;if (mode == MeasureSpec.AT_MOST) {result = Math.min(result, size);}}return result;}
这主要是对自定义的layout_width/heigh的值进行判断
具体的晚点再补。。。不过推荐一篇我认为关于这个onMeasure写得很好的博客
http://www.jianshu.com/p/5a71014e7b1b点击打开链接
再下来就是onDraw了
把所有画图的方法都放到这里面来运行。。就能都显示出来。。。大概就是这样
记得给canvas赋值。。。
还有就是最后如果是动画需要有一个
invalidate();
方法,作用好像是重复绘制?不是很懂。。。这是个遗留问题,现在太晚了没时 间了,以后补上
最后,其实在写代码的时候有很多的基本的东西都记得不牢,比如一些画形状的方法、贝塞尔曲线什么的,初学者还是需要多练啊!光看是不行的,今天实在是太晚了,明天还有一天课,不,是一周课。。。超级课设培训。。可怕。剩下的遗留问题一定要解决!
最后的最后,第一次写博客,很多东西还不会,请大家见谅。
因为本人水平不够,分享的也只是心得,也是我走过的困难的路,希望能对一些初学者能有帮助,不过难免会有错误,各位大神看到了一定麻烦帮我指出啊。。。谢!
以小米时钟为demo学习自定义view过程总结相关推荐
- 自己动手,丰衣足食 —— 学习自定义View(一)
自己动手,丰衣足食 -- 学习自定义View(一) 前言 我们经常在做项目的时候遇到这样的情况,客户提出需求,UI把设计稿拿出来,你发现直接用现成的开源库好像不行哎,多多少少有些不同.这时候你就会想: ...
- Android仿小米时钟嵌套滑动(NestedScroll, 自定义behavior)
最近无聊刷手机的时候, 发现小米时钟的嵌套滑动很有意思, 就试着做了下 先上对比图: 分析下小米时钟的滑动 闹钟列表 向上滑动时, 时钟面 透明度上升, 快到最大滑动时逐渐显示数字时钟. 在闹钟列表向 ...
- android 自定义progressbar demo,Android自定义View――动态ProgressBar之模仿360加速球
在之前一篇文章中我们讲解了三种ProgressBar的做法,详见-><Android 自定义View--自定义ProgressBar >.这一节中我们模仿360加速球制作一个动态Pr ...
- 学习自定义View(二)仿58同城加载
之前用58同城app的时候看到它的加载界面不错,但是那时候还不知道如何实现~接触自定义View后,于是自己试着模仿写了一个 先看效果图: 录制的GIF上有一点卡,其实在真机上面运行很流畅的~ 其实感觉 ...
- Android开源中国客户端学习 (自定义View)左右滑动控件ScrollLayout
左右滑动的控件我们使用的也是非常多了,但是基本上都是使用的viewpager 等 android基础的控件,那么我们有么有考虑过查看他的源码进行定制呢?当然,如果你自我感觉非常好的话可以自己定制一个, ...
- 步步学习自定义View:Hencoder 精简版学习笔记(一)
自定义控件一直是让很多人包括我头疼的地方,难度较高 且学习资料零碎 直到我发现扔物线大神的HenCoder进阶手册. 这篇文章记录一下学习过程,以及途中经过精简的内容.便于日后查阅 1.1 绘制基础 ...
- android 数字时钟代码大全,Android自定义view实现数字时钟
最近在项目中遇到了一个需要实时更新时间的需求,并且用的地方还是挺多的,无奈做了一个简单的view来时现这个数字时钟. 首先看一下效果,比较简单,就是显示时分秒. 实现思路比较简单,利用handler的 ...
- 自定义view学习-手把手教你制作一个可扩展日历控件
来看看效果图先,手把手教你实现一个简易,但高扩展度的日历控件,可自由扩展成签到,单选,多选日期. 首先我们来分析实现思路.对于上图的效果,很明显是一个6x7的表格. 我们可以两个for循环控制绘制每个 ...
- 自定义view学习-创建自己的九宫格解锁view
先上效果图 效果如上,接下来是如何实现,并没有那么快上代码,不看代码不舒服的请迅速下翻. 九宫格解锁还是比较经典的,作为学习自定义view的入门. 对于九宫格解锁,我的实现思路是这样的: 1.先在屏幕 ...
最新文章
- Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity
- 中山大学2016年硕士研究生入学考试复试基本分数线
- Docker入门(一) - 仓库、容器、镜像、数据卷
- 我的世界服务器怎么显示腐竹来了,我的世界腐竹开服必看manu权限组教程
- java中HashMap遍历详解
- 在ASP.NET MVC3项目中,自定义404错误页面
- 用dreamweaver cs6快速布局后台架构_后台系统:产品设计 | 七步法
- 谁说发 paper 一定要追快打新?2021年,研究 word2vec 也能中顶会!
- 清华计算机接口原理,微机原理与接口技术课后习题答案清华大学
- 响应式Bootstrap后台管理系统模板UI框架
- 使用Pycharm将代码同步到GitHub
- vant toast 指定挂载到指定位置_文档如何只允许编辑指定位置?2步限制编辑,保护文档不被修改...
- 顾樵数学物理方法_圣彼得堡国立大学硕士研究生:物理与天文学
- 【附源码】计算机毕业设计SSM汽车4S店服务管理系统
- Office:手动卸载 Office 系统
- python 成语接龙1-爬去四字成语
- 微信小程序如何设置跳转企业微信
- android.os.BatteryManager
- IntelliJ IDEA 2021.1 关闭更新提醒
- 服务器系统如何玩dnf台服,如何通过台服流出的服务端自己架设DNF
热门文章
- 全球奶粉业正在进行认知重构、格局重构
- php 如何拉取百度统计,如何添加百度统计工具代码 (附带教程)
- LAMP的小优点还有你想要的Apache的安装
- 803计算机网络考研题型,2016年重庆邮电大学803计算机网络考试大纲
- PlantUML的学习笔记
- 神州数码项目管理最佳实践之四
- 对比同行CMS程序,迅睿CMS有哪些优势
- 云大计算机831参考资料,云南大学2016年考研英语语言文学专业考研初试复试经验分享-CallmeSpell...
- 【牛客网】Shopee的办公室
- 计算机组装与维修专业术语,计算机组装与维护大纲.pdf