首先,我们都知道,三个重写的方法
(
onInterceptTouchEvent&dispatchTouchEvent&onTouch)
都会有返回值。布尔型的,我们可以这样理解
true 表示已消费这个event事件,不会往后传递了。
false 表示没有消费该事件,继续向后传递。
如果各层事件都没有被消费,传递顺序大致是这样的
viewgroup dispatchTouchEvent --> viewgroup onInterceptTouchEvent --> textview onTouch --> viewgroup onTouch
我这边只用两层,一个viewgroup,一个普通的textview,
(如果层级多也是一样,
onInterceptTouchEvent 由最底层viewgroup 往上 逐层拦截,
ontouch 由最上层子view 向下 逐层传递)
如果在viewgroup 某一个事件在onInterceptTouchEvent被消费了,
那后续的事件也不会再传递到onInterceptTouchEvent了。
更不会到子view的ontouch里去。只会到viewgroup这层的ontouch方法里去
如图
如果onInterceptTouchEvent在ACTION_DOWN 的时候没做拦截,在ACTION_UP的时候做拦截
而子view在ACTION_DOWN的时候消费了事件,按流程后续的事件都应该传递到子view这边
,但因为
ACTION_UP事件被viewgroup拦截,所以子view会默认走ACTION_CANCEL这里。当然因为子view在ACTION_DOWN的时候消费了事件,所以viewgroup的ontouch是不会走到的了。
日志如下:
另外写文章的时候遇到一个问题,
viewgroup 的 onInterceptTouchEvent 以及 子view的 onTouch 都返回false,
那么只会走ACTION_DOWN,而ACTION_UP都不会走,按理说应该走。
因为正常点击或者位移事件都是ACTION_DOWN,ACTION_UP,ACTION_MOVE的,既然都不拦截,那后续的事件应该都走完?
网上有人解答说
看的云里雾里的,但这么做的确行得通。不知有哪位大神能通俗的给小弟解释下~
参考 http://my.oschina.net/fengheju/blog/196608?_t=t
http://bbs.csdn.net/topics/380019043