解决PopupWindow弹出之后点击外部的触发显示弹框区域,弹框会先取消显示再弹出

本文介绍如何为Popwindow添加触摸拦截事件,通过`setTouchInterceptor`方法,着重讲解了如何判断点击是否在Popwindow外部且不在焦点上,以及如何确定点击是否位于特定触发按钮上。涉及的方法包括`onTouch`回调和视图坐标计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为Popwindow添加触摸回调

         //设置触摸拦截事件,如果返回true表示拦截,不继续往下传递
         showHelpTextPopWindow.setTouchInterceptor(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    //如果点击PopWindow外部,且焦点不在popupWindow上
                    if (event.getAction() == MotionEvent.ACTION_OUTSIDE && !showHelpTextPopWindow.isFocusable()) {
                        //并且点击到了触发popWindow弹出的按钮上面,那么返回true,反之返回false
                        //getRawX()是获取点击位置相对于整个屏幕原点(左上)的x距离,getX()则是相对于自身的x距离
                        return isInChangeImageZone(button, (int) event.getRawX(), (int) event.getRawY());
                    }else {
                        return false;
                    }
                }
            });

判断是否点击在触发popWindow弹出的按钮上

/**
 * 判断是否点击到了指定的控件上面
 */
 private Rect mChangeImageBackgroundRect = null;
    private boolean isInChangeImageZone(View view, int x, int y) {
        if (null == mChangeImageBackgroundRect) {
            mChangeImageBackgroundRect = new Rect();
        }
        //获取View的绘制范围,即左、上、右、下边界相对于此View的左顶点的距离(偏移量),即0、0、View的宽、View的高
        view.getDrawingRect(mChangeImageBackgroundRect);
        int[] location = new int[2];
        //view在其整个屏幕上的坐标位置
        view.getLocationOnScreen(location);
        mChangeImageBackgroundRect.left = location[0];
        mChangeImageBackgroundRect.top = location[1];
        mChangeImageBackgroundRect.right = mChangeImageBackgroundRect.right + location[0];
        mChangeImageBackgroundRect.bottom = mChangeImageBackgroundRect.bottom + location[1];
        return mChangeImageBackgroundRect.contains(x, y);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值