使用View.getLocationOnScreen方法快速解决滑动冲突问题

问题描述:在横向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方法快速解决滑动冲突问题)