从Java代码中指定DIP中的维度的正确方法是什么?

时间:2010-02-10 17:22:35

标签: android layout density-independent-pixel

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

android:layout_width="10dip"

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

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

我可以依赖这个公式永远正确吗?

  

像素* DisplayMetrics.density = dip

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

4 个答案:

答案 0 :(得分:91)

有一个名为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)类型转换,则会得到浮点数。

我遇到了同样的问题,并通过探索代码找到了这个。

答案 1 :(得分:45)

那是正确的公式。虽然DisplayMetrics.density不是静态成员,但根据same document you alluded to,正确用法是:

// 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

答案 2 :(得分:9)

使用显示指标密度字段,您可以获得转换为/从倾角转换的比例因子。使用Math.round方法从float转换为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;

答案 3 :(得分:5)

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

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

然后在你的Activity中引用它:

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

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

android:layout_width="@dimen/my_layout_height"