【问题标题】:Android and setting width and height programmatically in dp unitsAndroid 并以 dp 单位编程设置宽度和高度
【发布时间】:2011-07-12 10:17:26
【问题描述】:

我在做:

button.setLayoutParams(new GridView.LayoutParams(65, 65));

根据文档,宽度和高度的单位(以上均为 65)是“像素”。你如何强制它成为与设备无关的像素或“dp”?

【问题讨论】:

    标签: android scaling


    【解决方案1】:

    您必须使用显示比例因子将其从 dps 转换为像素。

    final float scale = getContext().getResources().getDisplayMetrics().density;
    int pixels = (int) (dps * scale + 0.5f);
    

    【讨论】:

    • 正确的转换是 (int) (dps * scale + 0.5f)。这是我们在整个框架中使用的公式。
    • 公式在文档中。如需进一步阅读,请转到developer.android.com/guide/practices/… 的第 3 部分
    • @RomainGuy,您能否在 API 中添加一个实用函数以将 dp 转换为 px?谢谢。
    • 这里的dps是什么?我收到“dps 无法解析为变量”错误?什么类型的“dps”需要声明??
    • “dps”变量是要转换的输入值。
    【解决方案2】:

    我知道这是一个老问题,但是我找到了一种更简洁的方法来进行这种转换。

    Java

    TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());
    

    科特林

    TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)
    

    【讨论】:

    • 很好地了解了如何执行此操作。我不喜欢在几个地方重复一个公式!谢谢。
    • 如果没有,则用公式创建函数
    • @Kenobi 它为您完成从 DP 到 PX 的转换。上面的65就是你要转换成PX的DP值
    • 这应该是公认的答案,而不是当前这些数字(0.5)不知从何而来的答案
    • @Johny19 0.5 并不神奇。这只是如何将浮点数舍入到最接近的整数而不是截断它。有关更多详细信息,请参阅我对 Robby Pond 答案的评论。
    【解决方案3】:

    根据您的要求,还有其他解决方案。似乎您在编译时就知道 dp 中的尺寸,因此您可以在资源中添加一个 dimen 条目。然后你可以查询dimen条目,它会在这个调用中自动转换为像素:

    final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);
    

    您的dimens.xml 将有:

    <dimen name="dimen_entry_in_dp">72dp</dimen>
    

    扩展这个想法,您可以简单地将 1dp 或 1sp 的值存储为 dimen 条目并查询该值并将其用作乘数。使用这种方法,您可以将代码与数学内容隔离开来,并依靠库来执行计算。

    【讨论】:

    • 请注意,返回值实际上是一个 int,所以它被强制转换为一个浮点数。
    • 这是一个糟糕的答案,因为它是动态的
    【解决方案4】:

    经过测试的最简单方法(甚至可以从 api 1 开始)是:

    getResources().getDimensionPixelSize(R.dimen.example_dimen);
    

    来自文档:

    检索特定资源 ID 的维度以用作大小 以原始像素为单位。这与 getDimension(int) 相同,除了 返回值转换为整数像素以用作大小。一种 大小转换涉及对基值进行四舍五入,并确保 非零基值的大小至少为一个像素。

    是的,它对值进行了四舍五入,但并不是很糟糕(当 ldpi 不是很常见时,hdpi 和 ldpi 设备上的奇数值需要添加一点值) 我在将 4dp 转换为 16(像素)的 xxhdpi 设备中进行了测试,这是真的。

    【讨论】:

    • 你是传奇
    【解决方案5】:

    基于 drspaceboo 的解决方案,借助 Kotlin,您可以使用扩展程序更轻松地将 Float 转换为 dips。

    fun Float.toDips() =
            TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, resources.displayMetrics);
    

    用法:

    (65f).toDips()
    

    【讨论】:

      猜你喜欢
      • 2014-01-23
      • 1970-01-01
      • 2011-04-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 2018-02-16
      • 1970-01-01
      相关资源
      最近更新 更多