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()
先分析到这里,在(三)中详细讲解如何测量、布局、绘制