测量宽高measuredWidth、measuredHeight
View
的measuredWidth、measuredHeight
如何赋值的?
ViewRootImpl.scheduleTraversals()
->测量、布局和绘制过程的起点
ViewRootImpl.doTraversal()
->
ViewRootImpl.performTraversals()
->
ViewRootImpl.performMeasure(int childWidthMeasureSpec, int childHeightMeasureSpec)
->传入父View
给到子View
的MeasureSpec
测量规格,包括大小和模式View.measure(int widthMeasureSpec, int heightMeasureSpec)
->View.onMeasure(int widthMeasureSpec, int heightMeasureSpec)
->View.getDefaultSize(int size, int measureSpec)
:根据MeasureSpec
测量规格计算子View
的measuredWidth、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
View
的width、height
如何赋值的?
ViewRootImpl.scheduleTraversals()
->测量、布局和绘制过程的起点
ViewRootImpl.doTraversal()
->
ViewRootImpl.performTraversals()
->
ViewRootImpl.performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth, int desiredWindowHeight)
:WindowManager.LayoutParams
提供窗口的详细配置,而desiredWindowWidth
和desiredWindowHeight
则提供目标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-mLeft
,height=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, bottom
,getWidth() / getHeight()
获得的宽高(View
的布局宽高)与getMeasuredWidth() / getMeasuredHeight()
获得的宽高(View
的测量宽高 )永远是相等的
- 不去