如何为BottomSheetDialogFragment添加关闭时的缓慢下滑动画?
为BottomSheetDialogFragment添加程序化下滑关闭动画
方法一:利用BottomSheetBehavior的原生状态切换动画
BottomSheetDialog依托BottomSheetBehavior实现交互,我们可以通过切换Behavior的状态触发下滑动画,再在动画结束后执行dismiss:
- 在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 }
- 监听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窗口动画实现:
- 在
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>
- 在
res/values/styles.xml中定义动画样式:
<style name="BottomSheetExitAnimation"> <item name="android:windowExitAnimation">@anim/slide_out_down</item> </style>
- 在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
相关产品推荐
相关产品推荐

