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