View加载的流程之测量:rootView调用measure()→onMeasure();
measure()是final方法,表明Android不想让开发者去修改measure的框架,开发者可以onMeasure方法。
来看一下measure的代码:
- public?final?void?measure(int?widthMeasureSpec,?int?heightMeasureSpec)?{??
- ????if?((mPrivateFlags?&?FORCE_LAYOUT)?==?FORCE_LAYOUT?||??
- ????????????widthMeasureSpec?!=?mOldWidthMeasureSpec?||??
- ????????????heightMeasureSpec?!=?mOldHeightMeasureSpec)?{??
- ????????mPrivateFlags?&=?~MEASURED_DIMENSION_SET;??
- ????????if?(ViewDebug.TRACE_HIERARCHY)?{??
- ????????????ViewDebug.trace(this,?ViewDebug.HierarchyTraceType.ON_MEASURE);??
- ????????}??
- ????????onMeasure(widthMeasureSpec,?heightMeasureSpec);??
- ????????if?((mPrivateFlags?&?MEASURED_DIMENSION_SET)?!=?MEASURED_DIMENSION_SET)?{??
- ????????????throw?new?IllegalStateException("onMeasure()?did?not?set?the"??
- ????????????????????+?"?measured?dimension?by?calling"??
- ????????????????????+?"?setMeasuredDimension()");??
- ????????}??
- ????????mPrivateFlags?|=?LAYOUT_REQUIRED;??
- ????}??
- ????mOldWidthMeasureSpec?=?widthMeasureSpec;??
- ????mOldHeightMeasureSpec?=?heightMeasureSpec;??
- }??
?
?
?
?
一个界面的展示可能会涉及到很多次发measure,因为一个视图往往包含多个子视图,每个视图都需要经历一次measure过程。ViewGroup中定义了measureChildren()方法来测量子视图,下面是measureChildren():
?
?
- protected?void?measureChildren(int?widthMeasureSpec,?int?heightMeasureSpec)?{??
- ????final?int?size?=?mChildrenCount;??
- ????final?View[]?children?=?mChildren;??
- ????for?(int?i?=?0;?i?<?size;?++i)?{??
- ????????final?View?child?=?children[i];??
- ????????if?((child.mViewFlags?&?VISIBILITY_MASK)?!=?GONE)?{??
- ????????????measureChild(child,?widthMeasureSpec,?heightMeasureSpec);??
- ????????}??
- ????}??
- }??
?
?
View加载的第二步: onLayout,这和measure差不多,都是由rootView调用layout()→onLayout()。
?
?
?
?
时间: 2024-09-28 21:58:37