如何根据ModalBottomSheet的屏幕位置管理其圆角动画?
实现滑动时动态改变ModalBottomSheet圆角的思路
可以借助ModalBottomSheet的onSlide回调来实现这个需求,它会实时返回面板的滑动进度值,直接用这个值计算圆角大小即可,具体步骤如下:
- 获取滑动进度:
ModalBottomSheet提供了onSlide参数,传入的lambda会接收一个范围在0f到1f的Float值——0f代表面板完全隐藏在底部,1f代表面板完全展开到屏幕顶部;如果开启了部分展开状态,进度值会在对应阶段停留在中间数值。 - 动态计算圆角:根据进度值反向计算圆角大小,比如初始圆角是
2.dp,那么实时圆角可以写成2.dp * (1 - slideProgress),这样随着进度从0f到1f,圆角会从2.dp平滑过渡到0.dp。 - 应用圆角到面板:将计算得到的圆角值赋值给
ModalBottomSheet的shape参数即可。
示例代码:
@OptIn(ExperimentalMaterial3Api::class) @Composable fun GradientRoundedBottomSheet() { val sheetState = rememberModalBottomSheetState() var slideProgress by remember { mutableStateOf(0f) } val scope = rememberCoroutineScope() Scaffold { paddingValues -> Button( onClick = { scope.launch { sheetState.show() } }, modifier = Modifier.padding(paddingValues) ) { Text("打开底部面板") } ModalBottomSheet( onDismissRequest = { scope.launch { sheetState.hide() } }, sheetState = sheetState, shape = RoundedCornerShape(size = 2.dp * (1 - slideProgress)), onSlide = { progress -> slideProgress = progress } ) { Column( modifier = Modifier .fillMaxWidth() .padding(16.dp) ) { Text("向上滑动面板,圆角会逐渐消失") // 可添加更多面板内容 } } } }
如果需要基于面板的实际位置(而非相对进度)计算圆角,可以通过LocalConfiguration获取屏幕总高度,但SheetState的偏移量是内部属性无法直接访问,因此onSlide的进度值是最简洁可靠的方案。
内容的提问来源于stack exchange,提问作者adlagar
相关产品推荐
相关产品推荐

