You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:22:47