本系列文章均为A2BGeek原创,转载务必在明显处注明:
转载自A2BGeek的【Android每周专题】系列,原文链接:http://blog.csdn.net/benbmw2008/article/details/11143893

每个专题的实验代码会在文章的最后放上下载链接!下面开始第一个专题——触摸屏事件。

Android系统的用户事件有触屏事件和按键事件,今天的重点放在触屏事件上,先来看一下实验代码的结构:

布局如下:

<com.example.gesturedemo.MyRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <com.example.gesturedemo.MyTextView
android:id="@+id/tv"
android:layout_width="200dip"
android:layout_height="200dip"
android:layout_centerInParent="true"
android:background="#33B5E5"
android:gravity="center"
android:text="@string/hello_world" /> </com.example.gesturedemo.MyRelativeLayout>

样子大概就是这样的:

其中布局文件中的MyRelativeLayout和MyTextView也没有什么特别的,只是实现了和事件分发有关的几个回调方法——dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent。在MainActivity中也实现了dispatchTouchEvent和onTouchEvent。好了,该说明的都说明了,下面实验开始,如果对代码还是不清楚的话可以先下载代码再结合代码来看文章。

实验1——点击一下蓝色区域:

得到日志如下:

09-05 15:42:25.054: V/gesturedemo(25782): MainActivity--->dispatchTouchEvent
09-05 15:42:25.054: V/gesturedemo(25782): MyRelativeLayout--->dispatchTouchEvent
09-05 15:42:25.054: V/gesturedemo(25782): MyRelativeLayout--->onInterceptTouchEvent
09-05 15:42:25.054: V/gesturedemo(25782): MyTextView--->dispatchTouchEvent
09-05 15:42:25.054: V/gesturedemo(25782): MyTextView--->onTouchEvent
09-05 15:42:25.054: V/gesturedemo(25782): MyRelativeLayout--->onTouchEvent
09-05 15:42:25.054: V/gesturedemo(25782): MainActivity--->onTouchEvent
09-05 15:42:25.085: V/gesturedemo(25782): MainActivity--->dispatchTouchEvent
09-05 15:42:25.085: V/gesturedemo(25782): MainActivity--->onTouchEvent

实验2——点击一下蓝色区域周围的白色区域:

得到日志如下:

09-05 15:43:37.875: V/gesturedemo(25782): MainActivity--->dispatchTouchEvent
09-05 15:43:37.875: V/gesturedemo(25782): MyRelativeLayout--->dispatchTouchEvent
09-05 15:43:37.875: V/gesturedemo(25782): MyRelativeLayout--->onInterceptTouchEvent
09-05 15:43:37.875: V/gesturedemo(25782): MyRelativeLayout--->onTouchEvent
09-05 15:43:37.875: V/gesturedemo(25782): MainActivity--->onTouchEvent
09-05 15:43:37.945: V/gesturedemo(25782): MainActivity--->dispatchTouchEvent
09-05 15:43:37.945: V/gesturedemo(25782): MainActivity--->onTouchEvent

做了两个实验之后我们观察现象,总结规律:

当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View,也就是MyRelativeLayout,TouchEvent最先到达最顶层view的dispatchTouchEvent ,然后由dispatchTouchEvent方法进行分发,如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回false ,则交给这个view的 interceptTouchEvent方法来决定是否要拦截这个事件,如果interceptTouchEvent返回 true ,也就是拦截掉了,则交给它的onTouchEvent来处理,如果interceptTouchEvent返回false ,那么就传递给子view ,由子view的dispatchTouchEvent再来开始这个事件的分发。如果事件传递到某一层的子view的onTouchEvent上了,这个方法返回了false ,那么这个事件会从这个view往上传递,都是onTouchEvent 来接收。而如果传递到最上面的onTouchEvent也返回false的话,这个事件就会“消失”,也就是由activity的onTouchEvent来处理了。

规律对于第一次接触触屏事件的人来说有的复杂,我画张图来说明一下:

默认情况下每个和触屏事件相关的回调方法都返回false,导致如下的事件流向,这个也是符合前面总结的规律的。在down事件沿着默认事件流向走到activity的onTouchEvent方法后,如果你在触屏上做的是一个fling操作,那么后序的move和up操作是不会沿着这个默认路径的,而是直接到达activity的onTouchEvent。从日志就能看出来:

