安卓学习 --- View相关(一)

安卓中最重要的组成就是view,应该说所有的前端最重要的内容都是页面的绘制,只不过安卓使用了view这个类作为view绘制的载体,一个安卓开发如果不能深刻的理解view的绘制原理,在很多时候也就无法处理一些绘制时出现的问题,最近在看《安卓开发艺术探索》里面大篇幅的讲解了view相关的内容,但是在看书过程中,感觉还是有些地方讲解的并不清晰,自己又通过谷歌做了一些知识上的补充,力求能够尽量完整的去理解view的绘制过程和工作原理,关于view相关知识,是一条很大的主线,所以会分成几篇文章去讲解,在研究view的过程中,也抽取出来一些通用的阅读源码的技巧,希望能够帮助读者更好的去自己动手理解源码和一些复杂的代码,而不是总是去阅读别人的二手知识,之前自己学习时也总是看别人的文章,看了以后,恍然大悟,原来是这样,但是根本就没有思考为什么是这样的,这样做有什么道理,导致只会用,碰到问题还是似懂非懂,这篇文章我不打算贴出很多代码,而是把自己学习的过程流程化处理,希望读者能够按照这个流程,自己动手去跟踪源码,去思考每一步为什么这样做,为什么要这样写,从源码的阅读中能够学习到什么东西,这样才能有所进步。

从activity创建到view测量之前

这里先从activity创建到view测量之前这一段流程开始,在阅读下面的流程的时候,最好看过别的文章关于view和window的相关知识,因为这一部分知识很多博客都已经写过,这里就不再补充。
1、ActivityThread#handlelaunchActivity启动Activity,调用onCreate方法
2、onCreate方法里面调用我们写的setContentView() 方法
3、进入setContentView方法,在这个方法里面,会有一个LayoutInflater把xml解析,生成xml里面的view的实例,并且通过LayoutInflater的解析把每一个xml标签里面的属性附值给对应view的LayoutParams,方便后面这个view用这些属性测量和绘制,这时候整个xml的跟布局和里面的view就组成了ContentView
4、DecorView类生成,DecorView = ContentView + TitleView ,如果没有TitleView,那么就是没有标题栏,充满整个屏幕,也就是我们常设置的全屏显示。
5、ActivityThread#handleResumeActivity会调取onResume方法(这里可以和activity的生命周期联系起来),此时activity处于可见状态,ViewRootImpl会把DecorView关联到PhoneWindow中。

这里需要想一想,为什么还要phonewindow这个类,我思考的结果是,decorview只包含了titleview和contentview,并没有包含手机最上方的状态栏,还有整个手机视图相关的比如屏幕的宽度,分辨率等参数的保存和操作是不能让DecorView来做的,因为DecorView应该是xml视图的相关类,所以还需要一个window来控制状态栏和手机的屏幕参数,想到了这一点还需要想办法验证我的思考是否正确,我就通过谷歌看看安卓的分辨率如何获取状态栏如何控制,证实了我的这个想法,所以对window的用法和存在的理由,我会有一个很深刻的印象,这也是我下面关于源码技巧里面第5点说的,每一个类都有它存在的理由,弄明白为什么需要这个类,很多东西就能够融会贯通,比如现在知道了window是和状态栏有关的,以后在碰到和状态栏相关的问题的时候,就能够想到从哪里入手)

6、此时的视图已经完全准备完成,ViewRootImpl方法会调用performTraversals方法,开始view的三大流程measure,layout,draw,这个绘制是从DecorView开始的,关于这个下一篇文章再继续讲解。

关于阅读源码的一些技巧

0、看源码的时候,建议先看源码讲解的相关书籍,然后根据书里面的线索去读源码,并且通过谷歌或者自己的思考去补充书里面讲的不清楚的内容,不要完全依赖书籍,也不要完全凭借冲劲去直接读源码,这点很重要。
1、view相关的源码是sdk源码,一般我们直接在类上面点击ctrl就可以进入到这个类里面,
2、如果是看了书以后,再看源码,可以通过androidstudio里面双击shift来查找想要看的类
3、看源码或者其他开源代码最好有一定的设计模式的基础,因为安卓的源码各种类和接口的数量非常多,这些类和接口之间的关系,大部分是有一定设计模式的规律,比如Impl结尾的一般是是某个类的实现类。
4、如果一个类是抽象类或者接口,那么你需要去找他的实现类,阅读实现类里面的源码,这个实现类可以是谷歌出来的,也可以通过ctrl + f 打开搜索框,输入实现 ‘ 类的名字 = new ’ 就可以找到这个类在哪里被实现,比如在查找window的实现类的时候,就是用 ' mWindow = new ' 找到的。
5、在阅读源码的时候,用的是构建的学习方法,就是说通过看书大概明白这个类是是干什么的,然后先放下书,自己思考,如果要实现这个类,自己写,要怎么写,当然自己写的都是比较简单,在看源码的时候,却发现源码里面有的时候,一个功能,需要好几个类和接口实现,很是麻烦,后来看《clean code》看到单一职责原则的时候,突然明白了,这么多类,每一个类,都有自己各自的作用,并且这些类的职责划分非常明显,让我也在之后编程的时候,能注意到这些原则,在上面分析源码流程的过程中,也能够看出,我把每一个类的职责明确了出来,明白为什么需要这些类,所以在思考view绘制流程的时候,从头开始,就能顺其自然的想到以后的每一步,而不需要去死记硬背这些东西。

你可能感兴趣的:(安卓学习 --- View相关(一))