文档章节

Android 事件分发机制

d
 dongwust
发布于 2016/05/23 16:55
字数 777
阅读 5
收藏 0

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时相同

 

© 著作权归作者所有

共有 人打赏支持
d
粉丝 0
博文 1
码字总数 777
作品 0
深圳
Android 机制篇 - 事件分发机制超详解(🔥🔥🔥🔥🔥🔥🔥🔥)

Android 虽然不是四大组件,但其并不比四大组件的地位低(涉及面的广度和深入甚至比四大组件还复杂🔥)。而View的核心知识点“事件分发机制”则是不少刚入门同学的拦路虎(1、项目中处处遇...

Pepsimaxin
07/12
0
0
安卓自定义View进阶-事件分发机制原理

安卓自定义View进阶-事件分发机制原理 之前讲解了很多与View绘图相关的知识,你可以在 安卓自定义View教程目录 中查看到这些文章,如果你理解了这些文章,那么至少2D绘图部分不是难题了,大部...

猴亮屏
05/22
0
0
android事件分发机制总结

Android事件分发机制 在android 普通view(不包含ViewGroup)和activity中主要有一下两个方法处理事件: public boolean dispatchTouchEvent(MotionEvent ev) // 分发事件public boolean on...

亓斌哥哥
2014/10/08
0
1
【Android】打造下拉放大效果

前言 在其他App上看到了这样的一个效果,感觉有点意思,于是决定实现一个类似的效果。 (其实是iOS的同学在是现功能的时候秀了一波操作) 效果大概是这样子的: UI看完后 “这个效果不错啊”...

带心情去旅行
06/19
0
0
职责链模式之Android事件分发源码分析

1、职责链模式概述: 职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直...

Tifkingsly
07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java并发备忘

不安全的“先检查后执行”,代码形式如下: if(条件满足){ //这里容易出现线程安全问题//doSomething}else{//doOther} 读取-修改-写入 原子操作:使用CAS技术,即首先从V中读取...

Funcy1122
今天
0
0
SpringBoot2.0 停机

最近新建了个SpringBoot2.0的项目,因为原来一直使用的是传统的Tomcat部署war包的形式,所以这次SpringBoot内置Tomcat部署jar包的时候遇到了很多问题。其中一个就是因为没有外置的Tomcat容器...

Canaan_
昨天
0
1
Confluence 6 外部参考

一个外部参考的意思是任何站点链接到你 Confluence 的实例。任何时候当 Confluence 的用户单击这个外部链接的时候,Confluence 可以记录这次单击为参考。 在默认的情况下,外部链接的参考链接...

honeymose
昨天
0
0
Android中的设计模式之抽象工厂模式

参考 《设计模式解析》 第十一章 Abstract Factory模式 《设计模式:可复用面向对象软件的基础 》3.1 Abstract Factory 抽象工厂 对象创建型模式 《Android源码设计模式解析与实战》第6章 创...

newtrek
昨天
0
0
Redis | 地理空间(GEO)的一个坑

Redis的地理空间(Geo)是个好东西,轻轻松松的就可以把地图描点的问题处理了, 最近却遇到一个坑...Redis采用的Msater-Slave模式, 运用GEORADIUS在salve读取对应的数据,新增了从节点但是从不返...

云迹
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部