大多数Jetpack Compose API使用Dp作为尺寸单位,但有时需要像素值。如何将dp值转换为px?举个例子,graphicsLayer()修饰符接受以像素为单位的translationX/Y
参数。
密度接口定义了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() }
如果您是Kotlin语言的新手,那么这样的表达式可能会让您感到困惑,所以让我们来分解一下,看看它是如何工作的。toPx()
是Dp
类的扩展函数,可以看作是Dp
类的方法。但是由于toPx()
是在密度接口内定义的,所以除非提供密度作为接收器,否则不能使用它。最后,您可以从名为LocalDensity的compostionlocal中获得当前密度。
@Valeriy的答案绝对是正确的方法,但如果你想让它稍微不那么冗长,或者你有很多转换要做,你可以创建扩展函数:
@Composable
fun Dp.dpToPx() = with(LocalDensity.current) { this@dpToPx.toPx() }
@Composable
fun Int.pxToDp() = with(LocalDensity.current) { this@pxToDp.toDp() }
这允许您将dp直接转换为px,反之亦然。
val dpValue = 16.dp
val pxConverted = dpValue.dpToPx()
val pxValue = 100
val dpConverted = pxValue.pxToDp()