高级UI------(一)UI的绘制流程

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绘制详细步骤

  • 测量performMeasure
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)

你可能感兴趣的:(高级UI------(一)UI的绘制流程)