TouchEvent总结

原文出自链接内容

Android Touch事件
假设布局层次为
Layout0
Layout1
Layout2
Layout3

如果谁都没有去interceptTouch,同时谁都没有处理onTouch事件。
那么
1.Layout0->intercept
2.Layout1->intercept
3.Layout2->intercept
4.Layout3->intercept
5.Layout3->onTouch
6.Layout2->onTouch
7.Layout1->onTouch
8.Layout0->onTouch
由于谁都没有消费ACTION_DOWN事件,后续的MOVE,UP事件将不会传进来。

如果Layout2 intercept了,但是不消费onTouch
那么
1.Layout0->intercept
2.Layout1->intercept
3.Layout2->intercept
4.Layout2->onTouch
5.Layout1->onTouch
6.Layout0->onTouch
后续事件不会传入

如果Layout2 intercept了,同时消费了。
那么
ACTION_DOWN
1.Layout0->intercept
2.Layout1->intercept
3.Layout2->intercept
4.Layout2->onTouch

ACTION_MOVE
1.Layout0->intercept
2.Layout1->intercept
3.Layout2->onTouch

ACTION_MOVE
1.Layout0->intercept
2.Layout1->intercept
3.Layout2->onTouch

ACTION_UP
1.Layout0->intercept
2.Layout1->intercept
3.Layout2->onTouch

如果Layout2 intercept了,不消费,Layout1消费了。
那么
ACTION_DOWN
1.Layout0->intercept
2.Layout1->intercept
3.Layout2->intercept
4.Layout2->onTouch
5.Layout1->onTouch

ACTION_MOVE
1.Layout0->intercept
2.Layout1->onTouch

ACTION_MOVE
1.Layout0->intercept
2.Layout1->onTouch

ACTION_UP
1.Layout0->intercept
2.Layout1->onTouch

总结一下。规律就是
如果当前Layout intercept了,那么子View和子ViewGroup都没有机会去获得Touch事件了。如果当前Layout并不消费事件的话,这个事件会一直向上冒泡,直到某个父Layout的onTouchEvent消费了这个事件。如果没有任何一个父Layout消费这个事件,那么后续的事件都不会被接受。
如果在冒泡过程中有某个Layout消费了这个事件。那么后续事件这个Layout的所有父Layout的intercept仍然会被调用。但是当前Layout的intercept不会再被调用了。直接调用onTouch事件。

另外,对于底层的View来说,有一种方法可以阻止父层的View截获touch事件,就是调用getParent().requestDisallowInterceptTouchEvent(true);方法。一旦底层View收到touch的action后调用这个方法那么父层View就不会再调用onInterceptTouchEvent了,也无法截获以后的action。在实践过程中发现ListView在滚动的时候会调用这个方法。使得action不能被拦截

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值