「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」
相关文章:
Android View的绘制流程(一)-绘制流程以及Activity视图介绍
Android View的绘制流程(二)-Activity视图-DecorView
Android View的绘制流程(三)-Activity视图-WindowManager
Android View的绘制流程(四)-Activity视图-ViewRootImpl
Android View的绘制流程(五)-Measure
Android View的绘制流程(六)-Layout
Android View的绘制流程(七)-Draw
前言
Android系统是一个庞大的系统,想要学好Android的全部知识那是非常的难的,不管是从系统,还是到应用,都是有很多很多的知识点,但是作为开发人员,我们对系统的知识不需要太深入的了解,知其然就好了,知道系统的总体架构,启动流程,主要调用方法,已经交互方式就差不多了,细节的东西不需要太深入,但是对于应用层,呈现在用户面前的东西,我们需要知其然,知其所以然。呈现在用户面前的自然就是View,那么我们不止是要熟练的使用Android提供给我们的View组件,我们还要了解他们的绘制原理,因为,开发中经常会遇到一些UI上的问题,如果不了解,就无法解决这些问题,就会阻碍我们的开发。
绘制流程从哪里开始
Activity是我们呈现视图最多的地方,Dialog,PopupWindow中View的绘制过程也是一样的,只是触发的方式不同。例如Dialog中,是调用dialog.show()时,触发了WindowManagerImpl的addView(),后面的流程就一样了。那么以Activity为例,绘制视图的调用流程是怎么样的呢
首先我们从ActivityThread的handleResumeActivity方法调用WindowManagerImpl的addView()方法,再到WindowManagerGlobal的addView()方法,接下来调用了一系列的ViwwRootImlp方法,setView-> requestLayout->scheduleTraversals->doTraversals,最后调用performTraversals方法触发了View的绘制。该方法内部,依次调用了performMeasure(),performLayout(),performDraw(),将View的measure,layout,draw过程,从顶层View分发了下去。这个我们接下来会说到,我们先看Activity的视图呈现是怎么样的
Activity 视图
Activity是Android开发过程中,作为用户层面视图展示的载体,是开发过程中必不可缺的部分,每个应用程序的入口都是Activity,启动页的Welcome,引导页的Splash,还是我们最长见得Main,那么作为用户感知的界面,它的视图结构又是怎么样的呢?
上图展示了Activity视图的层级结构,同时也展示了,View的事件处理与Activity之间的关系,每层都有它不可或缺的作用。
- Activity : 对于每一个 activity 都会有拥有一个 PhoneWindow。
- PhoneWindow :该类继承于 Window 类,是 Window 类的具体实现,即我们可以通过该类具体去绘制窗口。并且,该类内部包含了一个 DecorView 对象,该 DectorView 对象是所有应用窗口的根 View。
- DecorView 是一个应用窗口的根容器,它本质上是一个 FrameLayout。DecorView 有唯一一个子 View,它是一个垂直 LinearLayout,包含两个子元素,一个是 TitleView( ActionBar 的容器),另一个是 ContentView(窗口内容的容器)。
- ContentView :是一个 FrameLayout(android.R.id.content),我们平常用的 setContentView 就是设置它的子 View 。
- WindowManager : Window是一个抽象的概念,每一个Window都对应着一个View和一个ViewRootImpl,Window和View通过ViewRootImpl来建立联系,WindowManager依据字面意思,就是Window的管理类,也就是用来管理我们的窗口window的。
-
WindowManagerService (WMS) :用一个很形象的比喻就是,它就像一个摄影师,负责控制摄像机来选择需要拍摄的画面,而这个摄像机是什么呢?就是我们的surfaceflinger,这个后面我们详细介绍里会说到。
-
ViewRootImpl :ViewRootImpl 的一个重要职责就是跟 WmS 通信,ViewRootImpl它是绘制中控件的最根部,控件的测量、布局、绘制以及输入事件的派发处理都由ViewRootImpl触发。它还需要负责与WMS交互通信以调整窗口的位置大小,以及对来自WMS的事件(如窗口尺寸改变等)作出相应的处理。它持有我们最上层的view也就是DecoreView的实例,控制decorview,实现事件的绘制。
以上都是与Activity交互密切关联的的类,其实想了解更多,可以直接看Activity的源码,就会很清楚,上面他们的关系了,下面的文章,我也会把他们直接的关系,通过源码分析,介绍给大家。
有说的不对的地方,欢迎留言评论