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