Android事件分发,事件拦截,事件处理总结

时间:2021-02-13 22:43:52

对于安卓的事件分发,拦截及事件处理无论是面试还是在日常应用中都涉及的比较多,网上的帖子也很多,感觉都没说透,或者没直接点出来,我认为郭神这篇博客写的事件分发理解的挺好 http://blog.csdn.net/sinyu890807/article/details/9097463

 1.对于事件的传递流程:安卓点击事件MotionEvent 传递流程 Activity - window(phoneWindow)-DecorView(*View,其实是个ViewGroup),由DecorView的dispatchTouchEvent向下分发事件,具体可看下里面的源码,如果ViewGroup中没有子元素,事件传递到此处,说明已经传到最底层了,它直接拦截掉这个事件交由其onTouchEvent处理,如果onTouchEvent不处理,则交由其上级处理,均不处理,则最后交由Activity 的onTouchEvent来处理这个事件。再比如:TextView 设置点击事件,这个传递过程是这样的,Activity(dispatchTouchEvent)-Window - DecorView,这个跟上面是一样的,因为TextView设置了onClickListener,当事件传递到TextView时,因为TextView 继承自View,View中没有拦截事件的方法,默认来说,到最底层View来说onTouchEvent 默认返回为true 来处理这个事件的,因为设置了onClickListener,最后会回调TextView的onClick方法,由此可见,onClickListener在事件传递的最末端! 

2.对于事件的拦截(一般来说ViewGroup中拦截的方法onInterceptTouchEvent),事件在分发的过程中,该父类group不想让下面的子类收到这个事件,这个消息,则他会在onInterceptTouchEvent中返回true,表示我要拦截这个事件,不让子类知道;返回false,则不拦截,事件继续向下传递。

3.对于事件的处理 ,事件的处理在对应拦截的那个类的onTouchEvent方法中进行处理,onTouchEvent 有actionDown,move,up等方法,如果最后onTouchEvnet返回true,表示我要处理消费了这个事件,反之,则不处理这个事件,交给上层ViewGroup或View来处理这个事件。

总结

事件分发:dispatchTouchEvent retrurn true 则向下分发事件,false,则不向下分发。

事件拦截:onInterceptTouchEvent return true 则表示我要拦截,事件流到自己的onTouchEvent中处理,false,则不拦截,继续的向下传递事件。

事件处理:onTouchEvent  reture true 则表示我要处理,反之,我不处理,交给上层ViewGroup或View来处理这个事件。