Compose Layout System Internals
Compose Layout System Internals
1. Layout Pipeline
Compose Layout은 세 단계로 구성된다.
Compose layout has three major stages.
Measure → Layout (position) → Draw
2. MeasurePolicy
커스텀 레이아웃은 measurePolicy로 동작한다.
@Composable
fun MyLayout(content: @Composable () -> Unit) {
Layout(
content = content,
measurePolicy = { measurables, constraints ->
val placeables = measurables.map { it.measure(constraints) }
val width = placeables.maxOf { it.width }
val height = placeables.sumOf { it.height }
layout(width, height) {
var y = 0
placeables.forEach { p ->
p.place(0, y)
y += p.height
}
}
}
)
}
3. Constraints & Density
Constraints:
- minWidth, maxWidth
- minHeight, maxHeight
Density:
- dp/sp를 px로 변환
LocalDensity로 제공
CompositionLocal은 Layout behavior를 간접적으로 제어할 수 있다.
예: LocalSpacing, LocalLayoutDirection, LocalDensity.
4. Intrinsic Measurements
intrinsicSize는 컨텐츠 기반 크기 계산에 사용된다.
Intrinsic sizes allow measuring based on content.
Modifier.width(IntrinsicSize.Min) 등.
5. LayoutNode와 SlotTable
SlotTable이 UI 구조를 표현하면, LayoutNode는 실제 레이아웃 트리를 표현한다.
SlotTable (logical)
LayoutNode tree (physical)
CompositionLocal 값은 SlotTable → LayoutNode로 전달되어 measure/draw에 영향을 준다.