在 Android 中自动从 px 转换为 sp 或 dp

Converting automatically from px to sp or dp in Android

我得到了一个布局设计,其中说明了我保存在 dimen 资源文件中的像素大小。

有没有一种自动方法可以让 Android 将 px 单位自动转换为字符串的 sp 或其他尺寸的 dp,而不需要我每次都调用转换单位的方法?

如果不是,如果所有单位都以 px 为单位,我如何在布局的 xml 中定义特定尺寸?

如果你读过 here 你就会明白你想要的并不是最好的解决方案。

我建议您将所有 px 更改为 dp,然后将它们放在文件中

您的应用很可能适用于不止一种密度的屏幕,因此像素方式是非常糟糕的选择

Designing layouts for dp

When designing layouts for the screen, calculate an element’s measurements in dp:

dp = (width in pixels * 160) / density

For example, a 32 x 32 px icon with a screen density of 320 equals 16 x 16 dp.

更新

不幸的是,你想要的不可能发生。您将必须为不同密度的屏幕生成不同的 dp 值。另请阅读如何支持来自 official documentation

的不同屏幕密度

你需要一直调用一个函数, 或者您需要创建扩展视图的自定义视图并覆盖自动转换它们的 size/textSize 函数

class CustomTextView : AppCompatTextView {

    override fun setTextSize(size: Float) {
        // do the convertion here
        super.setTextSize(size)
    }

    override fun setTextSize(unit: Int, size: Float) {
        // or here
        super.setTextSize(unit, size)
    }
}

如果您不想一直编写函数,您可能需要扩展每个使用维度的视图。

很遗憾,系统无法自动为您完成 px 到 dp 的转换。

但是,您可以为各种屏幕尺寸定义多个值文件夹,并为每个文件夹定义不同的尺寸(以 dp 为单位)。

有关详细信息,请参阅此问题:

从 PX 到 dp 或 sp 的转换是你必须自己做的事情。

总而言之,您不应该这样做,因为 dp 和 sp 中定义的大多数时间值都适合大多数屏幕尺寸,因此请先尝试一下。