事件分发的本质
1.将产生的MotionEvent传递给某个具体的View 处理(消费)的整个过程
2.一旦事件被某个View消费就会返回true,所有View都没有消费的话就会返回false,事件往父view抛
理解Activity、 ViewGroup 和View分别如何分发事件,你就理解了View事件的分发机制
从Activity.dispatchTouchEvent()开始分发事件给Phone Window的superDispatchTouchEvent(),然后到ViewGroup(DecorView)的dispatchTouchEvent(),然后从ViewGroup.dispatchTouchEvent向下分发,ViewGroup中先调用onInterceptTouchEvent判断是否需要拦截 true:拦截,就调用自身的onTouchEvent()【true:消费掉 false:往上抛到Activity.onTouchEvent()】, false: 如果不需要拦截就调用child.dispatchTouchEvent(),以此类推直到分发到叶子结点的子View.dispatchTouchEvent(),叶子结点View的dispatchTouchEvent()中有onTouchListener的话先调用onTouch方法,true,则消费掉事件终止,false: 调用自身onTouchEvent方法,这时只要走到onTouchEvent中开始switch (action)进行事件处理就会return true ,同时这个过程中的ACTION_UP会检查是否有onClickListener,有的话调用onClick方法,没有走到则return false。
如果DecorView所有子View都不消费,且自身也不消费,就回到Acticity。调用Activity的onTouchEvent,如果有设置点击Activity外消费的话,且事件确实是Activity外部的话就有Activity消费,否则返回false.
Activity:
boolean dispatchKeyEvent(keyEvent event):事件分发
boolean onKeyDown(int keyCode,KeyEvent event):按下键盘的回调
boolean onKeyUp(int keyCode,KeyEvent event):松开按键的回调
boolean onKeyLongPress(int keyCode,KeyEvent event):长按按键的回调
参考:https://www.cnblogs.com/androidsuperman/p/5479590.html
-----------------------------End-----------------------------