侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 290 篇文章
  • 累计创建 57 个标签
  • 累计收到 98 条评论

Android Dialog 添加拖动下拉关闭Dialog功能。

Z同学
2022-03-21 / 0 评论 / 3 点赞 / 731 阅读 / 1,430 字
温馨提示:
本文最后更新于 2022-03-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Android Dialog 添加拖动下拉关闭Dialog功能。

原因

所谓的下拉消失效果就是抽屉功能。Google有提供一个抽屉功能的Dialog叫做:BottomSheetDialog

这个库其实就在 implementation 'com.google.android.material:material:1.0.0' 这个依赖库中。

关于BottomSheetDialog的使用大家可以搜索,有很多的使用介绍。

我今天主要介绍不修改Dialog的情况下,通过给某个View添加事件来实现抽屉的关闭功能。

解决

因为项目框架已经搭建,实现的Dialog业务比较复杂。就没有整体的重新修改Dialog的功能。

主要希望实现Dialog 在底部弹出显示后。可以通过拖动顶部自定义的滑块,动态调整Dialog的显示高度并折叠。

image-20220321103624780

要单纯的实现这个方法很简单。

    float startY;
    float moveY = 0;
	decorView = getWindow().getDecorView();
     touchView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent ev) {
                switch (ev.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN:
                        startY = ev.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        moveY = ev.getY() - startY;
                        if (moveY > 0) { //避免坐标抖动,滑动过程中闪烁不连贯的问题
                            decorView.scrollBy(0, -(int) moveY);
                            startY = ev.getY();
                        }
                        if (decorView.getScrollY() > 0) { //避免向上拖动
                            decorView.scrollTo(0, 0);
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                        if (decorView.getScrollY() < -decorView.getHeight()
                                / 5 && moveY > 0) { // 如果滑动距离达到高度的5分之一 就关闭Dialog
                            Dialog.this.dismiss();
                        }
                        decorView.scrollTo(0, 0);
                        break;
                }
                return true;

            }
        });

简单介绍一下上面的代码。

我们只需要将支持滑动的View,重构它的touch事件。我们可以重构Dialog本身的touch,也可以重构某个View的Touch。

这个区别根据需求进行决定。

然后,我们根据拖动的Y轴,决定Dialog的decorView的滑动距离。scrollTo和scrollBy的功能,就是将View基于默认位置进行指定坐标的移动。初始位置就是(0,0)。也就是默认情况下View在整个屏幕上的位置。

(PS:这种方法可以很直接的实现手指拖动的效果,而且改动比较小。)

其他

收集的一些关于BottomSheetDialog控件的使用介绍的博客。

BottomSheetDialog控件使用 - 简书 (jianshu.com)

BottomSheetDialog 使用详解,设置圆角、固定高度、默认全屏等_yechaoa的博客-CSDN博客_bottomsheetdialog

3

评论区