前言
在Andorid卡法体系中,事件分发是一个比较重要的知识体系,了解整套的分发机制,可以分析各种点击滑动的问题,可以更好的拓展控件的事件功能和自定义控件。
Android的事件分发图解
图解:(从上往下Activity -> ViewGroup -> View)
从Activity的dispatchTouchEvent开始,通过不同的返回类型,结果也不同
如果事件不被打断,事件流向一个类U型图
图解:
假设一个DOWN事件到来,从Activity的dispatchTouchEvent开始,如果返回true、false,那么事件被消费,不再往下传递;如果是返回super.dispatchTouchEvent(ev),事件就会传递到ViewGroup的dispatchTouchEvent中,ViewGroup的dispatch返回true,那么事件被消费,返回false,事件会回到Activity的onTouchEvent中,返回super,则会传递到ViewGroup的onInterceptTouchEvent(ViewGroup特有方法)中,onInterceptTouchEvent返回true,事件传递ViewGroup的onTouchEvent中,返回true,事件被消费,返回false、super,事件回到Activity的onTouchEvent中;如果ViewGroup的onInterceptTouchEvent返回false、super,事件则继续向下传递到View的dispatchEvent中,返回true,事件被消费,返回false,事件回到ViewGroup的onTouchEvent中,返回super,传递到View的onTouchEvent中,true则消费,false、super,则事件回到ViewGroup的onTouchEvent。
关于ACTION_MOVE和ACTION_UP
上面都是针对ACTION_DOWN事件传递,而move和up事件和down事件不一样,在执行down事件的时候返回了false,后面一系列其他的action事件则不会执行,只有返回了true,才会收到其他action事件。在哪个View的onTouchEvent 返回true,那么ACTION_MOVE和ACTION_UP的事件从上往下传到这个View后就不再往下传递了,而直接传给自己的onTouchEvent 并结束本次事件传递过程。
参考资料:https://www.jianshu.com/p/e99b5e8bd67b