Android Jetpack Compose - Snackbar、Box

Snackbar

1、基本介绍
  1. Snackbar 是一种轻量级反馈机制,它用于提供有关操作或动作的反馈

  2. Snackbar 会在显示几秒后消失,也可以通过用户交互消失,包含一个可选的用户操作

2、基本使用
kotlin 复制代码
val scope = rememberCoroutineScope()
val snackbarHostState = remember { SnackbarHostState() }
var desc by remember { mutableStateOf("") }

Box(modifier = Modifier.fillMaxSize()) {
    Column(
        modifier = Modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Button(
            onClick = {
                scope.launch {
                    val reuslt = snackbarHostState.showSnackbar(
                        message = "这是一条 Snackbar",
                        actionLabel = "关闭",
                        duration = SnackbarDuration.Short
                    )
                    when (reuslt) {
                        SnackbarResult.ActionPerformed -> {
                            desc = "Snackbar 手动关闭"
                        }

                        SnackbarResult.Dismissed -> {
                            desc = "Snackbar 自动关闭"
                        }
                    }
                }
                desc = "Snackbar 显示"
            }
        ) {
            Text("显示 Snackbar")
        }
        Text(desc)
    }

    SnackbarHost(
        modifier = Modifier
            .align(Alignment.BottomCenter)
            .padding(16.dp),
        hostState = snackbarHostState
    )
}

Box

1、基本介绍
kotlin 复制代码
@Composable
inline fun Box(
    modifier: Modifier = Modifier,
    contentAlignment: Alignment = Alignment.TopStart,
    propagateMinConstraints: Boolean = false,
    content: @Composable BoxScope.() -> Unit
)
参数 说明
modifier 设置基础属性
contentAlignment 设置子元素的默认对齐方式
propagateMinConstraints 设置是否将最小约束传递给子元素
content 主要内容区域
2、基本使用
  1. Box 的基本使用
kotlin 复制代码
Box(
    modifier = Modifier
        .size(200.dp)
        .background(Color.LightGray)
) {
    Text("test1", modifier = Modifier.align(Alignment.BottomStart))
    Text("test2", modifier = Modifier.align(Alignment.TopEnd))
}
kotlin 复制代码
Box(modifier = Modifier.fillMaxSize()) {
    Text(
        text = "居中文本",
        modifier = Modifier.align(Alignment.Center)
    )

    Button(
        onClick = { },
        modifier = Modifier.align(Alignment.BottomCenter)
    ) {
        Text("底部按钮")
    }
}
  1. 使用 contentAlignment
kotlin 复制代码
Box(
    modifier = Modifier
        .size(200.dp)
        .background(Color.LightGray),
    contentAlignment = Alignment.Center,
) {
    Text("test")
}
  1. 子元素使用 matchParentSize 函数,填充父元素
kotlin 复制代码
Box(modifier = Modifier.size(200.dp)) {
    Box(
        modifier = Modifier
            .matchParentSize()
            .background(Color.Red.copy(alpha = 0.3f))
    )

    Text("test", modifier = Modifier.align(Alignment.Center))
}
3、使用 propagateMinConstraints
  1. 外部灰色 Box 的最小约束不会传递给子元素,导致内部红色 Box 尺寸为 0dp,外部灰色 Box 受尺寸范围与内部红色 Box 尺寸影响,尺寸为 100dp
kotlin 复制代码
Box(
    modifier = Modifier
        .background(Color.LightGray)
        .widthIn(min = 100.dp, max = 300.dp)
        .heightIn(min = 100.dp, max = 300.dp)
) {
    Box(
        modifier = Modifier
            .background(Color.Red.copy(alpha = 0.3f))
    )
}
  1. 外部灰色 Box 的最小约束会传递给子元素,导致内部红色 Box 尺寸为 100dp,外部灰色 Box 受尺寸范围与内部红色 Box 尺寸影响,尺寸为 100dp
kotlin 复制代码
Box(
    modifier = Modifier
        .background(Color.LightGray)
        .widthIn(min = 100.dp, max = 300.dp)
        .heightIn(min = 100.dp, max = 300.dp),
    propagateMinConstraints = true
) {
    Box(
        modifier = Modifier
            .background(Color.Red.copy(alpha = 0.3f))
    )
}
  1. 外部灰色 Box 的最小约束会传递给子元素,内部红色 Box 自定义尺寸为 150dp,外部灰色 Box 受尺寸范围与内部红色 Box 尺寸影响,尺寸为 150dp
kotlin 复制代码
Box(
    modifier = Modifier
        .background(Color.LightGray)
        .widthIn(min = 100.dp, max = 300.dp)
        .heightIn(min = 100.dp, max = 300.dp),
    propagateMinConstraints = true
) {
    Box(
        modifier = Modifier
            .size(150.dp)
            .background(Color.Red.copy(alpha = 0.3f))
    )
}
4、子元素层级
  1. 后声明的子元素绘制在先声明的子元素之上
kotlin 复制代码
Box(
    modifier = Modifier
        .size(200.dp)
        .background(Color.LightGray),
) {
    Box(
        modifier = Modifier
            .size(150.dp)
            .background(Color.Red)
            .align(Alignment.TopStart)
    )
    Box(
        modifier = Modifier
            .size(150.dp)
            .background(Color.Green)
            .align(Alignment.Center)
    )
}
  1. 可以使用 zIndex 控制层级,zIndex 值越大,层级越高
kotlin 复制代码
Box(
    modifier = Modifier
        .size(200.dp)
        .background(Color.LightGray)
        .zIndex(1f),
) {
    Box(
        modifier = Modifier
            .size(150.dp)
            .background(Color.Red)
            .align(Alignment.TopStart)
            .zIndex(3f)
    )
    Box(
        modifier = Modifier
            .size(150.dp)
            .background(Color.Green)
            .align(Alignment.Center)
            .zIndex(2f)
    )
}
相关推荐
KevinCyao几秒前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
迷藏4947 分钟前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
_李小白38 分钟前
【OSG学习笔记】Day 38: TextureVisitor(纹理访问器)
android·笔记·学习
JJay.1 小时前
Kotlin 高阶函数学习指南
android·开发语言·kotlin
android_cai_niao1 小时前
kotlin中的when
kotlin·when
渔舟小调1 小时前
后端框架选型:为什么选Kotlin + Spring Boot
kotlin·idea
jinanwuhuaguo1 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
wuxinyan1231 小时前
Java面试题47:一文深入了解Nginx
java·nginx·面试题
新知图书1 小时前
搭建Spring Boot开发环境
java·spring boot·后端
冰河团队1 小时前
一个拉胯的分库分表方案有多绝望?整个部门都在救火!
java·高并发·分布式数据库·分库分表·高性能