1,创建MeasureSpec
为32位的int数值,其中前面2位为mode,后面30位为size;
mode包含有exactly, at_most, unspecified;
public static int makeMeasureSpec(int size, int mode) {
if (sUseBrokenMakeMeasureSpec) {
return size + mode;
} else {
return (size & ~MODE_MASK) | (mode & MODE_MASK);
}
2, 初始化view root的spec
rootDimension根据创建window指定的attrs?
viewRoot
private static int getRootMeasureSpec(int windowSize, int rootDimension) {
int measureSpec;
switch (rootDimension) {
case ViewGroup.LayoutParams.MATCH_PARENT:
// Window can't resize. Force root view to be windowSize.
measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY);
break;
case ViewGroup.LayoutParams.WRAP_CONTENT:
// Window can resize. Set max size for root view.
measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.AT_MOST);
break;
default:
// Window wants to be an exact size. Force root view to be that size.
measureSpec = MeasureSpec.makeMeasureSpec(rootDimension, MeasureSpec.EXACTLY);
break;
}
return measureSpec;
}
3, viewRoot
performTranversals -> measure layout draw
4, DecorView 树
RelativeLayout后面的为setcontentView之后的view树;
没有title的情况下:
5,DecroView Measure堆栈
LinearLayout(View).measure(int, int) line: 16471
PhoneWindow$DecorView(ViewGroup).measureChildWithMargins(View, int, int, int, int) line: 5125
PhoneWindow$DecorView(FrameLayout).onMeasure(int, int) line: 310
PhoneWindow$DecorView.onMeasure(int, int) line: 2291 : super.onMeasure
PhoneWindow$DecorView(View).measure(int, int) line: 16497
ViewRootImpl.performMeasure(int, int) line: 1916
ViewRootImpl.measureHierarchy(View, WindowManager$LayoutParams, Resources, int, int) line: 1113
ViewRootImpl.performTraversals() line: 1295