Android 事件分发机制
博客专区 > dongwust 的博客 > 博客详情
Android 事件分发机制
dongwust 发表于2年前
Android 事件分发机制
  • 发表于 2年前
  • 阅读 4
  • 收藏 0
  • 点赞 2
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: Android 事件分发机制

Android 编程下Touch事件的分发和消费机制

Android中与Touch事件相关的方法包括:dispathTouchEvent(MotionEvent ev)、onInterceptTouchEvent(MotionEvent ev)、onTouchEvent(MotionEvent ev);能够响应这些方法的控件包括:ViewGroup及其子类、Activity。方法与控件的对应关系如下表所示:

Touch事件相关方法 方法功能 ViewGoup Acitivity 原子View
public boolean dispatchTouchEvent(MotionEvent ev) 事件分发 Yes Yes No
public boolean onInterceptTouchEvent(MotionEvent ev) 事件拦截 Yes No No
public boolean onTouchEvent(MotionEvent ev) 事件响应 Yes Yes Yes

activity对onInterceptTouchEvent(MotionEvent ev)也就是事件拦截不进行响应;原子View无法进行事件的分发和拦截,所以它没有dispatchTouchEvent(MotionEvent ev)和onInterceptTouchEvent(MotionEvent ev),只有onTouchEvent(MotionEvent ev)。

一、Touch事件分析

||事件分发: public boolean dispatchTouchEvent(MotionEvent ev)

Touch事件发生时Activity的dispatchTouchEvent(MotionEvent ev)方法会以隧道方式(从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递)将事件传递给最外层View的dispatchTouchEvent(MotionEvent ev)方法,并由该View的dispatchTouchEvent(MotionEvent ev)方法对事件进行分发。dispatchTouchEvent的事件分发逻辑如下:

·如果 return true ,事件会分发给当前View并有dispatchTouchEvent方法进行消费,同时事件会停止向下传递;

·如果 return false,事件分发分为两种情况:

        1.如果当前View获取的事件直接来自Activity,则会将事件返回给Activity的onTouchEvent进行消费。

        2.如果当前View获取的事件直接来自外层父控件,则会将事件返回给父View的onTouchEvent进行消费。

·如果返回系统默认的super.dispatchTouchEvent(ev),事件会自动的分发给当前View的onInterceptTouchEvent方法。

||事件拦截:public boolean onTouchEvent(MotionEvent ev)

在外层View的dispatchTouchEvent(MotionEvent ev)方法返回系统默认的super.dispatchTouchEvent(ev)情况下,事件会自动的分发给当前View的onInterceptTouchEvent方法。onInterceptTouchEvent的事件拦截逻辑如下:

·如果onInterceptTouchEvent返回true,则表示将事件进行拦截,并将拦截到的事件交由当前View的onTouchEvent进行处理;

·如果onInterceptTouchEvent返回false,则表示将事件放行,当前View上的事件会被传递到子View上,再由子View的dispatchTouchEvent来开始这个事件的分发;

·如果onInterceptTouchEvent返回super.onInterceptTouchEvent(ev),事件默认会被拦截,并将拦截到的事件交由当前View的onTouchEvent进行处理。

||事件响应:public boolean onTouchEvent(MotionEvent ev)

在dispatchTouchEvent返回super.dispatchTouchEvent(ev)并且onInterceptTouchEvent返回true或返回super.onInterceptTouchEvent(ev)的情况下onTouchEvent会被调用。onTouchEvent的事件响应逻辑如下:

·如果事件传递到当前View的onTouchEvent方法,而该方法返回了false,那么这个事件会从当前View向上传递,并且都是由上层View的onTouchEvent 来接收,如果传递到上面的onTouchEvent也返回false,这个事件就会”消失“,而且接收不到下一次事件

·如果返回了true则会接收并消费该事件

·如果返回super.onTouchEvent(ev)默认处理事件的逻辑和返回false时相同

 

共有 人打赏支持
粉丝 0
博文 1
码字总数 777
×
dongwust
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: