Compose学习
布局系统

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))
}

最佳实践

  1. 布局性能优化

    • 避免嵌套过深
    • 使用 ConstraintLayout 减少嵌套
    • 合理使用 Modifier
  2. 响应式设计

    • 使用 BoxWithConstraints
    • 适配不同屏幕尺寸
    • 支持横竖屏切换
  3. 可重用性

    • 抽取通用布局组件
    • 使用 Slot API
    • 保持布局灵活性

注意事项

  1. 布局嵌套

    • 控制嵌套层级
    • 使用合适的布局组件
    • 避免不必要的包装
  2. 性能考虑

    • 减少重组范围
    • 优化布局计算
    • 使用 LazyLayout
  3. 可访问性

    • 合理的布局顺序
    • 适当的间距
    • 清晰的视觉层次