美文网首页面试题自定义控件
高级UI------(一)UI的绘制流程

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

作者: 一只胖胖胖胖猿 | 来源:发表于2019-08-23 11:25 被阅读0次

    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的绘制流程

        本文链接:https://www.haomeiwen.com/subject/vzxzsctx.html