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

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

首先,我们都知道,三个重写的方法
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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值