浅谈Android事件分发

Android事件分发不论是实际应用中还是面试中都是经常用到的知识,所以今天简单的介绍一下。
首先,事件分发的"事件“是指Android中的点击(Touch)事件,事件分发渐大的讲就是讲点击事件传递到相应的View并处理的过程。
Android中对点击事件进行处理的对象及其顺序为:Activity->ViewGroup->view及其子类。
首先是Activity对事件进行分发:从用户手指接触到手机屏幕开始,事件就已经开始产生,Activity接收到用户点击的事件之后开始对事件进行分发(Activity.diapatchTouchEvent()),和消息传递机制一样,Android对事件的分发其实也是一种消息传递,总是从事件接收的“顶层”先往下传,如果“底层”无法处理事件才会回传由“顶层"处理,即是说,Activity.dispatchTouchEvent()会调用ViewGroup.dispatchTouchEvent();ViewGroup.dispatchTouchEvent()再调用view.dispatchTouchEvent()对事件进行处理(默认情况下)。
Activity对事件的分发过程如下:

 Activity的dispatchTouchEvent()会对事件进行分发,首先调用ViewGroup.dispatchTouchEvent()来对事件进行处理,如果ViewGroup.dispatchTouchEvent()返回true,则Activity对事件的分发结束;如果ViewGroup.dispatchTouchEvent()返回false,那么Activity会调用自身的OnTouchEvent对事件进行处理,window.shouldCloseOnTouch()会对点击的位置进行判断,判断是位于边界内还是边界外。

ViewGroup对事件的分发过程如下:

 ViewGroup对事件的分发从ViewGroup.dispatchTouchEvent()开始,在对事件进行分发之前,会先调用ViewGroup.OnInterceptTouchEvent()对是否拦截点击事件进行判断(默认不拦截),如果ViewGroup不对事件进行拦截,ViewGroup会遍历其中的view,如果找到相应的view则将该事件分发给相应的view处理,并返回true;如果没有找到相应的view则返回false,并有ViewGroup调用自己的ViewGroup.OnTouchEvent()对该事件进行处理,其中会调用ViewGroup父类的dispatchTouchEvent()对事件进行再次分发给ViewGroup,然后调用ViewGroup.OnTouch(),ViewGroup.performClick(),ViewGroup.OnClick(),消费掉这个点击事件。

 view对点击事件的处理同样也是从view.dispatchTouch()事件开始,view首先会检查view是否注册了Touch监听,即view.setOnTouchLister()如果注册了Touch事件监听则会执行view.OnTouch()对事件进行处理、消费,如果view消费了这个事件,那么view.dispatchTouch()返回true,否则调用View.OnTouchEvent()处理,如果是Down事件,那么处理结束,如果是抬起事件则会调用view.performClick(),view.onClick()对事件进行消费。如果view最后消费了这个事件,那么view.dispatchTouchEnevnt()返回true,否则返回false。

Android事件分发机制大概就是这样,欢迎大家指正!

 

这里推荐一篇大佬的文章,讲的非常详细:
https://www.jianshu.com/p/38015afcdb58

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值