美文网首页
使用View.getLocationOnScreen方法快速解决

使用View.getLocationOnScreen方法快速解决

作者: 勇敢的心15 | 来源:发表于2020-04-28 14:29 被阅读0次

    问题描述:在横向ScrollView中嵌套了横向滑动的ScrollView导致滑动冲突,滑动事件被最外层的ScrollView拦截,导致内部ScrollView无法滑动。解决滑动冲突肯定是要拦截屏幕事件。这里记录一个最简单快速的解决局部冲突的方式。

    public static boolean isTouchOnView(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();

    return y >= top && y <= bottom && x >= left && x <= right;

    }

    用法:重写最外层viewGroup,重写事件拦截方法,在onInterceptTouchEvent方法中判断

    x = (int) ev.getRawX();

    y = (int) ev.getRawY();

    //如果折线图大小不大于父控件,不存在滑动,直接拦截

    if (ViewUtil.isTouchOnView(mChildView,x,y) &&mRvRecord.getMeasuredWidth() > RudenessScreenHelper.pt2px(getContext(),540)){

    return false;

    }

    return super.onInterceptTouchEvent(ev);

    传入的参数mChildView即是与父控件冲突的子View。原理非常简单,就是获取当前手指触摸屏幕的绝对坐标和需要解决冲突的子View的坐标做对比,如果落在该view的区域内则父控件不拦截,交给该子view去处理,否则,父控件拦截处理处理。

    使用这个方式可以最快速简单的解决嵌套控件的滑动冲突问题,如果是同一方向的滑动,直接判断区域即可,如果是不同方向则要通过onInterceptTouchEvent方法中的x,y计算出滑动方向,再做处理,其他原理是一样的。

    相关文章

      网友评论

          本文标题:使用View.getLocationOnScreen方法快速解决

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