美文网首页
Android事件分发及源码分析

Android事件分发及源码分析

作者: pisfans | 来源:发表于2020-01-06 10:18 被阅读0次

    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事件分发及源码分析

          本文链接:https://www.haomeiwen.com/subject/mluunctx.html