View是如何被添加到屏幕窗口的
- 創(chuàng)建頂層布局容器DecorView
- 在頂層布局容器中加載基礎(chǔ)布局ViewGroup
- 將ContentView添加到基礎(chǔ)布局中的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繪制詳細(xì)步驟
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決定嘶朱,遵守如下規(guī)則:
- LayoutParams.MATCH_PARENT:精確模式蛾坯,窗口大小
- LayoutParams.WRAP_CONTENT:最大模式,最大為窗口大小
-固定大屑洹:精確模式偿衰,大小為LayoutParams的大小
2挂疆、View的MeasureSpec由父容器的MeasureSpec和自身LayoutParams決定
View的布局
1改览、調(diào)用view.layout確定自身的位置,即確定mLeft,mTop,mRight,mBottom的值
2缤言、如果是ViewGroup類型宝当,需要調(diào)用onLayout確定子View的位置
View的繪制
1、繪制背景drawBackground(canvas)
2胆萧、繪制自己onDraw(canvas)
3庆揩、繪制子View dispatchDraw(canvas)
4俐东、繪制前景,滾動條等裝飾onDrawForeground(canvas)