Android事件分发机制

一、事件分发机制流程

(1)Activity的事件分发

  • Activity.dispatchTouchEvent()方法,内部调用getWindow.superDispatchTouchEvent()方法。
  • 因为Window是抽象方法,所以调用子类PhoneWindows.superDispatchTouchEvent()方法,内部调用
    mDecor.superDispatchTouchEvent()方法。
  • DecorView继承于FrameLayout作为顶层View,是所有界面的父类。而FrameLayout作为ViewGroup的子类,所以直接调用了ViewGroup的dispatchTouchEvent()。
  • ViewGroup.dispatchTouchEvent()
    true:Activity.dispatchTouchEvent()返回为true
    false:Activity.onTouchEvent()
    super:将事件传递到ViewGroup.onInterceptTouchEvent()

(2)ViewGroup的事件分发

  • ViewGroup.dispatchTouchEvent()调用ViewGroup.onInterceptTouchEvent()方法拦截事件。
  • ViewGroup.onInterceptTouchEvent()默认不拦截向下传递,拦截需要手动复写设置。
    true:拦截事件不允许事件继续向子View传递,调用ViewGroup.dispatchTouchEvent()自己处理事件:onTouch → onTouchEvent → onClick。
    false:不拦截允许事件继续向子View传递,遍历ViewGroup中所有子View,找到被点击的子View,调用子View的dispatchTouchEvent()方法。
    super:不拦截允许事件继续向子View传递,遍历ViewGroup中所有子View,找到被点击的子View,调用子View的dispatchTouchEvent()方法。

(3)View的事件分发

  • View.dispatchTouchEvent()方法调用View.onTouch方法判断是否消费事件。返回true事件被消费,dispatchTouchEvent()方法返回true;返回false事件没有被消费继续向下传递,dispatchTouchEvent()调用View.onTouchEvent方法。
  • onTouchEvent()判断当前点击和长按点击有一个为true,onTouchEvent()就返回为true消费掉当前事件;false将事件传给ViewGroup.onTouchEvent()方法;
  • mOnClickListener不为空,调用onClick方法。

(4)事件分发工作流程

  • Activity.dispatchTouchEvent()
    true:消费
    false:Activity.onTouchEvent()
    super:ViewGroup.dispatchTouchEvent()
  • ViewGroup.dispatchTouchEvent()
    true:消费
    false:Activity.onTouchEvent()
    super:ViewGroup.onInterceptTouchEvent()
  • ViewGroup.onInterceptTouchEvent()
    true:ViewGroup.onTouchEvent()
    false:View.dispatchTouchEvent()
    super:View.dispatchTouchEvent()
  • View.dispatchTouchEvent()
    true:消费
    false:ViewGroup.onTouchEvent()
    super:View.onTouchEvent()
  • View.onTouchEvent()
    true:消费
    false:ViewGroup.onTouchEvent()
    super:View.onTouchEvent()
  • ViewGroup.onTouchEvent()
    true:消费
    false:Activity.onTouchEvent()
    super:Activity.onTouchEvent()
  • Activity.onTouchEvent()
    true:无处理结束
    false:无处理结束
    super:无处理结束

你可能感兴趣的:(Android事件分发机制)