本文主要来自《Android开发艺术探索》和郭霖 《Android视图绘制流程完全解析,带你一步步深入了解View(二)》 两部分的综合理解。
本文只阐述流程,不讲述细节,大家可以结合上述两部分的细节看。如有问题,欢迎大家在评论区指出,谢谢!
View由ViewRoot完成三大流程。在ActivityThread中,当Activity对象被创建完毕后,DecorView会被添加到Window中,同时创建ViewRootImpl的对象,将其和DecorView关联。
View的绘制流程由ViewRoot的performTraversals()方法调用performMeasure,performLayout,performDraw完成顶级View(即DecorView)的measure,layout,draw。
measure
View的measure要分View和ViewGroup两种情况考虑,对于View我们可以给出通用的measure()方法,但是不同的ViewGroup(指ViewGroup的具体实现类,比如LinearLayout,RelativeLayout等)需求不一样,measure的过程不尽相同,所以ViewGroup给出了可以共用的方法,如measureChildren(),measureChild()等,留出了各ViewGroup实现类自行编写的抽象方法onMeasure()。
View的measure
View的对象调用measure()方法处理传入的MeasureSpec参数(这个参数比较好懂,就不解释了)
measure()方法内调用onMeasure()方法处理MeasureSpec参数
onMeasure()中再调用setMeasuredDimension()方法去设置View的具体宽高值
宽高值由getDefaultSize()方法将传入的MeasureSpec处理后得到(对于UNSPECIFIED这种情况,宽高值还与getSuggestedMinimumWidth等参数有关,由于这种SPEC_MODE很少用,这里不做讨论)
上述流程代码结构如下:
public final void measure(int widthMeasureSpec, int heightMeasureSpec) {
...
@Override
onMeasure(widthMeasureSpec, heightMeasureSpec);
...
}
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){
setMeasuredDimension(getDefaultSize(...),