系列文章目录
- Android~Compose初探
- Android~Compose之自定义View
- Android~Compose相关概念总结
- Android~Compose脚手架和Toast
- Android~Compose路由Navigation和传参
文章目录
- 系列文章目录
- 目标
- 脚手架
- 基于Snackbar自定义Toast
 
- 实现效果
 
 
目标
- 熟悉Compose中脚手架使用
- 自定义Toast样式
脚手架
我们知道脚手架包含标题栏、底部栏、SnackBar、浮动按钮、抽屉、内容等部分。
@Composable
fun ScaffoldPage() {
    val scaffoldState = rememberScaffoldState()
    val scope = rememberCoroutineScope()
    Scaffold(
        scaffoldState = scaffoldState,
        drawerContent = { //抽屉组件
            Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                Text(text = "抽屉组件中内容")
            }
        },
        topBar = { //屏幕顶部的标题栏
            TopAppBar(title = { Text("脚手架") },
                navigationIcon = {
                    IconButton(onClick = {
                        scope.launch { scaffoldState.drawerState.open() }
                    }) {
                        Icon(Icons.Filled.Menu, contentDescription = null)
                    }
                })
        },
        floatingActionButton = { //悬浮按钮
            Column {
                ExtendedFloatingActionButton(
                    text = { Text("Toast") },
                    onClick = {
                        scope.launch {
                            scaffoldState.snackbarHostState.showSnackbar(
                                "这是一个Toast",
                                duration = SnackbarDuration.Short
                            )
                        }
                    })
                ExtendedFloatingActionButton(
                    text = { Text("SnackBar") },
                    onClick = {
                        scope.launch {
                            scaffoldState.snackbarHostState.showSnackbar(
                                "这是一个SnackBar",
                                "按钮",
                                SnackbarDuration.Short
                            )
                        }
                    })
            }
        },
        floatingActionButtonPosition = FabPosition.End, //悬浮按钮在屏幕中的位置
        content = {
            //屏幕内容
            val paddingValues = it.calculateBottomPadding()
            Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                Text(text = "屏幕内容区域")
            }
        },
        snackbarHost = {
            SnackbarHost(it) { data ->
                Snackbar(
                    snackbarData = data,
                    backgroundColor = Color.Blue,
                    contentColor = Color.White,
                    shape = RoundedCornerShape(10.dp)
                )
            }
        }
    )
}
基于Snackbar自定义Toast
Compose中无专用Toast,可以简单是通过Snackbar封装实现效果。Snackbar是安卓5.0 Material Design提供的一个新控件,只需要将脚手架中Snackbar替换为下面的代码即可。
Box(
    modifier = Modifier
        .wrapContentHeight()
        .fillMaxWidth(),
    contentAlignment = Alignment.Center
) {
    Snackbar(
        modifier = Modifier
            .wrapContentHeight()
            .width(200.dp)
    ) {
        Row(
            Modifier
                .wrapContentHeight()
                .fillMaxWidth(),
            verticalAlignment = Alignment.CenterVertically,
            horizontalArrangement = Arrangement.Center
        ) {
            Icon(
                imageVector = Icons.Default.Favorite,
                contentDescription = "",
                tint = Color.White
            )
            Text(
                text = data.message,
                modifier = Modifier.padding(start = 10.dp),
                style = TextStyle(color = Color.White, fontSize = 20.sp)
            )
        }
    }
}
实现效果

 可以看到这种方案还是有点缺陷的,比如不好处理宽度、不支持动态设置吐司显示位置。








![[附源码]SSM计算机毕业设计视屏网站论文JAVA](https://img-blog.csdnimg.cn/cff9811d3c46459baf5fc267af077ed8.png)

![【教材】2022/11/27[指针] 指针与函数基础](https://img-blog.csdnimg.cn/d134fbfd9ab64760bdbc85b5ee69e398.png)




![[阶段4 企业开发进阶] 2. Redis--实战篇](https://img-blog.csdnimg.cn/9ab2b9b70b1d48c48b38720fc7e0293a.png#pic_center)



