简单来说,处理滑动冲突,主要还是对view的事件分发的拦截的处理,原则就是 哪个view需要响应对应的滑动事件,就让其去拦截点击事件。
有下面两种方法:
- 外部拦截法(推荐):在父容器中处理点击事件onInterceptTouchEvent()
- 内部拦截法:父容器不处理任何事件,决定权都交给子元素
外部拦截法
可以用如下伪代码处理:
public boolean onInterceptTouchEvent(MotionEvent event) {
boolean intercepted = false;
int x = event.getX();
int y = event.getY();
switch(event.getActioin()) {
case MotionEvent.ACTION_DOWN:
// 必须为false,否则后续事件无法传递给子元素
intercepted = false;
break;
case MotionEvent.ACTION_MOVE:
if(父容器需要处理点击事件) {
intercepted = true;
} else {
intercepted = false;
}
break;
case MotionEvent.ACTION_UP:
intercepted = false;
break;
default:
break;
}
mLastX = x;
mLastY = y;
return intercepted;
}
这种方法使用起来比较简单,推荐使用。
内部拦截法
下面再看一下由子元素拦截法的方法:
public boolean onInterceptTouchEvent(MotionEvent event) {
int x = event.getX();
int y = event.getY();
switch(event.getActioin()) {
case MotionEvent.ACTION_DOWN:
// 必须,否则后续事件无法传递给子元素
parent.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
int deltaX = x - mLastX;
int deltaY = y - mLastY;
if(父容器需要处理点击事件) {
parent.requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
mLastX = x;
mLastY = y;
return super.dispatchInterceptTouchEvent(event);
}
这种方法用起来比较麻烦。