09-05 16:16:36.867: V/gesturedemo(27973): MainActivity--->dispatchTouchEvent
09-05 16:16:36.871: V/gesturedemo(27973): MyRelativeLayout--->dispatchTouchEvent
09-05 16:16:36.875: V/gesturedemo(27973): MyRelativeLayout--->onInterceptTouchEvent
09-05 16:16:36.878: V/gesturedemo(27973): MyTextView--->dispatchTouchEvent
09-05 16:16:36.890: V/gesturedemo(27973): MyTextView--->onTouchEvent
09-05 16:16:36.890: V/gesturedemo(27973): MyTextView--->onTouchEvent--->DOWN
09-05 16:16:36.894: V/gesturedemo(27973): MyRelativeLayout--->onTouchEvent
09-05 16:16:36.898: V/gesturedemo(27973): MainActivity--->onTouchEvent
09-05 16:16:36.902: V/gesturedemo(27973): MainActivity--->onTouchEvent--->DOWN
09-05 16:16:37.007: V/gesturedemo(27973): MainActivity--->dispatchTouchEvent
09-05 16:16:37.007: V/gesturedemo(27973): MainActivity--->onTouchEvent
09-05 16:16:37.011: V/gesturedemo(27973): MainActivity--->onTouchEvent--->MOVE
09-05 16:16:37.027: V/gesturedemo(27973): MainActivity--->dispatchTouchEvent
09-05 16:16:37.027: V/gesturedemo(27973): MainActivity--->onTouchEvent
09-05 16:16:37.027: V/gesturedemo(27973): MainActivity--->onTouchEvent--->MOVE
09-05 16:16:37.043: V/gesturedemo(27973): MainActivity--->dispatchTouchEvent
09-05 16:16:37.043: V/gesturedemo(27973): MainActivity--->onTouchEvent
09-05 16:16:37.046: V/gesturedemo(27973): MainActivity--->onTouchEvent--->MOVE
09-05 16:16:37.066: V/gesturedemo(27973): MainActivity--->dispatchTouchEvent
09-05 16:16:37.066: V/gesturedemo(27973): MainActivity--->onTouchEvent
09-05 16:16:37.070: V/gesturedemo(27973): MainActivity--->onTouchEvent--->UP

这种是MyTextView的onTouchEvent返回true的情况,如果你做了一个fling操作,down、move、up事件都会沿着这条路径到达MyTextView。

看一下日志会更加清楚:

09-05 16:28:09.691: V/gesturedemo(28611): MainActivity--->dispatchTouchEvent
09-05 16:28:09.695: V/gesturedemo(28611): MyRelativeLayout--->dispatchTouchEvent
09-05 16:28:09.699: V/gesturedemo(28611): MyRelativeLayout--->onInterceptTouchEvent
09-05 16:28:09.699: V/gesturedemo(28611): MyTextView--->dispatchTouchEvent
09-05 16:28:09.703: V/gesturedemo(28611): MyTextView--->onTouchEvent
09-05 16:28:09.703: V/gesturedemo(28611): MyTextView--->onTouchEvent--->DOWN
09-05 16:28:09.750: V/gesturedemo(28611): MainActivity--->dispatchTouchEvent
09-05 16:28:09.750: V/gesturedemo(28611): MyRelativeLayout--->dispatchTouchEvent
09-05 16:28:09.750: V/gesturedemo(28611): MyRelativeLayout--->onInterceptTouchEvent
09-05 16:28:09.753: V/gesturedemo(28611): MyTextView--->dispatchTouchEvent
09-05 16:28:09.753: V/gesturedemo(28611): MyTextView--->onTouchEvent
09-05 16:28:09.757: V/gesturedemo(28611): MyTextView--->onTouchEvent--->MOVE
09-05 16:28:09.765: V/gesturedemo(28611): MainActivity--->dispatchTouchEvent
09-05 16:28:09.769: V/gesturedemo(28611): MyRelativeLayout--->dispatchTouchEvent
09-05 16:28:09.769: V/gesturedemo(28611): MyRelativeLayout--->onInterceptTouchEvent
09-05 16:28:09.769: V/gesturedemo(28611): MyTextView--->dispatchTouchEvent
09-05 16:28:09.769: V/gesturedemo(28611): MyTextView--->onTouchEvent
09-05 16:28:09.769: V/gesturedemo(28611): MyTextView--->onTouchEvent--->MOVE
09-05 16:28:09.785: V/gesturedemo(28611): MainActivity--->dispatchTouchEvent
09-05 16:28:09.785: V/gesturedemo(28611): MyRelativeLayout--->dispatchTouchEvent
09-05 16:28:09.785: V/gesturedemo(28611): MyRelativeLayout--->onInterceptTouchEvent
09-05 16:28:09.785: V/gesturedemo(28611): MyTextView--->dispatchTouchEvent
09-05 16:28:09.785: V/gesturedemo(28611): MyTextView--->onTouchEvent
09-05 16:28:09.785: V/gesturedemo(28611): MyTextView--->onTouchEvent--->MOVE
09-05 16:28:09.808: V/gesturedemo(28611): MainActivity--->dispatchTouchEvent
09-05 16:28:09.808: V/gesturedemo(28611): MyRelativeLayout--->dispatchTouchEvent
09-05 16:28:09.808: V/gesturedemo(28611): MyRelativeLayout--->onInterceptTouchEvent
09-05 16:28:09.812: V/gesturedemo(28611): MyTextView--->dispatchTouchEvent
09-05 16:28:09.812: V/gesturedemo(28611): MyTextView--->onTouchEvent
09-05 16:28:09.812: V/gesturedemo(28611): MyTextView--->onTouchEvent--->UP

