AndroidUI绘制流程,一步一步深入源码解析(二)

UI是如何绘制的?

在(一)中已经写过了视图资源文件的由来,现在需要找到UI的绘制入口在哪?

Android程序的入口是在ActivityThread.java中的main方法;

在ActivityThread启动时, 我发现在加载handleLaunchActivity方法调用performLaunchActivity方法之后又调用了一个handleResumeActivity在这里我发现了绘制流程的入口

下面以如下的步骤讲解view的绘制详细流程

1、绘制入口

ActivityThread.handleResumeActivity

--->WindowManagerImpl.addView(decorView ,layoutParams);

--->WindowManagerGlobal.addView();

2、绘制的类以及方法

ViewRootImpl.setView(decorView,layoutParams,parentView)

--->ViewRootImpl.requestLayout()--->secheduleTraversals()--->doTraversal()--->performTraversals();

3、绘制三大步骤:

测量:ViewRootImpl.performMeasure();

布局:ViewRootImpl.performLayout();

绘制:ViewRootImpl.performDraw();

(一)、如何添加到Window

/frameworks/base/core/java/android/app/ActivityThread.java

进入ActivityThread.handleResumeActivity方法

源码中是这样将decor添加到window中的,然后我们找到windowManager实现类WindowManagerImpl.addView(decorView ,layoutParams)方法


/frameworks/base/core/java/android/view/WindowManagerGlobal.java

然后再找到WindowManagerGlobal.addView()方法


找到这段代码,这里的view就是前面传入的decor

这里将视图,和参数还有我们的一个ViewRoot对象都用了容器去装在了起来,那么在此处我门可以得出,是将所有的相关对象保存起来

mViews保存的是View对象,DecorView

mRoots保存和顶层View关联的ViewRootImpl对象

mParams保存的是创建顶层View的layout参数。

而WindowManagerGlobal类也负责和WMS通信

而在此时,有一句关键代码root.setView,这里是将我们的参数,和视图同时交给了ViewRoot,那么这个时候我们来看下ViewRoot当中的setView干了什么?

(二)、绘制步骤

找到ViewRootImpl.setView(decorView,layoutParams,parentView)


在这里我门会看到view.assignParent的设置是this, 那么也就是说在view当中parent其实实际上是ViewRoot

那么在setContentView当中调用了一个setLayoutParams()是调用的ViewRoot的

而在ViewRoot当中发现了setLayoutParams和preformLayout对requestLayout方法的调用

在requestLayout当中发现了对scheduleTraversals方法的调用而scheduleTraversals当中调用了doTraversal的访问,最终访问到了performTraversals(),而在这个里面,我发现了整体的绘制流程的调用

当前里面依次调用了performMeasure()、performLayout()、performDraw()


先分析到这里,在AndroidUI绘制流程,一步一步深入源码解析(三)view测量上篇中我们再详细讲解如何测量、布局、绘制。

上一篇:AndroidUI绘制流程,一步一步深入源码解析(一)

下一篇:AndroidUI绘制流程,一步一步深入源码解析(三)view测量上篇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容