¿Cómo convertir Dp a píxeles en Android Jetpack Compose?

2 minutos de lectura

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.

Avatar de usuario de Valeriy Katkov
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, Ambientse nombran CompositionLocals desde alpha-12he 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()

¿Ha sido útil esta solución?