Android事件分发及源码分析

1.touch事件
一个事件总是以ACTION_DOWN作为开始,在手势移动过程中会重复产生多个ACTION_MOVE事件,用户操作结束事件的标志为ACTION_UP,而意外终止事件则会触发ACTION_CANCEL。通常ACTION_DOWN的分发最重要。
2.三个主要相关方法

dispatchTouchEvent(MotionEvent ev)
onInterceptTouchEvent(MotionEvent ev)
onTouchEvent(MotionEvent event)

ViewGroup中这三个方法之间关系的伪代码如下:

public boolean dispatchTouchEvent(MotionEvent ev) {
    boolean consume = false;
    if (onInterceptTouchEvent(ev)) {
        consume = onTouchEvent(ev);
    } else {
        consume = child.dispatchTouchEvent(ev);
    }
    return consume;
}

View 没有onInterceptTouchEvent,所以一般view调用dispatchTouchEvent后就调用onTouchEvent
我们看这个dispatchTouchEvent的伪代码:
1.onInterceptTouchEvent(ev)默认返回false,所以通常ViewGroup会往子元素分发,除非你在onInterceptTouchEvent返回true表示拦截,然后会调用onTouchEvent
2.而onTouchEvent默认返回true,消费掉。
3.只能一个View把事件序列拦截并且消耗。实际源码中,某个ViewGroup决定拦截后,这个事件序列剩下的就会只交给他处理。同时它的onInterceptTouchEvent不再调用了。可见在onInterceptTouchEvent中,ACTION_DOWN一般返回false。因为它如果true,剩下事件不会传给子元素了。比如嵌套滑动中,父元素横向滑动,子元素纵向滑动,父元素ACTION_DOWN时不拦截,子元素能收到ACTION_DOWN,在ACTION_MOVE父元素决定要不要拦截,如果父元素决定拦截,则剩下事件父元素处理,父元素滑动,子元素收到ACTION_CANCEL?。如果父元素不拦截,则剩下事件能传到子元素。

你可能感兴趣的:(Android事件分发及源码分析)