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


88

Android文档说,有两种尺寸为一个视图时,测量的尺寸绘图尺寸。测量尺寸是在测量过程中计算的尺寸onMeasure方法),而工程图尺寸是屏幕上的实际尺寸。特别是,文档说:

这些值可以但不必与测量的宽度和高度不同。

因此,我的问题是:什么使图纸尺寸与测量尺寸不同?如果onMeasure(int,int)方法符合布局要求(给定参数widthMeasureSpecheightMeasureSpec,则SDK如何确定视图应具有不同的图纸尺寸?

另外,如何在Android源代码中/何处使用测量的宽度/高度来计算绘图的宽度/高度?我试图查看View源代码,但无法弄清楚如何使用measuredWidth / Height计算最终的宽度/高度。也许与填充有关,但是我不确定。


我认为,如果在视图中添加了滚动条,这些措施可能会有所不同。
尤里

也许可以,但是我开发了一个自定义的ViewGroup,这在我的代码中发生了。在出现这种情况之前,我不会处理滚动。因此,我认为不仅仅涉及滚动。
lgfischer 2011年

我确认,我也开发了一个自定义ViewGroup来强制给定的宽高比:我强制测量了宽度和高度(然后建议降低或等于),但是结果是实际的宽度和高度没有改变(不是测量的)。与滚动无关。我真的找不到找到强制实际宽度和高度的方法。
ARLabs'3

Answers:


96

顾名思义,在测量和布局阶段将使用measuredWidth / height。

让我举个例子,

要求一个小部件进行自我测量,该小部件表示它希望为200px x 200px。这是测量的宽度/高度。

在布局阶段,即在onLayout方法中。该方法可以使用其子级的measuredWidth / height,也可以通过调用视图的布局方法来分配新的宽度/高度。

假设onLayout方法调用childview.layout(0,0,150,150),现在视图的宽度/高度与测量的宽度/高度不同。

我建议不要在onLayout方法之外使用measuredWidth / height。

总结。

  1. onMeasure->设置measuredWidth / measuredHeight
  2. onLayout->设置小部件的宽度/高度。

additionallly
public void View.layout(int l, int t, int r, int b)
似乎是地方的位置和大小的分配情况。


也就是说,我们应该始终使用getWidth / getHeight来获取View的“实际”尺寸,对吗?
suitianshi

1
是的,但是如果您要进行自己的布局,则应使用measuredWidth而不是width。
Prakash Nadar 2014年

那么,在onMeasure()中设置维度的目的是什么?我的意思是,布局通道是最后一个通道,您可以在其中设置视图的最终尺寸,而不考虑测量尺寸的大小
edoardotognoni 2015年

@edoardotognoni它取决于布局(LinearLayout,RelativeLayout或您的自定义布局),从而为视图提供正确的大小和位置。
Prakash Nadar

好的,假设该视图显示“我想要这些尺寸”。当布局显示“您将拥有这些尺寸”时。这样对吗?
edoardotognoni
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.