View是如何被添加到屏幕窗口的
- 创建顶层布局容器DecorView
- 在顶层布局容器中加载基础布局ViewGroup
- 将ContentView添加到基础布局中的FrameLayout中
View的绘制流程
ActivityThread.handleResumeActivity
-->WindowManagerImpl.addView(dercorView,layoutParams)
-->WindowManagerGlobal.addView()
ViewRootImpl.-->setView(decorView,layoutParams,parentView)
-->ViewRootImpl.requestLayout()-->scheduleTraversals()-->doTraversal()
-->performTraversals()
测量:ViewRootImpl.performMeasure
布局:ViewRootImpl.performLayout
绘制:ViewRootImpl.performDraw
UI绘制详细步骤
view.measure-->view.onMeause-->view.setMeasuredDimension
-->setMeasuredDimensionRaw
- 布局performLayout
view.layout-->view.onLayout
- 绘制performDraw
ViewRootImpl.draw(fullRedrawNeeded)
-->ViewRootImpl.drawSoftware-->view.draw(Canvas)
View的测量- 确定DecorView的MeasureSpec
1、DecorView的MeasureSpec由窗口大小和自身LayoutParams决定,遵守如下规则:
- LayoutParams.MATCH_PARENT:精确模式,窗口大小
- LayoutParams.WRAP_CONTENT:最大模式,最大为窗口大小
-固定大小:精确模式,大小为LayoutParams的大小
2、View的MeasureSpec由父容器的MeasureSpec和自身LayoutParams决定
View的布局
1、调用view.layout确定自身的位置,即确定mLeft,mTop,mRight,mBottom的值
2、如果是ViewGroup类型,需要调用onLayout确定子View的位置
View的绘制
1、绘制背景drawBackground(canvas)
2、绘制自己onDraw(canvas)
3、绘制子View dispatchDraw(canvas)
4、绘制前景,滚动条等装饰onDrawForeground(canvas)
网友评论