View嵌套的时候, Touch事件的传递, 经常让人头疼.
比如在ScrollView里, 在WebView里, 在ListView里. 事件的传递的结果会让你觉得"这太灵异了!"
麻烦的代码就不说了,如果只做上层App, 那也只有为数不多的几个方法可以让我们处理这些灵异问题:
onTouchEvent(), dispatchTouchEvent(), onInterceptTouchEvent().
并且处理的方案, 也只有控制他们的返回值.
这三个方法的返回值, 意义各不相同:
onTouchEvent():
true: "我处理了这个事件, 并且与我在同一个ViewGroup下的其他View将不能再处理这个事件"
false:"我处理了这个事件, 并且与我在同一个ViewGroup下的其他View可以继续处理这个事件"
dispatchTouchEvent()
true: "我对这个事件(通常是Down事件)感兴趣, 我将在onTouchEvent中处理这个事件"
false: "我对这个事件没兴趣, 我不会处理这个事件以及之后与这个事件相关的move, up事件"
onInterceptTouchEvent
这方法是ViewGroup的方法,
true: "我的子View将不能处理这个事件, 不会调用子View的onTouchEvent"
fasle: "我的子View可以继续处理这个事件, 我会将事件传递给子View"
如此. 基本引起灵异事件的就这仨方法了.
当发现onTouch不能工作, 检查一下View的dispatchTouchEvent是否返回了false, 或者检查一下父View的onInterceptTouchEvent是否返回了true. 当然Acitivity也是有这几个方法, 一样需要检查.
改的时候也要特别小心, 因为各种自己定义的控件, 都对相应的Touch事件有特殊处理, 所以要小心验证重写相关方法后是否会影响相关逻辑.