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?。如果父元素不拦截,则剩下事件能传到子元素。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 今日偶然看到的文中有“江湖感”一词,顿被打动。 人生前18年从未离开过家,也未曾有过任何远游经历,每一天都被家人精...
    姜啤杂货铺阅读 272评论 0 0
  • 1>memset:1、 头文件:#include <memory.h>功 能: 将s所指向的某一块内存中的每个字...
    SuperDing阅读 1,032评论 0 2
  • 浮生一梦 君子固穷 浩然正气 楚狂歌凤
    华白螭阅读 207评论 0 0
  • 今天赖团长,赤裸裸的炫富。好想打她,叫花鸡,烤玉米,金针菇,红薯,竹筒饭。女的负责干活,男的负责绣花。 晚上参加了...
    随心自在321阅读 118评论 0 1

友情链接更多精彩内容