【问题标题】:Converting dp to px without Context在没有上下文的情况下将 dp 转换为 px
【发布时间】:2017-07-29 03:36:56
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: android screen-size pixel-density


    【解决方案1】:

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

    是的,有!

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

    documentationResources.getSystem()

    返回一个全局共享资源对象,该对象仅提供对 系统资源(无应用程序资源),并且未配置为 当前屏幕(不能使用尺寸单位,不改变基于 关于方向等)。

    【讨论】:

    • 谢谢。在我的情况下,应用程序没有“cast”选项,但它可能会在奇怪的设备上失败like this one
    【解决方案2】:

    这里有一个小的 Kotlin 扩展函数:

    private fun Context.dpToPx(dp: Float): Float {
        val density = this.resources.displayMetrics.density
        return (dp * density).roundToInt().toFloat()
    }
    

    【讨论】:

      【解决方案3】:

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

      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() 是否可以在方向更改时正常工作。

      【讨论】:

        猜你喜欢
        • 2019-04-17
        • 2017-05-27
        • 2018-08-15
        • 2021-10-24
        • 1970-01-01
        • 2017-04-10
        • 1970-01-01
        • 2018-04-09
        • 2017-04-05
        相关资源
        最近更新 更多