Почему преобразование из 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. внутри области указателя и области рисования вы можете получить размер без дополнительной работы.
Проблема, с которой вы столкнулись, может быть ошибкой предварительного просмотра. Даже если это не был точный размер, который вы получаете от преобразования, он больше, чем составной размер.