Android Dialog点击内容外围小部分区域没有消失

这两天做一个dialog,发现点击紧贴dialog内容的外围小部分区域时,dialog无法消失,但是,我明明已经设置了:

dialog.setCancelable(true);

dialog.setCanceledOnTouchOutside(true);

两个都赋值true,问题依旧。

后来看源码,发现是因为window中的一个函数的限制原因:

private boolean isOutOfBounds(Context context, MotionEvent event) {
        final int x = (int) event.getX();
        final int y = (int) event.getY();
        final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop();
        final View decorView = getDecorView();
        return (x < -slop) || (y < -slop)
                || (x > (decorView.getWidth()+slop))
                || (y > (decorView.getHeight()+slop));
    }

需要重写onTouchEvent函数。

自定义dialog,继承自Dialog,完整代码:

public class BannerDialog extends Dialog {
    public BannerDialog(@NonNull Context context) {
        super(context);
    }

    public BannerDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setCancelable(true);
        setCanceledOnTouchOutside(true);
    }


    @Override
    public boolean onTouchEvent(@NonNull MotionEvent event) {
//        return super.onTouchEvent(event);
        Window window = getWindow();
        if (null == window) {
            return false;
        }

        final View decorView = window.getDecorView();
        if (isShowing() && shouldCloseOnTtouch(event, decorView)) {

            cancel();
            return true;
        }
        return false;
    }

    private boolean shouldCloseOnTtouch(MotionEvent event, View decorView) {
        final int x = (int) event.getX();
        final int y = (int) event.getY();
        return x <= 0 || y <= 0 || x > decorView.getWidth() || y > decorView.getHeight();
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值