事件分发机制 - 1835434698/1835434698.github.io GitHub Wiki

事件分发机制

1、activity、viewgroup、view的事件。

1.1、Activity类(Activity及其各种继承子类)

​ dispatchTouchEvent()、onTouchEvent()

1.2、ViewGroup类(LinearLayout、FrameLayout、ListView等.....)

    dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent()

1.3、View类(Button、TextView等.....)

    dispatchTouchEvent()、onTouchEvent()

2、事件传递说明

从activity开始一次向子viewgroup传递,然后子view返回ture(消费掉事件)或者false(不消费事件,交个父view处理)

3、事件分发

事件分发(dispatchTouchEvent):他有返回值boolean,一般我们不去考虑这个返回值,使用默认的返回值来处理,默认的处理方式为:当前的控件直接将事件抛给他的子控件,特殊情况下,只有该控件为ViewGroup,他是将事件直接交于自身的拦截方法来处理。

事件首先由Activity接收到这个事件,通过Activity的dispatchEvent方法来向它的布局分发该事件,如果这个事件被ViewGroup接收到,那么这个ViewGroup首先不会直接将事件分发给ViewGroup的子View,而是直接调用自身的拦截事件方法,通过拦截事件的方法直接将事件抛给子View

事件拦截(onInterceptTouchEvent):事件拦截的返回值是true,拦截事件,直接交给自身来处理该事件。方法返回值是false:表示不拦截该事件,事件继续向下分发,交给他的子控件处理。

事件消费(onTouchEvent):方法返回值为true:表示消费该事件;方法返回值是false:表示不消费该事件,事件交给他的父布局或父容器来消费。

img

img

3.1、View dispatchTouchEvent 调用父类的 dispatchTouchEvent,其中先判断是否设置了onTouch监听,如果设置了先判断其返回值,其次调用onTouchEvent判断其返回值。(super.dispatchTouchEvent(event)是分发给自身View)

3.2、ViewGroup dispatchTouchEvent 调用父类的 dispatchTouchEvent,其中先调用onInterceptTouchEvent判断。