在Kotlin中将Dp转换为Px - 此强制转换永远不会成功。

17

在使用 Kotlin 编码时遇到了问题。我复制粘贴了一个将 DP 转换为像素的Java 代码示例,以将其作为设置填充参数的程序化方式。我希望 IDE 能够自动将其全部转换为 Kotlin,但是该过程失败了。

Java 中的代码如下:

float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);

翻译成 Kotlin 后:

val scale = resources.displayMetrics.density
val dpAsPixels = (sizeInDp * scale + 0.5f) as Int 

这个 as Int 转换标记了一个错误

"这个转换永远不可能成功"

如何修复?

5个回答

36

为什么不尝试使用类似于扩展函数的东西呢,比如

val Int.dp: Int get() = (this / getSystem().displayMetrics.density).toInt()

转换为 DP 和

val Int.px: Int get() = (this * getSystem().displayMetrics.density).toInt()

如何将其转换为像素?

希望对你有所帮助 :)


2
那是最简单的方法。其他的已经过时了。 - Mark Delphi

7
错误可以通过删除转换为 Int 的强制转换,并使用方法 .toInt() 替换来解决。
val scale = resources.displayMetrics.density
val dpAsPixels = (16.0f * scale + 0.5f).toInt()

6
如果您在dimens.xml中设置了数值。
<dimen name="textSize">24dp</dimen>

然后,您可以将像素值作为整数获取。

val value = resources.getDimensionPixelSize(R.dimen.textSize)

这种方法似乎是一个不错的选择,因为我们可以根据屏幕分辨率来分离维度。 - Arul

3

Extensions.kt文件

val Int.dp: Int
    get() = (toFloat() * Resources.getSystem().displayMetrics.density + 0.5f).toInt()

0
您可以尝试这些扩展函数,它不需要 "context" 并且对于整数值会将其四舍五入到下一个整数值。
private fun getDip(): Float = Resources.getSystem().displayMetrics.density
fun Float.dp() = this * getDip()
fun Int.dp() = (this * getDip()).roundToInt()

你可以这样使用它:
val width = 48.dp()
val height = 2.5f.dp()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接