Android:尺寸为毫米或英寸的视图的尺寸不正确

Android: Incorrect size for views with mm or inch dimensions

我有一个layout_height为10mm的按钮,在大多数设备上看起来都是正确的,但是例如在Lg Optimus 2X和Motorola Defy上,按钮的大小约为一半:

我在这些设备上检索了DisplayMetrics信息,这是一个简短的概述:

1
2
3
4
HTC Desire Z:       480x800, density : HIGH, xdpi: 254.0, ydpi: 254.0
Motorola Defy:     480x854, density : HIGH, xdpi: 96.0, ydpi: 96.0
Samsung Galaxy S2: 480x800, density : HIGH, xdpi: 217.71428, ydpi: 218.49463
LG Optimus 2X:     480x800, density : HIGH, xdpi: 160.0, ydpi: 160.0

如您所见,Desire Z和Samsung具有合理的x / y-dpi值。 defy和optimus传递的值太高了,我认为这是错误大小的原因。

除了为这些设备创建单独的布局文件以外,还有其他方法可以解决该硬件错误吗?

还是建议完全不使用毫米/英寸尺寸?


根据您在Kristiono Setyadi的回答中提供的其他信息,我说您应该将按钮的大小设置为48 dp。 dp单位考虑了设备的dpi,因此使用dp指定的内容在具有不同分辨率和dpi的设备上看起来具有相似的物理尺寸。

使用dp单元的一件好事是不受您注意到的硬件错误的影响,因为它不是基于xdpi / ydpi的,而是基于密度Dpi的,它似乎在所有设备上或多或少地正确实现了。

如果其他有类似问题的人找到了这个问题,即使使用dp对您来说足够好,我也会尝试回答您的其他问题。

Is there any other way to get around that hardware bug except creating seperate layout files for those devices?

您不应为这些设备创建单独的布局文件,因为那里有更多以相同方式损坏的设备。我发现Galaxy Mini和Galaxy S3 Mini是另外两部性能相同的手机。

Or is it recommended not using mm/in sizes at all?

如果您确实需要特定的毫米或英寸数,则可以使用毫米/英寸。在这种情况下,由于所有设备之间的每英寸dp数不同,因此无法在所有设备上使用dp。有关此内容的更多详细信息,请参见:Android:要使用的UI元素大小单位(如果dp不起作用)

使用mm / in时,必须注意报告xdpi / ydpi值错误的"损坏"设备。

一种解决方法是对DisplayMetrics.xdpi / DisplayMetrics.densityDpi大于0.8但小于1.2的设备使用mm或inch,对其他设备使用dp,因为密度Dpi和xdpi之间差异较大的设备可能报告错误xdpi的值。

有关可用单位以及毫米和英寸问题的更多详细信息,请参见:为什么在以英寸(英寸)或毫米(毫米)为单位使用尺寸时,棉绒会显示警告?


您不应使用mm / in大小来声明UI的尺寸值。不推荐。为什么?因为它将无法在所有设备上正确缩放。

推荐的方法是使用dp / sp测量视图对象/字体大小。

阅读本文:

更多资源类型-维度