一直对这块的知识一知半解,今天找个时间好好理一理。
首先,我们都知道,三个重写的方法
(
都会有返回值。布尔型的,我们可以这样理解
true 表示已消费这个event事件,不会往后传递了。
false 表示没有消费该事件,继续向后传递。
如果各层事件都没有被消费,传递顺序大致是这样的
[img]http://dl2.iteye.com/upload/attachment/0119/1087/a3a35ad1-0245-3422-ae5c-335cb85ce263.png[/img]
viewgroup dispatchTouchEvent --> viewgroup onInterceptTouchEvent --> textview onTouch --> viewgroup onTouch
我这边只用两层,一个viewgroup,一个普通的textview,
(如果层级多也是一样,
onInterceptTouchEvent 由最底层viewgroup 往上 逐层拦截,
ontouch 由最上层子view 向下 逐层传递)
如果在viewgroup 某一个事件在onInterceptTouchEvent被消费了,
那后续的事件也不会再传递到onInterceptTouchEvent了。
更不会到子view的ontouch里去。只会到viewgroup这层的ontouch方法里去
如图
[img]http://dl2.iteye.com/upload/attachment/0119/1089/a472f544-1228-32bd-82d7-3bc226748f88.png[/img]
如果onInterceptTouchEvent在ACTION_DOWN 的时候没做拦截,在ACTION_UP的时候做拦截
而子view在ACTION_DOWN的时候消费了事件,按流程后续的事件都应该传递到子view这边
,但因为
ACTION_UP事件被viewgroup拦截,所以子view会默认走ACTION_CANCEL这里。当然因为子view在ACTION_DOWN的时候消费了事件,所以viewgroup的ontouch是不会走到的了。
日志如下:
[img]http://dl2.iteye.com/upload/attachment/0119/1099/6d68d28c-3b54-3105-9388-a436ec8eb929.png[/img]
另外写文章的时候遇到一个问题,
viewgroup 的 onInterceptTouchEvent 以及 子view的 onTouch 都返回false,
那么只会走ACTION_DOWN,而ACTION_UP都不会走,按理说应该走。
因为正常点击或者位移事件都是ACTION_DOWN,ACTION_UP,ACTION_MOVE的,既然都不拦截,那后续的事件应该都走完?
网上有人解答说
[img]http://dl2.iteye.com/upload/attachment/0119/1103/5a087547-bdc2-3b7a-b511-cdcec823d60b.png[/img]
看的云里雾里的,但这么做的确行得通。不知有哪位大神能通俗的给小弟解释下~
参考[url]http://my.oschina.net/fengheju/blog/196608?_t=t[/url]
[url]http://bbs.csdn.net/topics/380019043[/url]
首先,我们都知道,三个重写的方法
(
onInterceptTouchEvent&dispatchTouchEvent&onTouch
)
都会有返回值。布尔型的,我们可以这样理解
true 表示已消费这个event事件,不会往后传递了。
false 表示没有消费该事件,继续向后传递。
如果各层事件都没有被消费,传递顺序大致是这样的
[img]http://dl2.iteye.com/upload/attachment/0119/1087/a3a35ad1-0245-3422-ae5c-335cb85ce263.png[/img]
viewgroup dispatchTouchEvent --> viewgroup onInterceptTouchEvent --> textview onTouch --> viewgroup onTouch
我这边只用两层,一个viewgroup,一个普通的textview,
(如果层级多也是一样,
onInterceptTouchEvent 由最底层viewgroup 往上 逐层拦截,
ontouch 由最上层子view 向下 逐层传递)
如果在viewgroup 某一个事件在onInterceptTouchEvent被消费了,
那后续的事件也不会再传递到onInterceptTouchEvent了。
更不会到子view的ontouch里去。只会到viewgroup这层的ontouch方法里去
如图
[img]http://dl2.iteye.com/upload/attachment/0119/1089/a472f544-1228-32bd-82d7-3bc226748f88.png[/img]
如果onInterceptTouchEvent在ACTION_DOWN 的时候没做拦截,在ACTION_UP的时候做拦截
而子view在ACTION_DOWN的时候消费了事件,按流程后续的事件都应该传递到子view这边
,但因为
ACTION_UP事件被viewgroup拦截,所以子view会默认走ACTION_CANCEL这里。当然因为子view在ACTION_DOWN的时候消费了事件,所以viewgroup的ontouch是不会走到的了。
日志如下:
[img]http://dl2.iteye.com/upload/attachment/0119/1099/6d68d28c-3b54-3105-9388-a436ec8eb929.png[/img]
另外写文章的时候遇到一个问题,
viewgroup 的 onInterceptTouchEvent 以及 子view的 onTouch 都返回false,
那么只会走ACTION_DOWN,而ACTION_UP都不会走,按理说应该走。
因为正常点击或者位移事件都是ACTION_DOWN,ACTION_UP,ACTION_MOVE的,既然都不拦截,那后续的事件应该都走完?
网上有人解答说
[img]http://dl2.iteye.com/upload/attachment/0119/1103/5a087547-bdc2-3b7a-b511-cdcec823d60b.png[/img]
看的云里雾里的,但这么做的确行得通。不知有哪位大神能通俗的给小弟解释下~
参考[url]http://my.oschina.net/fengheju/blog/196608?_t=t[/url]
[url]http://bbs.csdn.net/topics/380019043[/url]