Android View绘制流程:Measure/Layout/Draw

  • 一.Measure
  • 二.Layout
  • 三.Draw
  • 总结



对view绘制流程做一个简单的记录,纯个人笔记。

一.Measure

测量控件:

  1. 递:开始测量,由最顶层的父控件将MeasureSpec(测量布局的规则,包含测量大小和测量模式两种属性)向上传递到子控件,子控件开始测量,子控件根据测量策略计算出自身的MeaseureSpec,继续传递给子子控件,子子控件根据测量策略计算出自身的MeasureSpec,继续传递给子子子控件…,直到最底层控件计算出自身的MeasureSpec。
  2. 归:当最后一级子控件测量好自身的MeasureSpec,调用setMeasuredDimension()将布局属性传递回它的父控件,父控件根据传回来的测量模式及测量大小计算出自己的测量属性
    继续调用setMeasuredDimension()向上传递,直到最顶层的控件完成测量,测量完成。

图析:

Android RN界面绘制完成 android 绘制流程_Android RN界面绘制完成

二.Layout

控件的布局摆放:
view的layout过程和viewGroup的layout过程有一些不同:viewGroup比view多了一个onLayout摆放子布局位置的操作:

  1. viewGroup:调用layout()后,通过调用setFrame()设定left/top/right/bottom四个位置的值,接着会调用onLayout()方法,在onLayout()遍历所有子控件,通过调用child.layout()对子控件做布局计算,如此反复直到计算设定好最上层view的位置。
  2. view:和viewGroup一样,调用layout()后,通过调用setFrame()设定left/top/right/bottom四个位置的值,接着会调用onLayout()方法,因为在view树中,view已经是处于最上层,不包裹其他view或viewGroup,所以在view中onLayout()是一个空方法,不做任何处理;

三.Draw

绘制:
步骤描述:
* 1. 绘制背景:drawBackground(canvas)
* 2. 保存画布的图层防止褪色
* 3. 绘制view自身:onDraw(canvas)
* 4. 绘制子控件:dispatchDraw(canvas):
* 5. 绘制淡化边缘并恢复图层
* 6. 绘制装饰:如前景、滚动条,onDrawForeground(canvas)
在绘制的过程中,viewGroup除非设置了背景,不然没有绘制的工作,viewGroup的onDraw()也不会调用,但是viewGroup会调用dispatchdraw()绘制子view,直到绘制完最后一层view,整个view树的draw完成。

总结

android view工作原理很简单,是自定义view必须要掌握的知识点,但是很多细节还是要看源码去理解,做个简单记录。