首选感谢这位博主的分享,让我等新生有很好的范例学习

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等)。

至于为什么是三个构造方法:

  1. 在代码中直接new一个Custom View(自定义view)实例的时候,会调用第一个构造函数.这个没有任何争议.
  2. 在xml布局文件中调用Custom View的时候,会调用第二个构造函数.这个也没有争议.
  3. 在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过程总结相关推荐

  1. 自己动手,丰衣足食 —— 学习自定义View(一)

    自己动手,丰衣足食 -- 学习自定义View(一) 前言 我们经常在做项目的时候遇到这样的情况,客户提出需求,UI把设计稿拿出来,你发现直接用现成的开源库好像不行哎,多多少少有些不同.这时候你就会想: ...

  2. Android仿小米时钟嵌套滑动(NestedScroll, 自定义behavior)

    最近无聊刷手机的时候, 发现小米时钟的嵌套滑动很有意思, 就试着做了下 先上对比图: 分析下小米时钟的滑动 闹钟列表 向上滑动时, 时钟面 透明度上升, 快到最大滑动时逐渐显示数字时钟. 在闹钟列表向 ...

  3. android 自定义progressbar demo,Android自定义View――动态ProgressBar之模仿360加速球

    在之前一篇文章中我们讲解了三种ProgressBar的做法,详见-><Android 自定义View--自定义ProgressBar >.这一节中我们模仿360加速球制作一个动态Pr ...

  4. 学习自定义View(二)仿58同城加载

    之前用58同城app的时候看到它的加载界面不错,但是那时候还不知道如何实现~接触自定义View后,于是自己试着模仿写了一个 先看效果图: 录制的GIF上有一点卡,其实在真机上面运行很流畅的~ 其实感觉 ...

  5. Android开源中国客户端学习 (自定义View)左右滑动控件ScrollLayout

    左右滑动的控件我们使用的也是非常多了,但是基本上都是使用的viewpager 等 android基础的控件,那么我们有么有考虑过查看他的源码进行定制呢?当然,如果你自我感觉非常好的话可以自己定制一个, ...

  6. 步步学习自定义View:Hencoder 精简版学习笔记(一)

    自定义控件一直是让很多人包括我头疼的地方,难度较高 且学习资料零碎 直到我发现扔物线大神的HenCoder进阶手册. 这篇文章记录一下学习过程,以及途中经过精简的内容.便于日后查阅 1.1 绘制基础 ...

  7. android 数字时钟代码大全,Android自定义view实现数字时钟

    最近在项目中遇到了一个需要实时更新时间的需求,并且用的地方还是挺多的,无奈做了一个简单的view来时现这个数字时钟. 首先看一下效果,比较简单,就是显示时分秒. 实现思路比较简单,利用handler的 ...

  8. 自定义view学习-手把手教你制作一个可扩展日历控件

    来看看效果图先,手把手教你实现一个简易,但高扩展度的日历控件,可自由扩展成签到,单选,多选日期. 首先我们来分析实现思路.对于上图的效果,很明显是一个6x7的表格. 我们可以两个for循环控制绘制每个 ...

  9. 自定义view学习-创建自己的九宫格解锁view

    先上效果图 效果如上,接下来是如何实现,并没有那么快上代码,不看代码不舒服的请迅速下翻. 九宫格解锁还是比较经典的,作为学习自定义view的入门. 对于九宫格解锁,我的实现思路是这样的: 1.先在屏幕 ...

最新文章

  1. Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity
  2. 中山大学2016年硕士研究生入学考试复试基本分数线
  3. Docker入门(一) - 仓库、容器、镜像、数据卷
  4. 我的世界服务器怎么显示腐竹来了,我的世界腐竹开服必看manu权限组教程
  5. java中HashMap遍历详解
  6. 在ASP.NET MVC3项目中,自定义404错误页面
  7. 用dreamweaver cs6快速布局后台架构_后台系统:产品设计 | 七步法
  8. 谁说发 paper 一定要追快打新?2021年,研究 word2vec 也能中顶会!
  9. 清华计算机接口原理,微机原理与接口技术课后习题答案清华大学
  10. 响应式Bootstrap后台管理系统模板UI框架
  11. 使用Pycharm将代码同步到GitHub
  12. vant toast 指定挂载到指定位置_文档如何只允许编辑指定位置?2步限制编辑,保护文档不被修改...
  13. 顾樵数学物理方法_圣彼得堡国立大学硕士研究生:物理与天文学
  14. 【附源码】计算机毕业设计SSM汽车4S店服务管理系统
  15. Office:手动卸载 Office 系统
  16. python 成语接龙1-爬去四字成语
  17. 微信小程序如何设置跳转企业微信
  18. android.os.BatteryManager
  19. IntelliJ IDEA 2021.1 关闭更新提醒
  20. 服务器系统如何玩dnf台服,如何通过台服流出的服务端自己架设DNF

热门文章

  1. 全球奶粉业正在进行认知重构、格局重构
  2. php 如何拉取百度统计,如何添加百度统计工具代码 (附带教程)
  3. LAMP的小优点还有你想要的Apache的安装
  4. 803计算机网络考研题型,2016年重庆邮电大学803计算机网络考试大纲
  5. PlantUML的学习笔记
  6. 神州数码项目管理最佳实践之四
  7. 对比同行CMS程序,迅睿CMS有哪些优势
  8. 云大计算机831参考资料,云南大学2016年考研英语语言文学专业考研初试复试经验分享-CallmeSpell...
  9. 【牛客网】Shopee的办公室
  10. 计算机组装与维修专业术语,计算机组装与维护大纲.pdf