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

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

android:layout_width="10dip" 

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

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

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

像素* DisplayMetrics.density = dip

在Android的某个地方是否有一个实用的function?

有一个现有的实用程序方法构build,称为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()); 

您可以使用其他types的列表,包括上面链接的页面中的COMPLEX_UNIT_SPCOMPLEX_UNIT_PT 。 如果排除(int)types转换,你将得到浮点数。

我遇到了同样的问题,并通过查找代码来发现这个问题。

那是那里正确的公式。 尽pipeDisplayMetrics.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方法从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; 

我认为最好的方法是不要在代码中定义任何维度,而是使用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"