滑动冲突
情况一:外部支持左右滑动,内部支持上下滑动,滑动时就会出现只有一个能滑动。
情况二:都是支持左右滑动,但是要么只有一个能滑动,要么两个都在滑动。
解决滑动冲突,主要是通过重写父容器的onInterceptTouchEvent事件来解决。情况一可以通过判断水平方向和竖直方向哪个移动距离大来决定是上下滑,还是左右滑。情况二,则根据具体业务逻辑来决定。
由于是在父窗口中处理,这种方式称为外部拦截法。至于内部拦截法稍微复杂一些,这里只展示外部拦截法。
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;
if(!mScroller.isFinished()){
mScroller.abortAnimation();//优化滑动体验
intercepted = true;
}
break;
case MotionEvent.ACTION_MOVE:
int deltaX = x - mLastXintercept;
int deltaY = y - mLastYintercept;
if(Math.abs(deltaX) > Math.abs(deltaY)){//水平距离大父容器拦截此事件来处理滑动,否则子元素去处理滑动
intercepted = true;
}else{
intercepted = false;
}
break;
case MotionEvent.ACTION_UP:
intercepted = false;
break;
default:
break;
}
mLastXintercept = x;
mLastYintercept = y;
return intercepted;
}