我发现可以使用 DIP 在 XML 布局中设置界面元素的尺寸,如下所示:
android:layout_width="10dip"
但是所有 Java 接口都将整数作为参数,并且无法在 DIP 中指定维度。计算这个的正确方法是什么?
我认为我必须使用DisplayMetrics
类的属性密度,但这是正确的方法吗?
我可以依靠这个公式总是正确的吗?
像素 * DisplayMetrics.density = dip
Android中某处是否有用于转换的实用功能?
我发现可以使用 DIP 在 XML 布局中设置界面元素的尺寸,如下所示:
android:layout_width="10dip"
但是所有 Java 接口都将整数作为参数,并且无法在 DIP 中指定维度。计算这个的正确方法是什么?
我认为我必须使用DisplayMetrics
类的属性密度,但这是正确的方法吗?
我可以依靠这个公式总是正确的吗?
像素 * DisplayMetrics.density = dip
Android中某处是否有用于转换的实用功能?
有一个名为的现有实用程序方法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_SP
, COMPLEX_UNIT_PT
所有这些都可以在我上面链接的页面中找到。如果排除 (int) 类型转换,您将获得浮点数。
我遇到了同样的问题,并通过查看代码发现了这一点。
那是那里的正确公式。虽然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
使用显示指标密度字段,您可以获得一个比例因子来转换为/从下降。使用 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;
我认为最好的方法不是在代码中定义任何维度,而是使用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"