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

发布于 2024-08-20 19:10:00 字数 334 浏览 16 评论 0原文

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

android:layout_width="10dip"

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

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

我可以相信这个公式总是正确的吗?

像素 * DisplayMetrics.密度 = 倾角

Android 中是否有用于转换的实用函数?

I found that it is possible to set dimensions of my interface elements in XML layouts using DIPs as in following fragment:

android:layout_width="10dip"

But all Java interface takes integer as arguments and there is no way to specify dimensions in DIPs. What is the correct way to calculate this?

I figured that I have to use property density of DisplayMetrics class but is this a correct way?

May I rely on this formula being always correct?

pixels * DisplayMetrics.density = dip

Is there a utility function for the conversion somewhere in Android?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

爱,才寂寞 2024-08-27 19:10:00

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

我遇到了同样的问题,通过研究代码发现了这个问题。

There is an existing utility method built called TypedValue.applyDimensions(int, float, DisplayMetrics) that does this.

Here's how to use it:

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

There's a list of other types that you can use with it including COMPLEX_UNIT_SP, COMPLEX_UNIT_PT all found in the page I linked above. If you exclude the (int) typecast, you'll get the floating point number.

I encountered the same problem and found this through poking around the code.

夏有森光若流苏 2024-08-27 19:10:00

这是正确的公式。虽然 DisplayMetrics.densis 不是静态成员,因此,根据 您提到的同一文档,正确的用法是:

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

That is the correct formula there. Although DisplayMetrics.density is not a static member, so, according to the same document you alluded to, correct usage is:

// 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
当梦初醒 2024-08-27 19:10:00

使用显示指标密度字段,您可以获得一个比例因子来转换为下降或从下降转换。使用 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;

Using the display metrics density field, you can get a scaling factor to convert to/from dips. Use the Math.round method to convert from a float to an int without needing a cast or adding 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;
烟沫凡尘 2024-08-27 19:10:00

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

I think the best way is not to define any dimensions in code, but use the values/dimens.xml file instead. You can always define your dimension in the desired unit like:

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

and then refer to this in your Activity like:

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

This would return pixels after doing the necessary conversions. And also of course you can refer to this in your other XMLs like:

android:layout_width="@dimen/my_layout_height"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文