Android中View研究自学之路
Posted fanfan-公众号-码农修仙儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中View研究自学之路相关的知识,希望对你有一定的参考价值。
写这篇博客呢是在研究了view将近一个月之后,算是对自己的学习做一个总结,进而反思一下学习方法,本博文不涉及代码分析。
转载请注明出处
Android中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工程师,有一天可以做出以我们自己的代码为标准的技术!!!!!!
以上是关于Android中View研究自学之路的主要内容,如果未能解决你的问题,请参考以下文章
Android自学之路——Service与IntentService
Android自学之路——Service与Activity通信