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

问题描述 投票:0回答:3

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

translationX/Y
像素参数。

android android-jetpack android-jetpack-compose
3个回答
184
投票

Density

接口定义了
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()
是在 Density 接口中定义的,因此除非提供密度作为 receiver,否则无法使用它。最后,您可以从名为 LocalDensityCompositionLocal 获取当前密度。


42
投票

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

@Composable
fun Dp.dpToPx() = with(LocalDensity.current) { [email protected]() }


@Composable
fun Int.pxToDp() = with(LocalDensity.current) { [email protected]() }

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

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

val pxValue = 100
val dpConverted = pxValue.pxToDp()

0
投票

我使用这种方法有两个优点:

  1. “内联”
  2. 它是变量(不是函数)
inline val Int.dp: Dp
    @Composable get() = with(LocalDensity.current) { [email protected]() }

inline val Dp.px: Float
    @Composable get() = with(LocalDensity.current) { [email protected]() }
© www.soinside.com 2019 - 2024. All rights reserved.