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自学之路--ContentProvider

开启的研究生自学之路

Android自学之路——Service与Activity通信

除了保护生态,再分享一个自动挂机聊天脚本核心源码(高山流水)

我的三年自学深度学习之路