如何使用 DPI 缩放因子 (float) 设置边距 (int)

Posted

技术标签:

【中文标题】如何使用 DPI 缩放因子 (float) 设置边距 (int)【英文标题】:How to use DPI scaling factor (float) to set margins (int) 【发布时间】:2012-06-25 23:32:34 【问题描述】:

我的 android 应用在 480x800 像素分辨率下看起来很棒,但在 240x400 像素的 LDPI 屏幕上会中断。我知道我可以使用getResources().getDisplayMetrics().density 获得活动中屏幕的缩放因子,这将根据屏幕分辨率给出确切的float 值。

在我的应用程序中,我在其中使用了RelativeLayoutImageViews,并使用setMargins() 设置图像的边距,因为此方法使用int 中的像素作为其顶部、左侧、底部和右侧值,如何使用我得到的 DPI 因子设置这些值?(这是一个浮点数)。我们有Math.floor(),但我使用像素将图像定位在非常特定的位置,并且方法返回的 DPI 因子在小数位具有非常具体的值,不能忽略,所以转换为int 对我不起作用.

更新

另外,我使用lp.setMargins(100,200,0,0); 设置边距,我将对其进行哪些修改以使用从设备收到的 DPI 因子?

附:我知道这更像是一个数学问题而不是编程,但我的数学很差,抱歉。

【问题讨论】:

【参考方案1】:

看起来我问这个问题还为时过早,而不是摆弄自己,但我也注意到我根本不是第一个面对这个问题的人。

所以,这是我找到的解决方案。

我在我的 Activity 类中创建了以下方法。

private int px(float dips)

    float DP = getResources().getDisplayMetrics().density;
    return Math.round(dips * DP);

这会将给定的dp 值转换为适当的像素。您可以将方法中使用的变量DP 设为全局变量,并在您的onCreate() 方法中而不是在px() 中对其进行初始化,以使方法快速执行。

用法:

lp.setMargins(px(100),px(200), 0, 0);

或者,如果您不为此创建 px() 并将 DP 设为全局。

lp.setMargins(100 * Math.round(DP), 200 * Math.round(DP), 0, 0);

然而,使用方法使它看起来更干净和可读。 :-)

【讨论】:

以上是关于如何使用 DPI 缩放因子 (float) 设置边距 (int)的主要内容,如果未能解决你的问题,请参考以下文章

如何让MFC程序在高DPI设置时禁用显示缩放

C++ Windows API - 如何检索字体缩放百分比

Windows:缩放设置及DPI缩放详解

Windows:缩放设置及DPI缩放详解

如何编写自动缩放到系统字体和 dpi 设置的 WinForms 代码?

win10 dpi设置是啥意思