大多数Jetpack Compose API使用Dp作为尺寸单位,但有时需要像素值。如何将dp值转换为px?例如,有一个graphicsLayer()修饰符,它可以接受以像素为单位的translationX/Y
参数。
大多数Jetpack Compose API使用Dp作为尺寸单位,但有时需要像素值。如何将dp值转换为px?例如,有一个graphicsLayer()修饰符,它可以接受以像素为单位的translationX/Y
参数。
toPx()
和roundToPx()
是由Density接口定义的方法,您可以像这样使用它:
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()
定义在 Density 接口内部,除非你提供一个密度作为接收器,否则无法使用它。最后,你可以从名为 LocalDensity 的 CompositionLocal 中获取当前密度。
@Valeriy的回答绝对是正确的方法,但如果您希望它稍微简洁一些或者有很多转换需要做的话,您可以创建扩展函数:
@Composable
fun Dp.dpToPx() = with(LocalDensity.current) { this@dpToPx.toPx() }
@Composable
fun Int.pxToDp() = with(LocalDensity.current) { this@pxToDp.toDp() }
val dpValue = 16.dp
val pxConverted = dpValue.dpToPx()
val pxValue = 100
val dpConverted = pxValue.pxToDp()
LocalDensity
,我已经检查过了) - EpicPandaForcealpha-12
开始Ambient
被命名为CompositionLocal
,我已更新答案。 - Valeriy KatkovLocalDensity.current.run { 16.toDp() }
。 - sea cat