Android事件传递小结
Android中的Touch事件
Android中的touch事件都封装在MotionEvent中,包括ACTION_UP, ACTION_DOWN, ACTION_MOVE等,处理touch事件的主要有三个方法
- onTouchEvent(): 事件消费
- dispatchTouchEvent(): 事件分发
- onInterceptTouchEvent(): 事件拦截
这三个方法的返回值都是boolean类型的。
touch事件测试
首先建立三个嵌套的view,由内向外依次为TopView(红色), MiddleView(绿色)和BottomView(蓝色)
<com.test.toucheventdemo.ViewBottom android:layout_width="300dp" android:layout_height="300dp" android:background="@android:color/holo_blue_bright"> <com.test.toucheventdemo.ViewMiddle android:layout_width="200dp" android:layout_height="200dp" android:background="@android:color/holo_green_light"> <com.test.toucheventdemo.ViewTop android:layout_width="100dp" android:layout_height="100dp" android:background="@android:color/holo_red_light"/> </com.test.toucheventdemo.ViewMiddle> </com.test.toucheventdemo.ViewBottom>
然后重写每个view中的dispatchTouchEvent(), onTouchEvent()和onInterceptTouchEvent()这三个方法,用来查看每个方法被执行的情况。
@Override public boolean dispatchTouchEvent(MotionEvent event) { return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { Log.d("Touch", "bottom view->onTouchEvent"); return super.onTouchEvent(event); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.d("Touch", "bottom view->onInterceptTouchEvent"); return super.onInterceptTouchEvent(ev); }
下面三个方法的返回值进行设定,查看不同效果 (1)默认情况,即三个方法都继承super的方法,运行后结果为
bottom view->onInterceptTouchEvent middle view->onInterceptTouchEvent top view->onInterceptTouchEvent top view->onTouchEvent middle view->onTouchEvent bottom view->onTouchEvent
从结果可以看出touch事件是由外层向内传递的,onTouchEvent是由内向外执行的。默认情况下不对touch事件进行拦截,也不会对touch事件进行消费。
(2)事件拦截 将MiddleView的onInterceptTouchEvent()方法的返回值设为true,其余默认,即MiddleView会拦截touch事件,运行结果为
bottom view->onInterceptTouchEvent middle view->onInterceptTouchEvent middle view->onTouchEvent bottom view->onTouchEvent
结果与预想一样,MiddleView拦截了touch事件,TopView并没有执行onTouchEvent()方法。
(3)事件分发 将MiddleView的dispatchTouchEvent()方法的返回值设为false,即在这一层不进行事件分发,运行结果为
bottom view->onInterceptTouchEvent bottom view->onTouchEvent
结果说明只在底层进行了touch事件的处理,在上面两层并没有获取这个touch事件。 (3)事件消费 将MiddleView的onTouchEvent()返回值设为ture,对事件进行消费,运行结果为
bottom view->onInterceptTouchEvent middle view->onInterceptTouchEvent top view->onInterceptTouchEvent top view->onTouchEvent middle view->onTouchEvent bottom view->onInterceptTouchEvent middle view->onTouchEvent
可以看到一个奇怪的现象,middleView多执行了一次onTouchEvent()。将MiddleView的onTouchEvent()方法改写为
@Override public boolean onTouchEvent(MotionEvent event) { Log.d("Touch MotionEvent", "MotionEvent->" + MotionEvent.actionToString(event.getAction())); Log.d("Touch", "middle view->onTouchEvent"); return true; }
这时在运行一次发现输出的结果为
bottom view->onInterceptTouchEvent middle view->onInterceptTouchEvent top view->onInterceptTouchEvent top view->onTouchEvent MotionEvent->ACTION_DOWN middle view->onTouchEvent bottom view->onInterceptTouchEvent MotionEvent->ACTION_UP middle view->onTouchEvent
MiddleView在ACTION_DOWN和ACTION_UP两个动作的时候都执行了一次onTouchEvent(),和之前默认情况多了一次执行,在未消费的情况下只监听到了ACTION_DOWN这个动作,说明如果ACTION_DOWN未消费的话,ACTION_UP也不会消费。
总结
(1) touch事件是由父View向子View传递的,消费的时候是由子View向父View传递的。
(2) 这三个方法执行优先级为dispatchTouchEvent()->onInterceptTouchEvent()->onTouchEvent()。
(3) 父View可以通过onInterceptTouchEvent()防止事件向后传递。
(4) onInterceptTouchEvent()可以将事件拦截在某一层,事件是可以在这一层被消费的;而dispatchTouchEvent()可以组织事件在某一层下发,在这一层无法被消费。
(5) onTouchEvent()中的ACTION_DOWN如果没有被消费,则ACTION_UP也不会被消费。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
解耦神器 —— 统跳协议和Rewrite引擎
题记:天猫App长大了,已经长成了流量以千万计规模的App,当下至少有10个团队在直接维护天猫App。在App长大,团队扩充的过程中解耦是一个永恒的话题,而界面解耦又是App架构的重中之重。 统跳协议是天猫App统一跳转协议,主要负责天猫App界面之间的串联,也就是界面跳转服务。Rewrite引擎是与之配合的一套URL重写引擎,可以通过配置实现重写规则动态化。 历史上的今天 统跳协议的前身是一套叫做internal的协议,internal要重点解决的问题是在WebView和推送通知中如何跳转到指定的界面,进一步在任何动态场景下如何跳转到指定界面。在这样的思路下,internal中定义了多种协议格式,如:tmall://tmallclient/?{"action":""}internal:url=link:url=tmall://mobile.tmall.com/page/ 几乎每一种场景都有一种格式的协议与之对应。在具体操作过程中这些协议都以URL表现出来。不难看出,这套协议最大的问题在于协议格式异构化严重,且不符合W3C的URL标准。随着App规模的扩大,场景日趋复杂,界面越来越多,...
- 下一篇
Android 模块化开发
目录 一、模块化浅谈 1. Android 模块化开发介绍; 模块化开发思路就是:单独开发每个模块,用集成的方式把他们组合起来,就能拼出一个app。app可以理解成很多功能模块的组合,而且有些功能模块是通用的,必备的,像自动更新,反馈,推送,都可以提炼成模块,和搭积木很像,由一个壳包含很多个模块。 2.Android 模块化开发的好处; 模块升级会单独升级,升级的时候往往不只是增加资源,有时候会去删资源,这样做和其它的模块的资源不掺乎,我用umeng的自动更新sdk时就需要我连着资源一块进来,加进来容易以后不想用umeng的了再挑出去就很费事了。再假如push开始用的百度的后来换成极光的,对app的组合者其实是不关心的,对他影响很小。解耦很好。如果是主力带实习生这种开发的话,核心代码就不用和他们分享,让他们去做独立的功能,做好直接调用就行。以后整理代码,重构什么的都只重构这个模块的代码,他们不会不小心改了核心代码。 二、模块化开发的架构分层 1407686-2a3990b4b781784e.png 1407686-0635652ee1b4040b.png 命名建议: 底层:Librar...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装