-
外部滑动方向和内部滑动方向不一致
-
外部滑动方向和内部滑动方向一致
-
以上两种情况的嵌套
- 重写父容器的
onInterceptTouchEvent()
方法
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercepted = false;
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
if (true) //如果父容器需要点击事件
intercepted = true;
else
intercepted = false;
break;
case MotionEvent.ACTION_UP:
break;
}
return intercepted;
}
- 重写子元素的
dispatchTouchEvent()
方法,并调用requestDisallowInterceptTouchEvent()
方法
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);//设置之后,父元素无法拦截出ACTION_DOWN以外的其他事件
break;
case MotionEvent.ACTION_MOVE:
if (true) { //如果父容器需要点击事件
getParent().requestDisallowInterceptTouchEvent(false);//这时,父元素可以开始拦截事件了
}
break;
case MotionEvent.ACTION_UP:
break;
}
return super.dispatchTouchEvent(ev);
}
- 父元素也要默认拦截除了ACTION_DOWN以外的其他事件,这样当子元素调用parent.requestDisallowInterceptTouchEvent(false)方法时,父元素才能继续拦截所需的事件。
public boolean onInterceptTouchEvent(MotionEvent event){
int action = event.getAction();
if(action == Motion.ACTION_DOWN){
return false;
}else{
return true;
}
}