Android进阶之路Android技术知识Android开发

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

2019-04-02  本文已影响9人  MR_特殊人士

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()

先分析到这里,在(三)中详细讲解如何测量、布局、绘制

上一篇 下一篇

猜你喜欢

热点阅读