Android 事件传递

889 阅读2分钟

直接上图

本文的事件传递指的是down

  1. dispatchTouchEvent 、onInterceptTouchEvent是事件的分发,从上往下(Activity->ViewGroup->View)。

  2. onTouchEvent是事件的消费,从下往上传递(View->ViewGroup->Activity)。

  3. 事件的分发

  • Activity的dispatchTouchEvent只有返回super(默认)才会继续向下传递,如果是重写并且返回false或者true,则不再传递。
  • ViewGroup的dispatchTouchEvent返回true代表消费掉,不再向下传递。当返回super(默认)则传递到onInterceptTouchEvent。如果返回的是false则传递到上一层的onTouchEvent。如果上层是viewGroup并且注册了onTouchListener事件,则先传递到ViewGroup的onTouch回调,如果onTouch返回的是false(默认)则传递到ViewGroup的onTouchEvent,如果onTouch返回的是true,则事件被消费掉,不在传递
  • ViewGroup的onInterceptTouchEvent如果返回true,代表当前事件被拦截,分发到当前ViewGroup的onTouchEvent事件中,如果当前viewGroup注册了onTouchListener事件,则先传递到ViewGroup的onTouch回调,如果onTouch返回的是false(默认)则传递到ViewGroup的onTouchEvent,如果onTouch返回的是true,则事件被消费掉,不在传递。
  • ViewGroup的onInterceptTouchEvent如果返回的是super或者false则继续向下传递,事件将被分发到下一层ViewGroup或者是View。
  • view的dispatchTouchEvent当返回的是super时,则开始传递到事件的消费部分,首先查看当前view有没有注册onTouchListener,如果有注册则事件传递到onTouch内,如果onTouch返回的是true,则事件被消费掉,不在传递,如果是false,则事件传递到view的onTouchEvent。
  • view的dispatchTouchEvent返回的是false,则事件传递到上一层的onTouchEvent,如果上层是viewGroup并且注册了onTouchListener事件,则先传递到ViewGroup的onTouch回调,如果onTouch返回的是false(默认)则传递到ViewGroup的onTouchEvent,如果onTouch返回的是true,则事件被消费掉,不在传递。
  • view的dispatchTouchEvent返回的是true,则代表事件被消费掉,不再传递。

   4. 事件的消费

  • view的OnTouch,如果view注册了onTouchListener,则先将事件分发到对应view的onTouch方法内,如果返回true代表事件被消费了,不再传递,如果返回的是false(默认)代表不消费事件,继续向上传递到当前view的onTouchEvent。
  • view的onTouchEvent如果返回的是true,代表事件被消费掉,不再传递。(如果在返回true之前先调用了super.onTouchEvent(event)方法,去判断当前view如果注册了onClickListener,则在按下滑动抬起事件之后会调用onClick方法)
  • view的onTouchEvent如果返回的是super代表事件被消费,并且如果当前view注册了onClickListener,则在按下滑动抬起事件之后会调用onClick方法。
  • view的onTouchEvent如果返回的是false,则代表事件不消费,把事件向上传递。
  • ViewGroup的onTouchEvent与view的相同。