Ответ
Да, работал. Layout — это низкоуровневая функция Compose для создания кастомных лейаутов. Она позволяет вручную измерять и размещать дочерние элементы.
Пример:
@Composable
fun CustomLayout(
modifier: Modifier = Modifier,
content: @Composable () -> Unit
) {
Layout(
modifier = modifier,
content = content
) { measurables, constraints ->
// Измеряем дочерние элементы
val placeables = measurables.map { it.measure(constraints) }
// Вычисляем размер лейаута
val width = placeables.sumOf { it.width }
val height = placeables.maxOfOrNull { it.height } ?: 0
// Размещаем дочерние элементы
layout(width, height) {
var x = 0
placeables.forEach { placeable ->
placeable.placeRelative(x, 0)
x += placeable.width
}
}
}
}
Используется, когда стандартные Row, Column или Box не подходят. Например, для сложных анимаций или нестандартного позиционирования.
Ответ 18+ 🔞
А, ну это ж классика! Да, работал, конечно, с этим Layout. Это же, ёпта, как залезть под капот всей этой композной магии — там уже не Row с Column, которые всё за тебя делают, а прям голые руки, измерительная рулетка и молоток.
Смотри, вот пример, чтобы было понятно, как это выглядит изнутри:
@Composable
fun CustomLayout(
modifier: Modifier = Modifier,
content: @Composable () -> Unit
) {
Layout(
modifier = modifier,
content = content
) { measurables, constraints ->
// Тут начинается цирк. Каждую детальку меряем.
val placeables = measurables.map { it.measure(constraints) }
// Считаем, какого же размера будет наша самопальная конструкция.
val width = placeables.sumOf { it.width }
val height = placeables.maxOfOrNull { it.height } ?: 0
// А теперь расставляем всё по полочкам, как бог на душу положит.
layout(width, height) {
var x = 0
placeables.forEach { placeable ->
placeable.placeRelative(x, 0)
x += placeable.width
}
}
}
}
Честно говоря, выглядит страшновато только первый раз. Потом привыкаешь. Это как собрать мебель из Икеи без инструкции — сначала нихуя не понятно, а потом вроде как получается, и даже гордишься собой.
Зачем это всё, спросишь? Да когда эти готовые Row, Column или Box — полные пидарасы шерстяные и не могут сделать то, что тебе надо. Ну вот представь: тебе нужно не просто в ряд или столбик, а какую-нибудь хитрожопую спираль нарисовать, или элементы чтобы по кругу летали, или ещё какую дичь анимировать, на которую стандартные контейнеры смотрят как баран на новые ворота. Вот тут-то Layout и выручает — полная свобода, делай что хочешь. Но и ответственность, блядь, полная: просчитаешь размеры криво — и всё, пизда рулю, интерфейс разъедется как дерьмо по волнам.