Compose 布局系统
基础布局
Row 水平布局
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text("左侧")
Text("中间")
Text("右侧")
}Column 垂直布局
Column(
modifier = Modifier.fillMaxHeight(),
verticalArrangement = Arrangement.SpaceEvenly,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("顶部")
Text("中间")
Text("底部")
}Box 层叠布局
Box(modifier = Modifier.size(100.dp)) {
Box(
modifier = Modifier
.fillMaxSize()
.background(Color.Blue)
)
Text(
text = "居中文本",
modifier = Modifier.align(Alignment.Center),
color = Color.White
)
}约束布局
ConstraintLayout
ConstraintLayout(modifier = Modifier.fillMaxSize()) {
val (button, text) = createRefs()
Button(
onClick = { /* 处理点击 */ },
modifier = Modifier.constrainAs(button) {
top.linkTo(parent.top, margin = 16.dp)
start.linkTo(parent.start)
end.linkTo(parent.end)
}
) {
Text("按钮")
}
Text(
text = "说明文本",
modifier = Modifier.constrainAs(text) {
top.linkTo(button.bottom, margin = 16.dp)
start.linkTo(button.start)
}
)
}自适应布局
FlowRow 流式布局
FlowRow(
modifier = Modifier.fillMaxWidth(),
mainAxisSpacing = 8.dp,
crossAxisSpacing = 8.dp
) {
repeat(10) { index ->
Text(
text = "Item $index",
modifier = Modifier
.background(Color.LightGray)
.padding(8.dp)
)
}
}BoxWithConstraints
BoxWithConstraints {
val screenWidth = maxWidth
Column {
if (screenWidth > 600.dp) {
// 宽屏布局
Row {
Box(modifier = Modifier.weight(1f))
Box(modifier = Modifier.weight(1f))
}
} else {
// 窄屏布局
Column {
Box(modifier = Modifier.fillMaxWidth())
Box(modifier = Modifier.fillMaxWidth())
}
}
}
}修饰符(Modifier)
尺寸修饰符
Box(
modifier = Modifier
.size(100.dp) // 固定尺寸
.fillMaxWidth() // 填充宽度
.height(50.dp) // 指定高度
.aspectRatio(16f/9f) // 宽高比
)边距和填充
Box(
modifier = Modifier
.padding(16.dp) // 外边距
.border(1.dp, Color.Gray) // 边框
.padding(8.dp) // 内边距
)对齐和排列
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.SpaceEvenly
) {
Box(modifier = Modifier.align(Alignment.Start))
Box(modifier = Modifier.align(Alignment.CenterHorizontally))
Box(modifier = Modifier.align(Alignment.End))
}最佳实践
-
布局性能优化
- 避免嵌套过深
- 使用 ConstraintLayout 减少嵌套
- 合理使用 Modifier
-
响应式设计
- 使用 BoxWithConstraints
- 适配不同屏幕尺寸
- 支持横竖屏切换
-
可重用性
- 抽取通用布局组件
- 使用 Slot API
- 保持布局灵活性
注意事项
-
布局嵌套
- 控制嵌套层级
- 使用合适的布局组件
- 避免不必要的包装
-
性能考虑
- 减少重组范围
- 优化布局计算
- 使用 LazyLayout
-
可访问性
- 合理的布局顺序
- 适当的间距
- 清晰的视觉层次