如何在 Android Jetpack Compose 中将 Dp 转换为像素?

Val*_*kov 10 android android-jetpack android-jetpack-compose

大多数 Jetpack Compose API 使用Dp作为尺寸单位,但有时需要像素值。如何将 dp 值转换为 px?举个例子,graphicsLayer()修饰符接受translationX/Y以像素为单位的参数。

Oli*_*etz 41

@Valeriy 的答案绝对是正确的方法,但如果你希望它稍微不那么冗长,或者你有很多转换要做,你可以创建扩展函数:

@Composable
fun Dp.dpToPx() = with(LocalDensity.current) { this@dpToPx.toPx() }


@Composable
fun Int.pxToDp() = with(LocalDensity.current) { this@pxToDp.toDp() }
Run Code Online (Sandbox Code Playgroud)

这可以让您将 dp 直接转换为 px,反之亦然。

val dpValue = 16.dp
val pxConverted = dpValue.dpToPx()

val pxValue = 100
val dpConverted = pxValue.pxToDp()
Run Code Online (Sandbox Code Playgroud)


Val*_*kov 23

还有就是toPx()roundToPx()被定义的方法密度接口,你可以使用它像这样:

import androidx.compose.ui.platform.LocalDensity

val pxValue = with(LocalDensity.current) { 16.dp.toPx() }

// or

val pxValue = LocalDensity.current.run { 16.dp.toPx() }

Run Code Online (Sandbox Code Playgroud)

如果您不熟悉 Kotlin 语言,这样的表达式可能看起来令人困惑,所以让我们分解它并看看它是如何工作的。toPx()是一种扩展功能Dp类,你可以把它看作是一个Dp类的方法。但由于toPx()是在Density接口中定义的,除非您提供密度作为接收器,否则您无法使用它。最后,您可以从名为LocalDensityCompositionLocal获取当前密度。

  • 如果你想从像素转换为 Dp,则为``LocalDensity.current.run { 16.toDp() }``` (9认同)