View measure

来源:互联网 发布:比较编程语言书籍 编辑:程序博客网 时间:2024/05/16 01:28

ViewRootImpl类的performTraversals()中组装了初始的MeasureSpec

int childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width);int childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height);……performMeasure();……performLayout();……performDraw();

getRootMeasureSpec():

/** * Figures out the measure spec for the root view in a window based on it's * layout params. * * @param windowSize The available width or height of the window * * @param rootDimension The layout params for one dimension (width or height) of the window. * * @return The measure spec to use to measure the root view. */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;}

performMeasure()会调用View的measure():

private void performMeasure(int childWidthMeasureSpec, int childHeightMeasureSpec) {    Trace.traceBegin(Trace.TRACE_TAG_VIEW, "measure");    try {        mView.measure(childWidthMeasureSpec, childHeightMeasureSpec);    } finally {        Trace.traceEnd(Trace.TRACE_TAG_VIEW);    }}

performLayout()会调用View的layout(),performDraw()会调用drawSoftware(),drawSoftware()中调用到mView.draw(canvas);
draw()中调用到onDraw()

原创粉丝点击