2022-04-14事件分发机制

1.当有一个Touch事件生的时候,事件分发机制就开始了。
从Activity->ViewGroup->View

开始将事件传递到Activity之中

1.先是调用Activity.dispatchTouchEvent():开始事件分发
2.调用Window.superDispatchTouchEvent():判断传递时间是否结束 false->直接调用Activity.onTouchEvent方法进行触摸事件
true->表示不再往下进行事件的传递,事件传递完成—>View
其中window.superDispatchTouchEvent会调用mDecor.superDispatchTouchEvent方法,其中mDecor就是顶层的View(所有界面的父类,是ViewGroup的子类)
此方法之中又会调用父类也就是ViewGroup的dispatchTouchEvent()方法;将我们的事件ViewGroup之中;
所以说,我们的window.superDispatchEvent的返回值就是我们的ViewGroupdispatchTouchEvent返回的值;
流程图


image.png

事件传递到了ViewGroup之中:
1.开始dispatchTouchEvent()方法
2.调用onInterceptTouchEvent()方法,判断是否需要进行事件拦截
false->可继续向View传递事件->寻找被点击的View->找到,调用view.dispatchTouchEvent方法,完成到View的时间的传递;没有,调用ViewGroup的父类的dispatchTouchEvent()方法,执行触摸事件;
true->开始执行ViewGroup父类的dispatchTouchEvent事件,就会执行ViewGroup的onTouch() ->onTouchEvent->perormClick() ->onClick():注意这里的事件的执行顺序若是有消费onTouch()事件,就不再执行后面的事件,没有,后面的事件继续执行;
(注意这里的onTouchEvent就是所定义的Activity.onTouchEvent或是Viwe.onTouchEvent);

image.png

事件传递到View:
1.开始View.dispatchTouchEvent()
2.就是对于我们的触摸事件的执行:
1)View可点击
2)View注册Touch监听事件
3)View注册了Touch事件时的onTouch();
只有满足上面的三者,dispatchTouchEvent()才会返回true;不然,我们继续执行onTouchEvent方法;其中的ACTION_UP变量之中调用performClick,而performClick中调用onClick方法,所以我们重写的onClick方法就是调用在OnTouchEvent方法之中。故当我们重写了onTouch方法就onClick就执行。


image.png

综上所述,就是当我们的View可以点击的时候View.dispatchTouchEvent方法返回true;
这时我们的Group.dispatchTouchEvent也会返回true
故Activity.dispatchTouchEvent也会返回true,时间停止向下分发。
否则:也就是说我们找到的这个被点击的子View,是不能被点击的,这时,回到ViewGroup,执行他的点击事件View.dispatchTouchEvent(其中的View就是ViewGroup的父类),就相当于ViewGroup被点击了;
若是ViewGroup也是不能点击->这时就会调用我们的Activity的onTouchEvent方法之中,当我们的点击在Activity的外边,就会finish我们的Activity;

    public boolean onTouchEvent(MotionEvent event) {
        if (mWindow.shouldCloseOnTouch(this, event)) {
            finish();
            return true;
        }
        
        return false;
    }

public boolean shouldCloseOnTouch(Context context, MotionEvent event) {
      if (mCloseOnTouchOutside && event.getAction() == MotionEvent.ACTION_DOWN
              && isOutOfBounds(context, event) && peekDecorView() != null) {
          return true;
      }
      return false;
  }

你可能感兴趣的:(2022-04-14事件分发机制)