点击事件的事件分发,其实就是对MotionEvent事件的分发过程,产生MotionEvent后,系统需要把这个事件传递给一个具体的View,而这个传递的过程就是分发过程。
事件传递的三个阶段:
- 分发(Dispatch):事件分发对应dispatchTouchEvent方法。方法返回值true表示事件被当前视图消费掉,不再继续分发事件;方法返回值是super.dispatchTouchEvent表示继续分发该事件。如果当前视图是ViewGroup及其子类,则会调用onInterceptTouchEvent方法判定是否拦截该事件。
- 拦截(Intercept):事件拦截对应onInterceptTouchEvent方法,这个方法只在ViewGroup及其子类中存在,在View和Activity中是不存在的。返回true,不会继续传递给子View,返回false或父类同名方法,则事件会继续传递给子View。
- 消费(Consume):事件的消费对应着onTouchEvent。方法返回值true表示当前视图可以处理对应的事件,事件不会向上传递给父视图;返回值为false表示当前视图不处理这个事件,事件会传递给父视图的onTouchEvent方法进行处理。
Activity |
dispatchTouchEvent onTouchEvent |
ViewGroup |
dispatchTouchEvent onInterceptTouchEvent onTouchEvent |
View |
dispatchTouchEvent onTouchEvent |
返回值存在情况:false、true、父类同名方法 事件传递:由外向内 事件消费:由内向外
View控件事件触发顺序: onTouch-false->onTouchEvent-->onClick onTouch绑定OnTouchListener监听。 onTouch返回true,事件停止传递,不调用onClick;false相反。
页面点击事件产生后,传递过程遵循如下顺序: Activity-->Window-->View |