Android中View研究自学之路 Android6.0源码分析之View(一)Android6.0源码分析之View(二)
http://blog.csdn.net/zrf1335348191/article/details/54171263
Chapter One ,前言
如果你是做framework层开发的或者正在研究framework层,那么我想问
- 是否觉得代码调用层层相扣?
- 是否觉得代码中好多方法和字段都搞不懂?
- 是否有种深陷沼泽,眼前一片漆黑的无力感?
- 是否有种无从下手的迷茫?
如果你有这种感觉,那么我要告诉你,是时候停下来了,是的,是时候反思了,跳出来看看整体。想一想到底是自己基础不达标,还是学习方法有问题。
简单打个比方,把framework层的代码看成是一座座高山,而且是人工的假山,在你想翻越这座高山之前你要先看看地图,看看路在哪里,规划一下上山和下山的路线。既然是人写出来的,那么这些山就具有思想和格局,所有山的架构是固定的,你只要看懂了一座山的路线,那么其他山你只需要举一反三,仅此而已。
相信目前大多数framework层的开发者仅仅是解bug还没有到创建假山的地步吧,这就相当于在你上山的路上有一块儿香蕉皮,而你需要在下山时顺带带下来而已。如果你找不到上山的路,那么你就看不到这个香蕉皮。但也可能你找到了香蕉皮但是却找不到下山的路,你依旧是只能把自己和香蕉皮一同困在山上而已。
所以,我们要学会去看地图,找到路线,这样才能攻克这座高山。
Chapter Two,view自学之路
对于view的研究始于view.java和viewgroup.java,刚开始我是一点一点儿看代码,看过源码的都知道,view.java共22580行,单单是view的代码就够你看一阵子了,而且这还不涉及到各种调用。framework层代码就是这样,越看越深,有可能自己陷进去就出不来了,在研究了这么长时间后发现自己只能是掌握很多零碎的知识,无法把这些组织起来,也不知道什么时候该用,所以现在需要跳出来整体看一下。
Chapter Three,为什么要有view?
这是我问自己的第一个问题----为什么要有view?
带着这个问题,我去翻看view类的注释,仅此而已,我们要做的就是翻看一下Android中对于view类的说明。你就会有答案。
view的存在当然是为了图形界面,view的存在可以很直观的出现在人类的视觉范围内。有了图形界面,才能实现人机交互,也就相当于人类把指令传输给一个机器。 为了把图形界面设计的更吸引人,给view添加了各种属性。大小,颜色,动画,整体布局,等等
Android封装了一些基本的控件来供开发者使用,view相关的除了一些基本的属性,还有一些事件的处理,比如触摸事件、按键事件、焦点的改变、滑动事件等等,framework层都会有一些基本的处理。
Chapter Three,如何使用view?
view需要放在view容器里,即viewgroup中,viewgroup表示的是一组view。对于view的添加有两种方式
- 在Java代码中动态添加
- 在xml布局文件中添加
Chapter Four,为什么要自定义view?
既然是Google工程师已经帮我们写好了,那我们何苦要去自定义view呢?这是我问自己的第二个问题
因为很明显,Google开发的具有普遍性,广泛性,它对应于整个社会,它并不代表着高精尖,因为他需要适应所有人。而如果,你想要让自己的界面变得特殊,亦或者你不想按照Google工程师的思路来处理事件,那么你只能是自己去自定义了,比如qq的侧滑
qq实现了什么呢?向左滑是单个item左滑并出现相应的选项,右划是整个界面右划,下拉刷新,等等。
为了实现更好的界面,吸引更多的用户,我们需要自定义view,既然问出了这个问题,那我们就会去研究怎么着才能自定义一个view?
Chapter Five, 如何自定义View?
再次强调,本文不涉及到代码,所以只介绍实现思路
想要自定义view,首先就要明确你想要什么样的view?需要实现什么样的特殊功能?
第一步,确定所自定义的view到底该继承哪一种view----想要文本形式的就继承TextView,按键形式的Button,编辑框形式的EditText,列表形式的ListView/Recyclerview,又或者是一种viewgroup等等。当然你也可以直接继承自view,来实现一种完全自定义的view
第二步,创建view的构造方法,对于view有四种构造方法,至于这四种构造方法有什么区别,都要覆写吗?这类问题可以参考我的另一篇博客
Android6.0源码分析之View(一)
第三步,重写onMeasure方法,onMeasure就做了一件事,就是将所测量的宽高保存起来,这个在父类view中已经做了处理,你可以忽略,也就是说如果你对大小没有特殊的处理可以遵循父类view的处理,对于measure相关的可以看另一篇博客
Android6.0源码分析之View(二)--measure
第四步,重写onDraw方法,进行绘制。最终显示在图形界面是什么样的,大小,颜色,背景等等,一切我们可以看到的外观样式,都需要在这里进行了
经过以上四步,基本上你的view已经出来了,这也是最基本的自定义view。但你可能也会想要对于view的点击事件进行一个特殊的处理,这时候你就需要覆写一些事件处理的方法了。
以上就是我自己对于view的学习之路,金无足赤,人无完人,如果不足之处请见谅
写下这篇博客的目的有两个,
一是希望自己以后研究framework层代码时不要再像无头苍蝇似的乱撞,不仅要知道怎么做,更要知道为什么这么做,在这个基础上有更多的延伸
二是给那些刚开始研究framework层的同行们提一个建议,希望对你们有用
愿大家的技术越来越6,超越Google工程师,有一天可以做出以我们自己的代码为标准的技术!!!!!!
- 在centos7中添加一个新用户,并授权
- 如何优化coding
- 在PowerShell中使用curl(Invoke-WebRequest)
- linux centos中添加删除修改环境变量,设置java环境变量
- CentOS7下安装mysql5.6修改字符集为utf8并开放端口允许远程访问
- CentOS7下mysql5.6修改默认编码
- 在idea中maven项目jdk编译version总是跳到1.5
- 命令行打印文件树列表: tree
- JavaScript 获取鼠标及元素在页面上的位置
- Spring cache简单使用guava cache
- SpringMVC参数校验(针对`@RequestBody`返回`400`)
- Java8学习(3)- Lambda 表达式
- Java8 in action(1) 通过行为参数化传递代码--lambda代替策略模式
- java中byte, iso-8859-1, UTF-8,乱码的根源
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Spring security OAuth2.0认证授权学习第三天(认证流程)
- uni-app搜索历史记录功能实现
- [903]linux文件删除后磁盘空间没有释放
- Spring如何实现AOP,请不要再说cglib了!
- Redis安装问题解决方案
- 高效的5个pandas函数,你都用过吗?
- jz2440重新分区
- 腾讯云TCB云函数趣应用:巧用 puppeteer 五分钟实现一个云加社区个人成就爬虫
- NFS挂载的2种方式
- Angular Component 开发时属性和运行时属性的对照
- 第002课 ubuntu环境搭建和ubuntu图形界面操作(免费)
- 爆破cobalt strike密码脚本
- 第003课 linux入门命令详解
- 第004课 vi编辑器的使用详解
- 【前端JQ】jQuery赋值checked的几种写法,attr()方法不好使,建议使用prop()方法。