滑动冲突
android view 的滑动冲突 典型的就是 水平 和垂直view 之间的布局镶嵌所产生的滑动冲突。
准备
1.了解android 的事件传递;
2.了解dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent 三个方法的作用
解决思路
1、外部拦截法
水平A 控件(简称A) 垂直B 控件(简称B) A 包含 B
只拦截需要A处理的touch事件,否则放行 -> onInterceptTouchEvent
2、内部拦截发
所有的事件 都发送给B B来负责 时间的分发
B 拦截所需要的touch 事件
伪代码实现
1、外部拦截机制
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;
break;
case MotionEvent. ACTION_ MOVE:
if (父 容器 需要 当前 点击 事件) {
intercepted = true;
} else {
intercepted = false;
}
break;
case MotionEvent. ACTION_ UP:
intercepted = false;
break;
default:
break;
}
mLastXIntercept = x;
mLastYIntercept = y;
return intercepted;
}
2、内部拦截机制
public boolean dispatchTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
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.dispatchTouchEvent(event);
}
多重嵌套 也可以使用这种方法,需要自己发挥