View -> 测量宽高measuredWidth、measuredHeight和布局宽高width、height的区别

测量宽高measuredWidth、measuredHeight

ViewmeasuredWidth、measuredHeight如何赋值的?

ViewRootImpl.scheduleTraversals()->测量、布局和绘制过程的起点
ViewRootImpl.doTraversal()->
ViewRootImpl.performTraversals()->

  • ViewRootImpl.performMeasure(int childWidthMeasureSpec, int childHeightMeasureSpec)->传入父View给到子ViewMeasureSpec测量规格,包括大小和模式
    • View.measure(int widthMeasureSpec, int heightMeasureSpec)->
    • View.onMeasure(int widthMeasureSpec, int heightMeasureSpec)->
    • View.getDefaultSize(int size, int measureSpec):根据MeasureSpec测量规格计算子ViewmeasuredWidth、measuredHeight
    • View.setMeasuredDimension(int measuredWidth, int measuredHeight)->
    • View.setMeasuredDimensionRaw(measuredWidth, measuredHeight):记录measuredWidth、measuredHeight
public static int getDefaultSize(int size, int measureSpec) {
    int result = size;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);

    switch (specMode) {
    case MeasureSpec.UNSPECIFIED:
        result = size;
        break;
    case MeasureSpec.AT_MOST:
    case MeasureSpec.EXACTLY:
        result = specSize;
        break;
    }
    return result;
}
private void setMeasuredDimensionRaw(int measuredWidth, int measuredHeight) {
    mMeasuredWidth = measuredWidth;
    mMeasuredHeight = measuredHeight;

    mPrivateFlags |= PFLAG_MEASURED_DIMENSION_SET;
}

布局宽高width、height

Viewwidth、height如何赋值的?

ViewRootImpl.scheduleTraversals()->测量、布局和绘制过程的起点
ViewRootImpl.doTraversal()->
ViewRootImpl.performTraversals()->

  • ViewRootImpl.performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth, int desiredWindowHeight)WindowManager.LayoutParams 提供窗口的详细配置,而 desiredWindowWidthdesiredWindowHeight 则提供目标View尺寸,最终决定View的布局和显示
    • View.layout(int l, int t, int r, int b)->
    • View.setFrame(int left, int top, int right, int bottom)->记录mLeft、mTop、mRight、mBottom,其中width=mRight-mLeftheight=mBottom-mTop,计算出View的布局宽高width、height
protected boolean setFrame(int left, int top, int right, int bottom) {
    ...
	mLeft = left;
	mTop = top;
	mRight = right;
	mBottom = bottom;
    ...
}

测量宽高measuredWidth、measuredHeight和布局宽高width、height

  • 应用场景
    • getMeasuredWidth() / getMeasuredHeight():在onLayout()中获取View的宽/高
    • getWidth() / getHeight():在除onLayout()外的地方获取View的宽/高
  • 关系:
    • 不去layout方法中去修改left, top, right, bottomgetWidth() / getHeight()获得的宽高(View的布局宽高)与 getMeasuredWidth() / getMeasuredHeight()获得的宽高(View的测量宽高 )永远是相等的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值