美文网首页
判断事件是否在子View范围内

判断事件是否在子View范围内

作者: 温一 | 来源:发表于2020-09-20 16:59 被阅读0次

    第一种方法:

    //(x,y)是否在view的区域内
    private boolean isTouchPointInView(View view, int x, int y) {
            if (view == null) {
                return false;
            }
            int[] location = new int[2];
            view.getLocationOnScreen(location);
            int left = location[0];
            int top = location[1];
            int right = left + view.getMeasuredWidth();
            int bottom = top + view.getMeasuredHeight();
            //view.isClickable() &&
            if (y >= top && y <= bottom && x >= left
                    && x <= right) {
                return true;
            }
            return false;
        }
    
    @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            int x = (int) ev.getRawX();
            int y = (int) ev.getRawY();
            if (isTouchPointInView(viewGroup, x, y)) {
                iosInterceptFlag = true;
                return super.dispatchTouchEvent(ev);
            }
            //do something
        }
    

    此处顺便说一下ev.getX()和ev.getRawX()的区别
    ev.getX():表示相对于控件自身左上角的X坐标
    ev.getRawX():表示相对于手机屏幕左上角的X坐标

    利用这个方法,也可以循环遍历找出点击的view了。

    private View getTouchTarget(View view, int x, int y) {
            View targetView = null;
            // 判断view是否可以聚焦
            ArrayList<View> TouchableViews = view.getTouchables();
            for (View child : TouchableViews) {
                if (isTouchPointInView(child, x, y)) {
                    targetView = child;
                    break;
                }
            }
            return targetView;
        }
    

    利用这个方法isTouchPointInView(),也可以让子view截获touch事件,解决与parent的冲突(特别是当parent重写了dispatchTouchEvent(MotionEvent ev)方法)。

    另外一种方法:

    //(x,y)是否在view的区域内
     private boolean isInViewArea(View view, float x, float y) {
            Log.e(MainActivity.class.getName(), "x " + x + "y " + y);
            Rect r = new Rect();
            view.getLocalVisibleRect(r);
            Log.e(MainActivity.class.getName(), "left " + r.left + "right " + r.right);
            if (x > r.left && x < r.right && y > r.top && y < r.bottom) {
                return true;
            }
            return false;
        }
    

    相关文章

      网友评论

          本文标题:判断事件是否在子View范围内

          本文链接:https://www.haomeiwen.com/subject/fgkpyktx.html