前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android Dialog 添加拖动下拉关闭Dialog功能

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

作者头像
zinyan.com
发布2023-07-13 16:19:01
6220
发布2023-07-13 16:19:01
举报
文章被收录于专栏:zinyanzinyan

原因

所谓的下拉消失效果就是抽屉功能。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:这种方法可以很直接的实现手指拖动的效果,而且改动比较小。)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 zinyan 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原因
  • 解决
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档