Android中的事件传递机制 和 几个主要方法与其返回值的意义

android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法:

1)public boolean dispatchTouchEvent(MotionEvent ev)  这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev)这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev)这个方法用来处理TouchEvent

Activity 和 View 中没有 onInterceptTouchEvent (顶端和末端没必要拦截)
内部机制中 dispatchTouchEvent 会调用 onInterceptTouchEvent 来判断是否要进行拦截事件

事件类型
在这里插入图片描述

事件分发流程

Activity ->PhoneWindow ->DecorView -> ViewGroup -> View

事件回传,返回 true ,代表消费了事件,返回false表示事件没有被消费
继续传递事件。

情况1 只有ViewGroup : 先进行分发,再进行拦截,再触发点击事件:

ViewGroup dispatchTouchEvent ACTION_DOWN
ViewGroup onInterceptTouchEvent ACTION_DOWN
ViewGroup onTouchEvent ACTION_DOWN

情况1:如果有子View,并且ViewGroup不进行拦截:

//ViewGroup 分发和拦截dowm事件
ViewGroup dispatchTouchEvent ACTION_DOWN
ViewGroup onInterceptTouchEvent ACTION_DOWN

//View 分发和触发down事件
View      dispatchTouchEvent ACTION_DOWN
View      onTouchEvent ACTION_DOWN

//ViewGroup 分发和拦截up事件
ViewGroup dispatchTouchEvent ACTION_UP
ViewGroup onInterceptTouchEvent ACTION_UP

View 分发和触发up事件
View      dispatchTouchEvent ACTION_UP
View      onTouchEvent ACTION_UP

事件分发的几个主要方法与其返回值的意义

一、dispatchOnTouchEvent()的三个返回值:

1.true 表示这个事件被当前的View或ViewGroup消费,也不会传递给当前View或者VievGrouponInterceptTouchEvent方法进行处理,就 dispatchOnTouchEvent 消费了事件。

当为ViewGroup 时 消费了事件,只会执行 dispatchOnTouchEventACTION_DOWNACTION_UP
当为View 时 消费了事件,只会执行 dispatchOnTouchEventACTION_DOWN方法

2.false 表示这个事件不会再往上(内)层的View传递了,而是直接交给下(外)层View的onTouchEvent()去处理。(比如ViewGroup 会传递给Activity 进行 onTouchEvent 处理,而不会传递给子View)传给父级View

当为ViewGroup 时 消费了事件 只会执行 只会执行 dispatchOnTouchEventACTION_DOWN 方法
但是 Activity 会执行 onTouchEvent ACTION_DOWN 和 Activity onTouchEvent ACTION_UP

3.super.dispatchOnTouchEvent()返回super.dispatchOnTouchEvent()会将此事件传递给上(内)层 View的 dispatchOnTouchEvent去处理,并会执行 onInterceptTouchEvent 方法。

总结:dispatchOnTouchEvent的三个返回值中,除了super.dispatchOnTouchEvent()会继续传递下去,其它的返回值都不会继续传递。

二、onInterceptTouchEvent()的三个返回值:

(注:View没有onInterceptTouchEvent方法,ViewGroup才会有)

1.true 按下去的down事件被onInterceptTouchEvent处理完之后返回true,之后的move、up等方法就不会交由onInterceptTouchEvent处理,而是全部(包括down事件)全部交由该层的onTouchEvent去处理。这样,目标View就接收不到任何事件。

子View不能接收任何事件,当前View 只处理 ViewGroup onTouchEvent ACTION_DOWN 事件,其他事件交由
它的父View 如 Activity 处理. 拦截之后相当于以后的事件都和当前View 及子View没有关系了。

2.false 按下去的down事件被onInterceptTouchEvent处理完之后返回false,之后的move、up等方法会继续交由onInterceptTouchEvent处理,然后全部(包括down事件)往下传递,直到交由目标View的onTouchEvent去处理。

3.super.onInterceptTouchEvent()与返回false一样。

三、onTouchEvent()的三个返回值:

1.false 如果最终需要处理事件的View的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的View的onTouchEvent()处理。

View 返回 false 当前View只执行 dispatchTouchEvent ACTION_DOWN 和 onTouchEvent ACTION_DOWN
不会执行UP 和其他事件,传递到最顶层进行处理 (如上一次是 ViewGroup 也不会处理,会传到 Activity 进行处理)

2.true 如果最终需要处理事件的View的onTouchEvent()返回了true,那么后续事件将可以继续传递给该View的onTouchEvent()处理。

相当于该View消费了事件 ,不会再将事件向上传递

3.super.onTouchEvent() 与返回true一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值