前段时间有个需求是这样的,在一个竖直方向的scrollView里我要嵌套一个水平方向的滚动,这就出现了滑动冲突的问题,滑动冲突问题的出现,简单来说,就是View的事件分发机制原理的应用,我要做出判断,当用户往水平方向滑动的时候,外层的竖直方向的ScrollView就要对事件进行不拦截,把事件传递给子view也就是水平方向的滚动中,把事件交给他处理;当用户往竖直方向滑动的时候,外层的竖直方向的ScrollView对事件进行拦截,自己来处理这个事件。至于怎么判断用户是水平方向滑动还是竖直方向的滑动,很简单,可以根据水平方向和竖直方向的距离差来判断。
ok,思路说到这里,还是直接上代码:
按照上面的思路,我就只要重写竖直方向ScrollView的onInterceptTouchEvent方法就可以了:
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
boolean intercepted = false;
int x = (int)event.getX();
int y = (int)event.getY();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN: {
intercepted = false;
//防止当竖直方向的滑动还没停止的时候用户再迅速的竖直滑动出现bug
if (!mScrollView.isFinished()){
intercepted = true;
}
break;
}
case MotionEvent.ACTION_MOVE:{
int moveX = x - mLastX;
int moveY = y - mLastY;
//当用户往水平方向滑动的时候,不拦截
if (Math.abs(moveX) > Math.abs(moveY)){
intercepted = false;
}else {
//当用户往竖直方向滑动的时候,拦截,自己处理
intercepted = true;
}
break;
}
case MotionEvent.ACTION_UP:{
intercepted = false;
break;
}
default:
break;
}
mLastX = x;
mLastY = y;
return intercepted;
}