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

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

注意:不是所有的View的子类,很多教程都说的是所有的View的子类,只有可以向里面添加View的控件才需要分发,比如TextView它本身就是最小的view了,所以不用再向它的子视图分发了,它也没有子视图了,所以它没有dispatch和Intercept,只有touchEvent。

onInterceptTouchEvent(MotionEvent ev)方法是GroupView控件中特有的一个方法,我们可以实现这个方法来截获所有的窗口点击事件来根据事件的不同来对子控件或自身分发事件触发。覆盖这个方法时需要小心注意,因为它和View.onTouchEvent(MotionEvent)有着复杂的关系,我们使用是需要和View.onTouchEvent(MotionEvent)一同实现来达到正确的结果,事件触发顺序如下:

  1.你首先会在该方法中得到一个down事件。

2.这个down事件会被得到处理,要么在这个GroupView中子控件的onTouchEvent()方法中,要么在GroupView自身的onTouchEvent()方法中。当我们在onTouchEvent()方法返回值中返回true的话,将会继续看到后续的触发事件(move、up等),要注意的是当我们在GroupView的onTouchEvent()事件返回值中返回false的话,该方法将不再捕获后续的(move up)事件。

  3.如果在该方法返回值中返回false,down事件将根据控件树结构从根节点向目标子控件的onTouchEvent()方法分发。

  4.如果在该方法返回值中返回true,那么你的子控件将获取不到任何点击事件。

为证明上面所说的顺序特点,下面通过测试代码来观察观察:

public class MainActivity extends Activity {Group1 group1;Group2 group2;MyTextView myTv;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//--group1//----|//-------group2//---------|//------------myTv
         group1 = new Group1(this);group2 = new Group2(this);myTv = new MyTextView(this);group2.addView(myTv, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));group1.addView(group2, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));setContentView(group1);}}

分别重写Group1和Group2的onInterceptTouchEvent和onTouchEvent方法,重写MyTextView的onTouchEvent方法,最终得到的控件层次结构如下:  

1.在默认返回值情况下logcat输出如下:

测试后可知默认情况下和所有方法返回值为false的结果一致,down事件的捕获顺序onInterceptTouchEvent先于onTouchEvent,由于onTouchEvent返回值为false,down事件没被消化,后续的move和up事件没有出现,同时逆序返回到父控件的onTouchEvent方法来捕获,如下图所示:  

2.所有onTouchEvent返回值为true情况下logcat输出如下:

输出结果可以看出子控件MyTextView消化了down事件,后续的move和up事件正常捕获,由于down事件被消化,上层的onTouchEvent方法不执行,如下图所示:(三箭头分别指down、move、up事件)

既然如此,如果MyTextView中onTouchEvent方法返回为false,而group1和group2的onTouchEvent方法返回true的结果自然也就如下图的顺序了:

测试输出结果证明了这一猜测顺序,  

3.当某个GroupView中的onInterceptTouchEvent方法返回值为true情况下logcat输出如下(如group2):

如果在该方法返回值中返回true,那么子控件将获取不到任何点击事件,转而向自身的onTouchEvent方法转发,如下图所示:

如果onTouchEvent方法返回值都为true,那么根据规律结果就如下图顺序触发:  

最后logcat的结果证实了这一猜测, 

根据这一顺序规律我们便可复写GroupView中的onInterceptTouchEvent来控制事件的响应者。

我是天王盖地虎的分割线           




本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3907743.html,如需转载请自行联系原作者

Android -- TouchEvent的分发和截获方式相关推荐

  1. 完全理解Android TouchEvent事件分发机制(一)

    本文能给你带来和解决一些你模糊的Touch事件概念及用法 1.掌握View及ViewGroup的TouchEvent事件分发机制 2.为解决View滑动冲突及点击事件消费提供支持 3.为你解决面试中的 ...

  2. 一文读懂Android View事件分发机制

    Android View 虽然不是四大组件,但其并不比四大组件的地位低.而View的核心知识点事件分发机制则是不少刚入门同学的拦路虎.ScrollView嵌套RecyclerView(或者ListVi ...

  3. Android的事件分发

    1. Touch事件和绘制事件的异同之处 Touch事件和绘制事件很类似,都是由ViewRoot派发下来的,但是不同之处在绘制事件是由应用中的某个View发起请求,一层一层上传到ViewRoot,再有 ...

  4. Android 系统(218)---Android的事件分发机制以及滑动冲突的解决

    Android的事件分发机制以及滑动冲突的解决 声明:  本文主要涉及VIew的事件分发与滑动冲突的解决,关于View的事件分发流程的部分内容参考自:  Android事件分发机制详解:史上最全面.最 ...

  5. 国内Android应用推广的六大主流方式

    国内Android应用推广的六大主流方式 http://mobi.baike.com/article-19433.html 随着Android市场份额的飞速增长,越来越多的国内开发团队和公司开始投入A ...

  6. Android Touch事件分发—拦截—处理

    Android Touch事件分发(dispatchTouchEvent)-拦截(onInterceptTouchEvent)-处理(onTouchEvent) 转自:http://www.cnblo ...

  7. android 点击事件消费,Android View事件分发和消费源码简单理解

    Android View事件分发和消费源码简单理解 前言: 开发过程中觉得View事件这块是特别烧脑的,看了好久,才自认为看明白.中间上网查了下singwhatiwanna粉丝的读书笔记,有种茅塞顿开 ...

  8. android ui 最新教程,Android更新UI的五种方式,androidui五种

    Android更新UI的五种方式,androidui五种handler.post activity.runOnUiThread view.post handler+Thread AsyncTask 例 ...

  9. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

最新文章

  1. 随动系统控制c语言源程序,基于DSP的小功率随动系统的控制器设计及优化
  2. php 设置curl不超时时间,curl命令的超时时间
  3. HelloWorld程序的编译运行
  4. nodejs mysql模块_NodeJs使用Mysql模块实现事务处理
  5. 【C#】详解C#异常
  6. 交叉编译中libtool相关的问题
  7. 自动生成一个不存在的人脸照片
  8. 抖音小程序支付开发流程和实现
  9. 中国广电即将放号,感受到压力的中国移动率先推出19元5G套餐
  10. 免费动态域名解析软件dnspod每步nat123体会
  11. 北京业内网友见面会,及其他
  12. sublime3编程c语言,Sublime Text 3 实现C语言代码的编译和运行(示例讲解)
  13. Win 10关机后电源灯不停闪烁的解决办法
  14. Win8或Win8.1下输入法小技巧,个人习惯,可参考
  15. Linux下MySQL基本操作
  16. 学习通信原理之——从实验中理解频谱/功率谱/功率谱密度(MATLAB演示)
  17. UE4 Atmospheric Fog组件问题记录(未解决)
  18. 在可见光波长下用银树突超表面进行微分运算
  19. java实现zip压缩文件 (一)
  20. 手撕系列-AdaBoost

热门文章

  1. python number函数_Python3 数据类型-Number
  2. mysql 搜索标题中字符串_如何在MySQL表中搜索特定字符串?
  3. java基础---serializable的作用
  4. django captcha 验证码插件
  5. 一种缘于积木游戏的思维
  6. mysql集群之MMM简单搭建
  7. HADOOP2单机版
  8. Asp.net 点滴
  9. 移植uboot第五步:支持NORFlash
  10. Sqlserver 游标的写法记录