问题描述:在横向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计算出滑动方向,再做处理,其他原理是一样的。
网友评论