ViewGroup事件分发机制

方法1:

public boolean dispatchTouchEvent(MotionEvent ev)

    该方法用来进行事件的分发,即无论ViewGroup或者View的事件,都是从这个方法开始的。

方法2:

public boolean onInterceptTouchEvent (MotionEvent ev)

    在方法1内部调用,表示是否拦截当前事件。默认不拦截。

    如果拦截了事件,那么将不会分发给子View。

方法3:

public boolean onTouchEvent(MotionEvent ev)

    在方法1内部调用,表示是否对事件进行处理。


    以上三个方法非常重要,它们的关系可以用如下伪代码呈现:

public boolean dispatchTouchEvent(MotionEvent ev){

    boolean handle =false;

if(onInterceptTouchEvent(ev)){

        handle = onTouchEvent(ev);

}else{

        handle = child.dispatchTouchEvent(ev);

    }

return handle;

详细:

if (actionMasked == MotionEvent.ACTION_DOWN) {

    cancelAndClearTouchTargets(ev);

    resetTouchState();

}

首先这里先判断事件是否为DOWN事件,如果是,则初始化,由于一个完整的事件序列是以DOWN开始,以UP结束,所以如果是DOWN事件,那么说明是一个新的事件序列,所以需要初始化之前的状态。

mFirstTouchTarget =null;

mFirstTouchTarget 最终指向消耗事件的View,如果都不消耗,那么最后事件会交由Activity处理。

onTouch() 方法的返回值决定了 onTouchEvent() 方法要不要执行,如果 onTouch() 返回 true,则 onTouchEvent() 不会再执行,返回 false ,则 onTouchEvent() 继续执行,而 onClick() 的回调是在 onTouchEvent() 方法中调用

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