`

ViewGroup&View&Activity onInterceptTouchEvent&dispatchTouchEvent&onTouch整理

阅读更多
一直对这块的知识一知半解,今天找个时间好好理一理。

首先,我们都知道,三个重写的方法
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


  • 大小: 7.9 KB
  • 大小: 5.5 KB
  • 大小: 13.5 KB
  • 大小: 62.3 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics