滑动冲突的解决方式有内部拦截法。内部拦截法是指父容器不拦截任何事件,所有的事件都传递给子元素。但是为什么重写父元素的onInterceptTouchEvent()方法时却是:
public boolean onInterceptTouchEvent(MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
return false;
} else {
return true;
}
}
这样写不是拦截了除DOWN以外的其他事件吗?这不是和概念矛盾吗?
Android开发艺术和网上很多博文都是这样,是我哪里的理解出问题了吗?
子view调用requestDisallowInterceptTouchEvent(boolean),这样就算move和up返回ture,子view也会收到滑动事件
http://www.thinkphp.cn/topic/14477.html
requestDisallowInterceptTouchEvent(boolean)可以在子控件中干预父控件的事件分发过程。在子控中调用parent.requestDisallowInterceptTouchEvent(false)就是父控件处理事件。你的疑问在于你写的代码是父控件拦截了除点击以外所有事件,这个代码就是这个意思,子控件调用parent.requestDisallowInterceptTouchEvent(boolean)即可进行干预,另外这个代码不能干预不能ACTION_DOWN ,所以父控件中需要不拦截ACTION_DOWN事件。
首先内部拦截法不需要重写父控件的这个方法,只需要子控件调用父控件的parent.requestDisallowInterceptTouchEvent(boolean)。外部拦截法才才是你上面写的这种方式,
一般是通过不同的条件来判断是否将事件传递到子控件。但是为什么不能拦截 ACTION_DOWN 呢?如果连ACTION_DOWN都拦截了,那么后面的事件是无法分发到子控件的,
所以我们拦截一般都只拦截除了DOWN以外的事件。
你首先要理解,一旦一个事件被一个View拦截,后续的事件序列都会交给他去处理。所以一旦子View拦截了down事件,随后的事件序列(move和up等)都会交给他处理,父View拦截也是没用的。