I need to show my bottomsheet first in collapsed state. And on swipping bottomsheet up, it should first fix in half height of screen first. Again on swipping up , it should expand to max height of screen. Same during collapsing. First from max height to half height, then to peek height(the height of bottomsheet which will be visible in collapsed state). Is there any way to achieve it using BottomSheetScaffold?
Asked
Active
Viewed 1,677 times
4
-
let me guess, if I understand it correctly, you want this to be implemented as a drag/swipe gesture right?, because this can be done just by using a button or some trigger outside, so I'm curious if those half~quarter close/open states should happen during swiping/dragging – z.g.y Oct 12 '22 at 14:05
1 Answers
5
I started write that solution for you. You can beautify it
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)
)
}
}

Vera Iureva
- 344
- 1
- 9
-
4Thanks. This was helpful. After customising , i am facing an issue. While collapsing my bottomsheet, its bottom end moving up . What will be the issue? – Heleena Joy Nov 29 '22 at 08:15