一、处理冲突的解决思路
根据滑动的特征来判断事件交给谁处理:是水平还是竖直滑动,可以根据两点之间的坐标,以及方向来判断,方向可以根据滑动路径和水平方向的夹角来判断(以左侧为正方向,向右侧滑动为180 左侧滑动为0度)
二,根据业务来判断:
某种情况下,需要某一个View来拦截事件。
三、处理拦截的方式
外部拦截法
Action_Down方法不能拦截,因为一旦拦截了 整个事件都会交给父级容器处理,所以只判断Move事件是否拦截即可。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercept = false;
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
intercept=false;
break;
case MotionEvent.ACTION_MOVE:
if (如果父级容器需要该事件) {
intercept=true;
}else {
intercept=false;
}
break;
case MotionEvent.ACTION_UP:
intercept=false;
break;
mLastXIntercepet=x;
mLaSTYIntercepet=y;
return intercept;
}
外部拦截法
事件的拦截由子View处理。
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
boolean intercept = false;
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);//一旦设置为true表示有子view处理事件不拦截
break;
case MotionEvent.ACTION_MOVE:
int deltaX=x-mLastXIntercepet;
int deltaY=y-mLaSTYIntercepet;
if(父容器需要拦截此次事件){
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
break;
mLastXIntercepet=x;
mLaSTYIntercepet=y;
return super.dispatchTouchEvent(event);
}
父容器也要做修改
action-down事件 返回为false
因为requestDisallowInterceptTouchEvent不能影响action-down事件