View树的绘制流程:

measure()  -->  layout() --> onDraw(),具体使用这个可以参考之前实现的自定义的博客:

measure():

其整个绘制过程如图下:

View相关面试问题-View绘制面试问题详解_自定义 

其它涉及到以下几个重要的参数:


  • ViewGroup.LayoutParams
  • MeasureSpec:其中有三个模式,具体可以参考博客:
    View相关面试问题-View绘制面试问题详解_重绘_02

其涉及到以下几个重要的方法:

①、measure:

View相关面试问题-View绘制面试问题详解_自定义_03

而接着它会调用下面的方法,如下:

View相关面试问题-View绘制面试问题详解_重绘_04

②、onMeasure:

View相关面试问题-View绘制面试问题详解_重绘_05

③、setMeasuredDimension():

layout():

这个跟measure流程差不多,也是自上而下进行遍历,如下:

View相关面试问题-View绘制面试问题详解_自定义_06

draw():

有了前两个过程,接下来就可以进行绘制啦,这里需要强调两个比较容易混淆的方法:


  • invalidate();它会引起重绘,也就是draw()方法。
  • requestLayout();它只会引起重新测量,不会导致draw()方法重新触发。