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

2023-07-13 16:19:01 浏览数 (2)

原因

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

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

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

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

解决

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

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

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

代码语言:javascript复制
    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:这种方法可以很直接的实现手指拖动的效果,而且改动比较小。)

0 人点赞