La mayoría de los usos de la API de Jetpack Compose Dp como una unidad de dimensiones, pero a veces se requiere un valor de píxel. ¿Cómo puedo convertir un valor de dp a px? Solo como ejemplo hay capagrafica() modificador que acepta translationX/Y
argumentos en píxeles.
valeriy katkov
hay toPx()
y roundToPx()
métodos definidos por Densidad interfaz, puede usarlo así:
import androidx.compose.ui.platform.LocalDensity
val pxValue = with(LocalDensity.current) { 16.dp.toPx() }
// or
val pxValue = LocalDensity.current.run { 16.dp.toPx() }
Tal expresión puede parecer confusa si eres nuevo en el lenguaje Kotlin, así que analicémosla y veamos cómo funciona. toPx()
es un función de extensión de Dp
clase, puedes pensar en ello como un Dp
método de clase. Pero desde toPx()
se define dentro Densidad interfaz, no puede usarla a menos que proporcione una densidad como receptor. Y por fin puedes obtener la densidad de corriente de un ComposiciónLocal llamado Densidad local.
-
¿AmbientDensity se llamará CompositionLocalDensity? (En realidad, se llama
LocalDensity
ahora, lo comprobé)– EpicPandaForce
15 de febrero de 2021 a las 12:28
-
@EpicPandaForce ¡Gracias! En efecto,
Ambient
se nombranCompositionLocal
s desdealpha-12
he actualizado la respuesta– Valeriy Katkov
15 de febrero de 2021 a las 15:01
-
gran explicación de la sintaxis; ¡Vine aquí buscando precisamente qué brujería era esa!
– usuario2297550
24 de febrero de 2021 a las 15:27
-
Y si desea convertir de píxeles a Dp, es
LocalDensity.current.run { 16.toDp() }
– gato de mar
18 de noviembre de 2021 a las 13:09
-
extraño, requiere el contexto @Composable para transformar dp a px. ¿Por qué?
-Michael Abyzov
11 de agosto de 2022 a las 12:08
La respuesta de @Valeriy es definitivamente la forma correcta de hacerlo, pero si lo desea un poco menos detallado o tiene muchas conversiones que hacer, puede crear funciones de extensión:
@Composable
fun Dp.dpToPx() = with(LocalDensity.current) { this@dpToPx.toPx() }
@Composable
fun Int.pxToDp() = with(LocalDensity.current) { this@pxToDp.toDp() }
Esto le permite convertir su dp directamente a px y viceversa.
val dpValue = 16.dp
val pxConverted = dpValue.dpToPx()
val pxValue = 100
val dpConverted = pxValue.pxToDp()