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