Android-View的绘制流程解析

View的绘制流程概述

  1. Window的创建:
    Activity启动时最终会调用ActivityThread.performLaunchActivity来完成启动,这个方法会通过类加载器创建activity的实例对象,并通过Activity.attach()方法创建Window类的实例化对象PhoneWindow.这样window就创建好了。
    2.DecorView的创建:
    Activity.onCreate会调用setContentView, Activity.setContentView其实是通过PhoneWindow.setContentView将布局文件加载进来生成DecorView,这个DecorView就是ViewTree的根节点。
    3.DecorView的显示:
    HandleResumeActivity回调用Activity.onResume,接着调用Activity.makeVisible()在这个方法中会调用windowManger.addView,而WindowManager是个接口,具体是交给WindowManagerImpl来实现的。而交给WindowManagerImpl会让WindowManagerGlobal 的addView()方法去实现。在这里会创建ViewRootImpl,ViewRootImpl才是真正负责view的绘制,viewRootImpl会调用requestLayout()->scheduleTraversals->performTraversals,最终会通过调用PerformTraversals来进行测量,布局,绘制流程。

Activity Window WindowManager DecorView ViewRootImpl的关系概述

image.png

Activity其实并不负责视图的绘制,它其实类似一个大管家统筹全局,负责处理生命周期和事件分发,具体处理的事务都是委托给别人来处理。表示视图的是window窗口类,但是window是个抽象类,其具体实现是PhoneWindow类。而PhoneWindow类里持有一个DecorView对象,这个DecorView其实才是我们最经常接触的根ViewRoot.DecorView是一个FrameLayout子类,包含了上面一个actionBar和下面一个id为Content的FrameLayout.我们在onCreate中调用setcontentView(R.layout.xxx)就是将布局文件赋值给这个id为content的FrameLayout.而真正负责事件处理和view的绘制流程是ViewRootImpl类。ActivityThread启动后会调用handleResumeActivity去让windowManger调用addView,在addView中ViewRootImpl最终会调用performTraversals()进行view的绘制。因此ViewRootImpl是WindowManager和DecorView的中间桥梁。

你可能感兴趣的:(Android-View的绘制流程解析)