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

如何为BottomSheetDialogFragment添加关闭时的缓慢下滑动画?

为BottomSheetDialogFragment添加程序化下滑关闭动画

方法一:利用BottomSheetBehavior的原生状态切换动画

BottomSheetDialog依托BottomSheetBehavior实现交互,我们可以通过切换Behavior的状态触发下滑动画,再在动画结束后执行dismiss:

  1. 在BottomSheetDialogFragment中,给按钮点击事件添加状态切换逻辑:
// 按钮点击示例
binding.btnClose.setOnClickListener {
    val bottomSheetDialog = dialog as BottomSheetDialog
    val bottomSheetView = bottomSheetDialog.findViewById<View>(R.id.design_bottom_sheet) ?: return@setOnClickListener
    val behavior = BottomSheetBehavior.from(bottomSheetView)
    // 确保BottomSheet允许被隐藏
    behavior.isHideable = true
    // 触发下滑隐藏动画
    behavior.state = BottomSheetBehavior.STATE_HIDDEN
}
  1. 监听Behavior状态变化,在完全隐藏时关闭Dialog:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val bottomSheetDialog = dialog as BottomSheetDialog
    val bottomSheetView = bottomSheetDialog.findViewById<View>(R.id.design_bottom_sheet) ?: return
    val behavior = BottomSheetBehavior.from(bottomSheetView)
    behavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
        override fun onStateChanged(bottomSheet: View, newState: Int) {
            // 当BottomSheet完全隐藏时,执行dismiss
            if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                dismiss()
            }
        }

        override fun onSlide(bottomSheet: View, slideOffset: Float) {
            // 可选:处理滑动过程中的额外逻辑
        }
    })
}

方法二:自定义Dialog退出动画

如果需要自定义动画时长或效果,可以通过设置Dialog窗口动画实现:

  1. 在res/anim目录下创建slide_out_down.xml动画文件:
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromYDelta="0%"
        android:toYDelta="100%" />
</set>
  1. 在res/values/styles.xml中定义动画样式:
<style name="BottomSheetExitAnimation">
    <item name="android:windowExitAnimation">@anim/slide_out_down</item>
</style>
  1. 在BottomSheetDialogFragment的onCreateDialog方法中应用样式:
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val dialog = super.onCreateDialog(savedInstanceState)
    dialog.window?.setWindowAnimations(R.style.BottomSheetExitAnimation)
    return dialog
}

注意事项

  • 方法一使用Material Design原生动画,贴合BottomSheet交互逻辑,推荐优先使用;
  • 若为自定义布局的BottomSheet,需将R.id.design_bottom_sheet替换为布局中BottomSheet根视图的ID;
  • 方法一中必须设置behavior.isHideable = true,否则STATE_HIDDEN状态不会生效。

内容的提问来源于stack exchange,提问作者Graunephar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:05:12