Почему преобразование из dp в px не является точным?

Я пытаюсь нарисовать черный прямоугольник, закрывающий желтыйcomposable, После преобразованияsizeкpixels. Boxснизу еще немного видно. Есть ли способ обойти это?

      val size = 50.dp
Box(
    modifier = Modifier
        .size(size)
        .background(color = Color.Yellow)
        .drawWithContent {
            val sizePx = size.toPx()
            drawRect(
                color = Color.Black,
                size = Size(width = sizePx, height = sizePx)
            )
        }
)

1 ответ

Преобразование Dp в pxdp.value * densityи это точно. Однако Modifier.layout или Layout возвращают размеры в Int при преобразованииdpSize.toPx()и вы можете использоватьdpSize.roundToPx()для преобразования Int.

На моем устройстве

      var text by remember { mutableStateOf("") }
val dpSize = 50.dp
Box(
    modifier = Modifier
        .size(dpSize)
        .background(color = Color.Yellow)
        .drawWithContent {
            val sizePx = dpSize.toPx()
            text = "drawWithContent: density: $density, dpSize in px: $sizePx, drawScope size: ${size.width}\n"
            drawRect(
                color = Color.Black,
                size = Size(width = sizePx, height = sizePx),
            )
        }


) 

Text(text = text)

Когда вы рисуете что-либо внутри DrawScope, если вы собираетесь рисовать что-то, что покрывает ваш Composable, вам не нужно передавать размер.

Вы можете использовать DrawScope.size. То же самое относится и к pointerEvents. внутри области указателя и области рисования вы можете получить размер без дополнительной работы.

Проблема, с которой вы столкнулись, может быть ошибкой предварительного просмотра. Даже если это не был точный размер, который вы получаете от преобразования, он больше, чем составной размер.

Другие вопросы по тегам