您的位置:首页 > 其它

view 树的渲染过程

2014-03-26 21:01 162 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: