本文共 1875 字,大约阅读时间需要 6 分钟。
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.onMeasurePhoneWindow$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