7

有一种非常简洁的方法可以在没有上下文的情况下将 dp 转换为 px,它是这样的:

public static int dpToPx(int dp) {
    float density = Resources.getSystem().getDisplayMetrics().density;
    return Math.round((float) dp * density);
}

Google GitHub 页面上的每个 Google 示例中,他们都使用以下方法:

public static int convertDpToPixel(Context ctx, int dp) {
    float density = ctx.getResources().getDisplayMetrics().density;
    return Math.round((float) dp * density);
}

那么第一种方法有问题吗?对我来说,它在我所有的应用程序中都可以正常工作,但我想知道在某些情况下它可能会失败吗?

4

3 回答 3

7

在某些情况下它可能会失败吗?

就在这里!

Android 支持不同的屏幕,例如您可以使用 Chromecast 投射应用程序或通过其他方式连接到不同的屏幕。在这种情况下,这些值将无法正确转换到其他屏幕。

文档Resources.getSystem()

返回一个全局共享资源对象,该对象仅提供对系统资源(无应用程序资源)的访问,并且未针对当前屏幕进行配置(不能使用维度单位,不根据方向更改等)。

于 2017-03-08T14:25:23.300 回答
0

根据以前的答案,这些扩展应该可以工作:

val Int.dp get() = this / (Resources.getSystem().displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
val Float.dp get() = this / (Resources.getSystem().displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)

val Int.px get() = this * Resources.getSystem().displayMetrics.density
val Float.px get() = this * Resources.getSystem().displayMetrics.density

用法:

val dpValue = 2.dp
val pxFromDpValue = 2.px

重要的:

我不确定是否Resources.getSystem()可以在方向更改时正常工作。

于 2021-11-11T11:53:55.190 回答
0

这是一个小的 Kotlin 扩展函数:

private fun Context.dpToPx(dp: Float): Float {
    val density = this.resources.displayMetrics.density
    return (dp * density).roundToInt().toFloat()
}
于 2021-08-28T14:52:14.360 回答