Android dispatchTouchEvent 事件分发学习总结

前段时间做一个需求,涉及一些Android事件分发的内容,所以趁此机会,认真学了一下,以下是一些总结。

dispatchTouchEvent函数在Activity,View 和ViewGroup中都有定义,并且处理的逻辑也是不同的。

Activity:
当发生点击事件后,最先响应的是Activity的dispatchTouchEvent()函数,Activity会把TouchEvent传给自身绑定的rootView(一般就是DecorView),由rootView进行处理。
如果TouchEvent一直没有消费掉,最后会调用Activity的onTouchEvent()函数来处理事件。

ViewGroup:
ViewGroup运行dispatchTouchEvent()函数时,首先会调用onInterceptTouchEvent()函数,这是个拦截函数,如果需要拦截子View的点击事件,可以在这里添加一些逻辑;默认返回值是false,此时会按照添加子View时的顺序将事件分发给各个子View,由各个子View处理事件;如果添加了拦截的逻辑,返回值为true的话,会给各个子View发送Action_Cancel指令,并且所有事件都变为已处理。
子View处理事件时逻辑类似,如果是ViewGroup则继续分发,如果是View的话,则执行View的逻辑。

View:
View处理事件时先看是否有onTouchListener,如果有的话,优先执行onTouchListener的onTouch函数,如果没有处理,则执行onTouchEvent函数。
ViewGroup本质也是View,子view都没消费事件的话,也会走View的逻辑。

 

当子view不想被拦截时可以通过requestDisallowInterceptTouchEvent(true)函数来阻止拦截。

下面是整体的一张流程图,要比文字更清晰一点:

转载于:https://www.cnblogs.com/softlifer/p/4885170.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值