好了,关于触摸屏事件我觉得讲到这里已经没什么可以讲了,大家结合实验代码自己练习一下就可以了,规律掌握之后剩下的就需要机智的读者自己灵活运用了。

顺便预告一下,本周会更新两篇博客,下一篇是有关手势方面的。

实验代码点击下载

参考文献:

http://blog.csdn.net/stonecao/article/details/6759189

【Android每周专题】触摸屏事件的更多相关文章

  1. Android 手势&amp;触摸事件 MotionEvent

    1.http://blog.csdn.net/omg_2012/article/details/7881443 这篇相当好啊 2.http://blog.csdn.net/android_tutor/ ...

  2. Android Graphics专题(1)--- Canvas基础

    作为Android Graphics专题的开篇.毫无疑问,我们将讨论Android UI技术的核心概念--Canvas. Canvas是Android UI框架的基础,在Android的控件体系中.全 ...

  3. Android 屏幕实现水龙头事件

    在android下,事件的发生是在监听器下进行,android系统能够响应按键事件和触摸屏事件.事件说明例如以下: onClick(View v)一个普通的点击button事件 boolean onK ...

  4. 基于回调的事件处理——重写onTouchEvent方法响应触摸屏事件

    对于Android提供的事件处理模型,不难发现基于监听的事件处理模型具有更大的优势: 基于监听的事件模型分工更加明确,事件源.事件监听有两个类分开实现,因此具有更好的维护性. Android的事件处理 ...

  5. Android学习之触点事件的处理

    知识点: 1. Android开发中的运动事件:触摸屏(TouchScreen)和滚动球(TrackBall) 2.对运动事件的处理:MotionEvent 3.触摸时必发的三个MotionEvent ...

  6. Android中的Touch事件

    Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...

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

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

  8. Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)

    http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零 ...

  9. Android开发系列之事件拦截机制

    对于Android开发者来说理解事件传递机制的重要性,我想应该是不言而喻的.在一个Activity里面,我们经常会重写onTouchEvent事件,可是重写结束之后,对于是返回true还是返回fals ...

随机推荐

  1. C语言指针和数组知识总结(上)

    C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是:  %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...

  2. Qt显示调用vs中的dll

    网上看到很多文章写调用vc的dll,但我尝试了总是出问题,下面结合参考别人的文章,实现了Qt显示调用vs中c接口的dll. 具体直接上代码: vs中的代码: TMax.h: #ifdef TMAX # ...

  3. Axure自动备份功能!让意外不在可怕!

    忘记保存了......... 电脑意外重启了............... 不小心删除了.......................... 每次做axure的时候,多有了太多的意外了! 萧何今天在微 ...

  4. spring 整合redis

    用的是最新的jedis-2.6.2.jar这个包,这个和以前的有点不同.还需要添加spring-data-redis-1.2.1.RELEASE.jar和commons-pool2-2.3.jar. ...

  5. UVA11552------FEWEST FLOPS------区间型的DP

    题目地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  6. poj 2777 Count Color(线段树区区+染色问题)

    题目链接:  poj 2777 Count Color 题目大意:  给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C  a  b  c 把区间[a,b]涂为c色,P  a  b 查 ...

  7. js实现表格的选中一行-------Day58

    最開始想很多其它的用js来动态操作表格,是由于在应用了easyUI之后,发现直接写一个<table id="tt"></table>,这就够了,界面里面就剩 ...

  8. hdu4708

    Rotation Lock Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  9. Swift - 给游戏添加背景音乐和音效(SpriteKit游戏开发)

    游戏少不了背景音乐和音效.下面我们通过创建一个管理音效的类,来实现背景音乐的播放,同时点击屏幕可以播放相应的音效. 声音管理类 SoundManager.swift 1 2 3 4 5 6 7 8 9 ...

  10. S3C6410 纯粹的裸机启动,自己写的SD BOOT启动

    这几天晚上一直折腾S3C6410的裸机SD卡启动,不大想使用UBOOT,我是搞硬件的,对底层非常感兴趣,不喜欢已经写好的,因此自己一直在尝试,其实很早之前就试过SD卡启动,也就是ARM11上电后会把S ...