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

Pav*_*oda 51 layout android density-independent-pixel

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

android:layout_width="10dip"
Run Code Online (Sandbox Code Playgroud)

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

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

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

像素*DisplayMetrics.density = dip

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

sir*_*rhc 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());
Run Code Online (Sandbox Code Playgroud)

还有其他类型,你可以用它包括使用的名单COMPLEX_UNIT_SP, COMPLEX_UNIT_PT都在我上面链接的页面找到.如果排除(int)类型转换,您将获得浮点数.

我遇到了同样的问题,通过探索代码发现了这一点.

  • 这会将像素转换为DIP而不是DIP转换为像素,我认为这是像素所需要的.当然这是我想要的.你喜欢这样:`(int)(desiredDIP*context.getResources().getDisplayMetrics().density)` (12认同)

Rom*_*rik 45

那是正确的公式.虽然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
Run Code Online (Sandbox Code Playgroud)


小智 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;
Run Code Online (Sandbox Code Playgroud)


erc*_*can 5

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

<dimen name="my_layout_height">120dp</dimen>
Run Code Online (Sandbox Code Playgroud)

然后在你的Activity中引用这个:

getResources().getDimensions(R.dimen.my_layout_height);
Run Code Online (Sandbox Code Playgroud)

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

android:layout_width="@dimen/my_layout_height"
Run Code Online (Sandbox Code Playgroud)