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

Posted

技术标签:

【中文标题】在 Kotlin 中将 Dp 转换为 Px - 此转换永远不会成功【英文标题】:Convert Dp to Px in Kotlin - This cast can never succeed 【发布时间】:2019-06-21 04:17:43 【问题描述】:

我在使用 Kotlin 编码时遇到了问题。我复制粘贴了将 DP 转换为像素的java code sample,以便将其作为以编程方式设置填充的参数。我期待 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 标有错误

“这个演员永远不会成功”

如何解决这个问题?

【问题讨论】:

【参考方案1】:

为什么不尝试使用扩展功能,例如

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

转换为 DP 和

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

转换为像素?

希望对你有帮助:)

【讨论】:

这是最简单的方法。其他的已弃用。【参考方案2】:

如果你在dimens.xml中有值

<dimen name="textSize">24dp</dimen>

然后,您可以将像素值作为 Int

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

【讨论】:

【参考方案3】:

可以通过删除演员as Int来解决错误,而是用方法.toInt()替换它

val scale = resources.displayMetrics.density
val dpAsPixels = (16.0f * scale + 0.5f).toInt()

【讨论】:

以上是关于在 Kotlin 中将 Dp 转换为 Px - 此转换永远不会成功的主要内容,如果未能解决你的问题,请参考以下文章

如何在 kotlin 中将纪元时间戳转换为 unix 十六进制时间戳?

如何在 Xamarin 表单中将边距、填充、宽度和高度值转换为像素(px)?

在 Javascript 中将 em 转换为 px(并获取默认字体大小)

如何在处理程序中将 java 转换为 kotlin

如何在 Kotlin 中将 String 转换为 Int?

如何在 Kotlin 中将 Firestore 日期/时间戳转换为日期?