View是如何被添加到屏幕窗口上
- 创建顶层布局容器DecorView
- 在顶层布局容器中加载基础布局ViewGroup
- 将ContentView添加到基础布局容器中的FrameLayout
View的绘制流程
绘制入口
ActivityThread.handleResumeActivity
--> WindowManagerImpl.addView(decorView, layoutParams)
--> WindowManagerGlobal.addView()
绘制的类及方法
ViewRootImpl.setView(decorView, layoutParams, parantView)
--> ViewRootImpl.requestLayout()
--> ScheduleTraversals()
--> doTraversal()
--> performTraversals()
绘制三大步骤
测量: ViewRootImpl.performMeasure
布局:ViewRootImpl.performLayout
绘制:ViewRootImpl.performDraw
View的测量-确定DecorView的MeasureSpec
DecorView的MeasureSpec有窗口大小和自身的LayoutParams决定,遵循以下规则:
- LayoutParams.MATCH_PARENT:精确模式,窗口大小
- LayoutParams.WRAP_CONTENT:最大模式,最大为窗口大小
- 固定大小:精确模式,大小为LayoutParams的大小
View的布局
- 调用view.layout确定自身的位置,即确定mLeft, mTop, mRight, mBottom的值
- 如果是ViewGroup类型,需要调用onLayout确定子view的位置
View的绘制
- 绘制背景 drawBackground(canvas)
- 绘制自己 onDraw(canvas)
- 绘制子view dispatchDraw(canvas)
- 绘制前景,滚动条等装饰 onDrawForeground(canvas)