在Android SDK中,getWidth/Height()和getMeasuredWidth/Height()有什么区别?

109
Android文档指出视图有两个尺寸:测量尺寸和绘制尺寸。测量尺寸是在measure pass(即onMeasure方法)中计算的尺寸,而绘制尺寸是屏幕上的实际大小。特别地,文档指出:

这些值可能与测量宽度和高度不同,但也可能相同。

那么,我的问题是:什么因素会导致绘制尺寸与测量尺寸不同?如果onMeasure(int, int)方法遵循布局要求(作为参数widthMeasureSpecheightMeasureSpec),那么SDK如何决定视图应具有不同的绘制尺寸?
此外,在Android源代码中如何/在哪里使用测量宽度/高度来计算绘图宽度/高度?我尝试查看View源代码,但我无法弄清测量宽度/高度如何用于计算最终的宽度/高度。也许与填充有关,但我不确定。

我认为,如果视图添加了滚动条,这些措施可能会有所不同。 - Yury
也许吧,但我开发了一个自定义的ViewGroup,并且这是在我的代码中发生的。在此行为发生之前,我并没有涉及到滚动。因此,我认为这不仅仅涉及到滚动。 - lgfischer
我确认,我也开发了一个自定义的ViewGroup来强制给定的宽高比:我强制测量宽度和高度(小于或等于提议值),但结果是真实的宽度和高度没有改变(不是测量值)。与滚动无关。我真的找不到一种方法来强制真实的宽度和高度。 - ARLabs
1个回答

114
正如其名称所示,measuredWidth/height在测量和布局阶段使用。
让我举个例子,
一个小部件被要求自我测量,小部件说它想要200像素乘以200像素。这是measuredWidth/height。
在布局阶段,即在onLayout方法中。该方法可以使用其子元素的measuredWidth/height或通过调用视图的layout方法分配新的宽度/高度。
假设onLayout方法调用childview.layout(0,0,150,150),现在视图的宽度/高度与测量的宽度/高度不同。
我建议不要在onLayout方法之外使用measuredWidth/height。
总结一下,
1. onMeasure->设置measuredWidth/measuredHeight
2. onLayout->设置小部件的宽度/高度。
另外, public void View.layout(int l, int t, int r, int b)
似乎是位置和大小分配发生的地方。

我们应该始终使用getWidth/getHeight来获取View的“真实”尺寸,对吗? - suitianshi
1
是的,但如果您正在进行自己的布局,则应使用measuredWidth而不是width。 - Prakash Nadar
@edoardotognoni 这取决于布局(LinearLayout、RelativeLayout或您自定义的布局),以便为视图提供正确的大小和位置。 - Prakash Nadar
@edoardotognoni 是的。但是由于我实现了许多自定义视图,测量宽度与宽度不同的情况很少见。但您应该避免使用不正确的宽度。测量宽度可能并不总是与宽度相同。 - Prakash Nadar
1
嗨,我正在创建一个画布。对于宽度/高度,我应该传递测量的宽度/高度还是只是使用getWidth() / getHeight()。另外,为什么不应该在onLayout()方法之外使用measuredWidth / measuredHeight?谢谢。 - CodingChap
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接