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)
    )
}
相关推荐
执明wa2 分钟前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
404_coder25 分钟前
源码视角下的 Android 开机流程:从 Zygote、SystemServer 到 Launcher
android
Zane199428 分钟前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
二流小码农37 分钟前
鸿蒙开发:以登录案例了解代码架构MVVM
android·ios·harmonyos
噢,我明白了1 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品1 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘1 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
用户69371750013841 小时前
从代码生产者到 AI 协作者:软件工程师的角色重构
android·前端·后端
GitLqr2 小时前
别在 Flutter 的 main() 里乱锁屏幕方向,小心 iPad 分屏功能被你搞没了
android·flutter·ios
Java内核笔记2 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端