12.Android事件分发过程
参考博客:https://www.jianshu.com/p/38015afcdb58
Activity、ViewGroup、View
Activity的事件分发过程:
activity通过superDispatchTouchEvent()向ViewGroup传递事件,传递事件成功则返回true,否则返回false;若返回false,需要activity自行处理事件,因此调用onTouchEvent()。
ViewGroup的事件分发过程:
首先承接activity返回true的步骤,ViewGroup同理也会调用DispatchTouchEvent();
然后这里有一个区别,就是多了一个拦截函数onInterceptTouchEvent(),可根据自身要求进行复写,否则默认为不拦截;
若不拦截,将使用for循环来遍历ViewGroup下的子view,寻找正在被点击的view,找到后同样用DispatchTouchEvent()向View传递事件;
若拦截,要么你自行设置了拦截或者点击的空白处所以没有view响应,因此ViewGroup需要自行处理事件,调用OnTouch->OnToucEvent()。
View的事件分发过程:
由上面可知会先触发DispatchTouchEvent(),此时有一个if判断有3个条件:
1、mOnTouchListener不为空,此条件只要给控件注册了onTouch事件都能满足
2、(mViewFlags & ENABLED_MASK) == ENABLED 此条件默认情况下一般为true,所以可以不用理会
3、mOnTouchListener.onTouch(this, event),这个函数需要手动重写定义,所以一旦它为true,则View.dispatchTouchEvent()直接返回true,事件分发结束;否则,View.dispatchTouchEvent()中跳出If,执行onTouchEvent(event)。
onTouchEvent的函数分析:先判断控件是否可点击并且用户点击有效,然后根据点击情况(抬起、放下、结束、滑动)来处理事件,一般默认在用户点击完成抬起手后执行执行performClick()函数,里面主要是:只要我们给控件注册了点击事件,那么就会继续往下回调OnClick函数,继而完成点击事件的处理。
这是我自己看完那篇博客总结出来的一些要点,更多细节的内容大家可以看