В чем разница между процессами измерения у ViewGroup и Layout в Jetpack Compose

«В чем разница между процессами измерения у ViewGroup и Layout в Jetpack Compose» — вопрос из категории Jetpack Compose, который задают на 24% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ViewGroup измеряет детей последовательно, учитывая их MeasureSpec, и может вызывать measure() несколько раз для одного child (например, в RelativeLayout). В Compose Layout измеряет всех детей одновременно через MeasurePolicy, используя constraints вместо MeasureSpec.

Пример в Compose:

Layout(
    content = { /* children */ },
    measurePolicy = { measurables, constraints ->
        // Параллельное измерение всех детей
        val placeables = measurables.map { it.measure(constraints) }
        // Расчет размеров и позиционирование
        layout(width, height) {
            placeables.forEach { it.place(x, y) }
        }
    }
)

Ключевые отличия:

  1. Параллельность – Compose измеряет детей за один проход
  2. Constraints – более гибкие, чем MeasureSpec
  3. Неизменяемость – результаты измерения нельзя переиспользовать между recompositions