52

我发现可以使用 DIP 在 XML 布局中设置界面元素的尺寸,如下所示:

android:layout_width="10dip"

但是所有 Java 接口都将整数作为参数,并且无法在 DIP 中指定维度。计算这个的正确方法是什么?

我认为我必须使用DisplayMetrics类的属性密度,但这是正确的方法吗?

我可以依靠这个公式总是正确的吗?

像素 * DisplayMetrics.density = dip

Android中某处是否有用于转换的实用功能?

4

4 回答 4

92

有一个名为的现有实用程序方法TypedValue.applyDimensions(int, float, DisplayMetrics)可以执行此操作。

以下是如何使用它:

// returns the number of pixels for 123.4dip
int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
                     (float) 123.4, getResources().getDisplayMetrics());

您可以使用其他类型的列表,包括COMPLEX_UNIT_SPCOMPLEX_UNIT_PT所有这些都可以在我上面链接的页面中找到。如果排除 (int) 类型转换,您将获得浮点数。

我遇到了同样的问题,并通过查看代码发现了这一点。

于 2010-04-21T14:26:08.273 回答
46

那是那里的正确公式。虽然DisplayMetrics.density不是静态成员,但根据您提到的同一个文档,正确的用法是:

// Maybe store this in a static field?
final float SCALE = getContext().getResources().getDisplayMetrics().density;

// Convert dips to pixels
float valueDips = 16.0f;
int valuePixels = (int)(valueDips * SCALE + 0.5f); // 0.5f for rounding
于 2010-02-10T18:11:30.790 回答
9

使用显示指标密度字段,您可以获得一个比例因子来转换为/从下降。使用 Math.round 方法将浮点数转换为 int,无需强制转换或添加 0.5

// Converting dips to pixels
float dips = 20.0f;
float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = Math.round(dips * scale);

// Converting pixels to dips
int pixels = 15;
float scale = getContext().getResources().getDisplayMetrics().density;
float dips = pixels / scale;
于 2011-04-26T21:17:31.480 回答
5

我认为最好的方法不是在代码中定义任何维度,而是使用values/dimens.xml文件。您始终可以以所需的单位定义尺寸,例如:

<dimen name="my_layout_height">120dp</dimen>

然后在您的活动中引用此内容,例如:

getResources().getDimensions(R.dimen.my_layout_height);

这将在进行必要的转换后返回像素。当然,您也可以在其他 XML 中引用它,例如:

android:layout_width="@dimen/my_layout_height"
于 2014-03-06T10:15:51.620 回答