我需要先在折叠状态下露出我的底单.而在向上滑动底纸时,它应该首先固定在屏幕的一半高度.再次向上滑动时,它应该扩展到屏幕的最大高度.在倒塌过程中也是如此.首先从最大高度到半高,然后到窥视高度(折叠状态下可见的底片高度).有没有办法使用BottomSheetScaffold实现这一点?

推荐答案

我开始为你写那个解决方案.你可以美化它

enum class ExpandedType {
    HALF, FULL, COLLAPSED
}

  @Composable
private fun BottomSheet() {
    val configuration = LocalConfiguration.current
    val screenHeight = configuration.screenHeightDp
    var expandedType by remember {
        mutableStateOf(ExpandedType.COLLAPSED)
    }
    val height by animateIntAsState(
        when (expandedType) {
            ExpandedType.HALF -> screenHeight / 2
            ExpandedType.FULL -> screenHeight
            ExpandedType.COLLAPSED -> 70
        }
    )
    val bottomSheetScaffoldState = rememberBottomSheetScaffoldState(
        bottomSheetState = BottomSheetState(BottomSheetValue.Collapsed)
    )
    BottomSheetScaffold(
        scaffoldState = bottomSheetScaffoldState,
        sheetElevation = 8.dp,
        sheetShape = RoundedCornerShape(
            bottomStart = 0.dp,
            bottomEnd = 0.dp,
            topStart = 12.dp,
            topEnd = 12.dp
        ),
        sheetContent = {
            var isUpdated = false
            Box(
                Modifier
                    .fillMaxWidth()
                    .height(height.dp)
                    .pointerInput(Unit) {
                        detectVerticalDragGestures(
                            onVerticalDrag = { change, dragAmount ->
                                change.consume()
                                if (!isUpdated) {
                                    expandedType = when {
                                        dragAmount < 0 && expandedType == ExpandedType.COLLAPSED -> {
                                            ExpandedType.HALF
                                        }
                                        dragAmount < 0 && expandedType == ExpandedType.HALF -> {
                                            ExpandedType.FULL
                                        }
                                        dragAmount > 0 && expandedType == ExpandedType.FULL -> {
                                            ExpandedType.HALF
                                        }
                                        dragAmount > 0 && expandedType == ExpandedType.HALF -> {
                                            ExpandedType.COLLAPSED
                                        }
                                        else -> {
                                            ExpandedType.FULL
                                        }
                                    }
                                    isUpdated = true
                                }
                            },
                            onDragEnd = {
                                isUpdated = false
                            }
                        )
                    }
                    .background(Color.Red)
            )
        },
        sheetPeekHeight = height.dp
    ) {
        Box(
            Modifier
                .fillMaxSize()
                .background(Color.Black)
        )
    }
}

Android相关问答推荐

listOf(listOf(字符串))在lazyArchitect(lazyStream)中合成

如何在"不同活动"中添加不同按钮?

Android:MethodHandle. invoke和MethodHandle. invokeExact仅从Android O( - min—api 26)开始支持

在Android上使用XSLT文件转换XML文件

Jetpack Compose和Android Studio中的普通设计工具有什么不同?

Jetpack创作动画断断续续变化的观点

如何在Android Studio的LinearLayout中禁用阴影

如何在初始合成期间在可组合函数中调用/获取远程API中的数据[防止无限重组]

如何将 Room Persistence 依赖项正确添加到我的 Jetack Compose Android 应用程序

可从 Play store 下载链接访问未发布的应用

当 Jetpack Compose 中的第一个文本很长时,将省略号添加到第一个文本

在 Compose 中停止键盘将顶部应用栏推离屏幕

在事件中使用 Context/Toast 时不需要的重组 - Jetpack Compose

Int 传递给 Intent 但Android工作室说我传递了一个字符串

Hilt 依赖注入重复绑定错误

删除一对多关系室 Kotlin 中的所有值

如何在 Jetpack Compose 中禁用 TabRow 或 Tab 中的涟漪效应?

Android Material Date Range Picker - 如何仅更改所选范围日期的文本 colored颜色 ?

如何在 Jetpack Compose 中填充矢量图像的背景?

设备文件资源管理器-ROOM 数据库中的数据库文件夹为空