在学习完事件分发机制后,滑动冲突对我们来说已经不是问题了,无非是在不同情况下,事件被消费了或者拦截了。那我们的解决思路是提前拦截或者在子View禁止父view拦截,也就是我们说的外部解决办法和内部解决办法。
外部解决通用写法如下:直接在ViewGroup中进行事件拦截处理。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercepted = false;
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
intercepted =false;
break;
case MotionEvent.ACTION_UP:
if("满足父类条件"){
intercepted = true;
}
break;
case MotionEvent.ACTION_MOVE:
intercepted = false;
break;
}
return intercepted;
}
内部通用写法:在子view中重写dispatchTouchEvent,做禁止拦截处理,而且需要在viewGroup中dispatchTouchEvent 中down事件返回false的处理。
public boolean dispatchTouchEvent(MotionEvent event) {
boolean intercepted = false;
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
viewGroup.requestDisallowInterceptTouchEvent(true);
intercepted = true;
break;
case MotionEvent.ACTION_MOVE:
intercepted = true;
if("满足父类条件"){
viewGroup.requestDisallowInterceptTouchEvent(false);
intercepted = false;
}
break;
case MotionEvent.ACTION_UP:
intercepted = true;
break;
}
return intercepted;
}