安卓:为什么getDimension和getDimensionPixelSize都返回相同的值?

32
我觉得getDimension和getDimensionPixelSize这两个方法很令人困惑。
从字面上理解,getDimension应该返回存储在尺寸中的实际值,例如10dp,而getDimensionPixelSize则将其转换为px并返回。
但是实际上它们似乎都做同样的事情...

2
也许设备屏幕密度是mdpi?那么它们将是相同的。 - Daniel Alexandrov
1
这是一个非常好的问题。我也曾经想过这个问题。getDimension 的文档实际上不够完善,因为其表述和命名有些不清晰,而且输出的单位也不明确。感谢您提出这个问题。 - Trilarion
2个回答

58

getDimension() 返回一个浮点数,该浮点数是根据当前显示度量调整后的dimen值:

getDimensionPixelSize() 返回一个整数。它与getDimension()相同,但将其四舍五入为一个int,并确保任何非零尺寸至少有一个像素大小。

对于整数维度值,它们都返回相同的数值。


9
我不知道“根据当前显示指标进行调整”到底意味着什么? - Trilarion
4
这句话的意思是,对于以“dp”为单位指定的值,它们将根据屏幕的密度转换为像素。例如,在“xhdpi”屏幕上,维度为“5dp”的实际返回值将是10个像素。类似地,对于“sp”等其他单位也是如此(尽管实际公式可能有所不同)。 - Melllvar

2

我认为很明显你正在一个mdpi设备或模拟器上进行测试。
在mdpi屏幕上,1px = 1dp。

所以,只需在不同密度的屏幕上测试这些方法即可。


注意

public float getDimension (int id)

Retrieve a dimensional for a particular resource ID.  
Unit conversions are based on the current DisplayMetrics associated with the resources.

Parameters  
id  The desired resource identifier, as generated by the aapt tool.  
This integer encodes the package, type, and resource entry. The value 0 is an invalid identifier.

Returns  
Resource dimension value multiplied by the appropriate metric.

因此,如果您在xml布局中将单位设置为px,则会得到原始的px值(未转换)。
否则,如果您在xml布局中正确地将单位设置为dp,则会获得正确的px转换。


1
不是将dp转换为px,而是将px转换为dp。我在另一种密度的设备上进行了测试,getDimension返回一个缩放值。 - user3591115
好的,我已经更正了我的答案。 - Phantômaxx
4
我认为官方文档在这里可以改进。什么是“一个维度”?“基于...”是什么意思?为什么他们不能简单地说他们使用DisplayMetrics将其转换为像素? - Trilarion
18
因为这样可以使官方文档变得真正有用。 - David Liu

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