Android中事件分发机制介绍,该文章主要是针对了解Android事件分发机制的人,旨在提出一些问题,并附上一些理解,就此写下供大家交流,也做一个存档。

ViewGroup中包含三个方法:

public boolean dispatchTouchEvent(MotionEvent ev) 事件分发

public boolean onInterceptTouchEvent(MotionEvent ev) 事件拦截

public boolean onTouchEvent(MotionEventev) 事件响应

View和Activity中包含两个方法:

public boolean dispatchTouchEvent(MotionEvent ev) 事件分发

public boolean onTouchEvent(MotionEventev) 事件响应

方法解释:

public boolean dispatchTouchEvent(MotionEvent ev) 事件分发

return true:事件停止分发,并交给当前控件的onTouchEvent处理

return false:事件继续向子控件分发,知道最内层View停止

public boolean onInterceptTouchEvent(MotionEvent ev) 事件拦截

return true:事件停止分发,并交给当前控件的onTouchEvent处理

return false:事件不进行拦截,dispatchTouchEvent可以继续分发

public boolean onTouchEvent(MotionEventev) 事件响应

return true:事件已经消费,并在该onTouchEvent中进行处理

return false:事件未消费,向父控件的onTouchEvent传递,指导Activity停止

设置布局如下图所示:

当触摸屏幕中的Button时,Activity首先调用dispatchTouchEvent方法,该方法返回false是向子控件分发,返回true交个自身的onTouchEvent处理;

Activity的子控件也做类似的处理,直到最内层的Button,该Button判断事件是否在onTouchEvent中处理,如果该方法返回true表示事件已经被消耗,不再向其父控件的onTouchEvent传递;如果返回false,则将事件传递给其父控件的onTouchEvent方法,然后进行相同的处理。如下图所示:

注意:

1、onInterceptTouchEvent方法是被dispatchTouchEvent方法调用的,作为dispatchTouchEvent的一个判断分支(判断是否拦截事件),如果onInterceptTouchEvent返回true,则交给该控件的onTouchEvent进行处理,否则dispatchTouchEvent继续向子控件分发事件

2、关于onTouch和onTouchEvent的冲突。

a)如果onTouch存在,则onTouch优先于onTouchEvent执行

b)在源码中View中的dispatchTouchEvent方法中对onTouch的执行条件进行了判断;如果条件成立则执行onTouch,否则执行onTouchEvent;但是在ViewGroup中的dispatchTouchEvent方法中并没有类似判断。此处我只能暂时认为只有在View中才会有onTouchonTouchEvent的冲突,而在ViewGroup中没有冲突(个人观点)。此处存在疑问,由于我不愿意再看源码,所以望大家多多指点

3、onTouchEvent和onTouch同时存在的问题,这条纯属个人观点,望大家指点。

由于onTouchEvent中实现了点击、长按等事件,所以必须要存在;而onTouch则可以更多样化处理触摸操作,方便提高用户体验吧

4、关于View中onTouch和onTouchEvent冲突的解决:

a)由于onTouch先于onTouchEvent执行,所以在onTouch方法中的返回值必须是false,只有这样时间才能够传递到onTouchEvent方法中。

b)如果这样的话,onTouch只能处理DOWN事件,对于后续的MOVE和UP,没有办法处理

5、关于onTouch出来捣乱的部分,大家需要多多注意,至于我也没有弄清楚。

参考文献:

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

http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html

Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

http://blog.csdn.net/pi9nc/article/details/9281829

Android:30分钟弄明白Touch事件分发机制

http://www.cnblogs.com/linjzong/p/4191891.html

Android触摸事件分发机制

http://hunankeda110.iteye.com/blog/1944311

android 事件分发机制

http://blog.csdn.net/lanhuzi9999/article/details/26515421

Android手势事件分发过程分析

http://blog.csdn.net/xu_fu/article/details/32937959

Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法

http://blog.csdn.net/jiangwei0910410003/article/details/17504315

更多相关文章

  1. Android查询:模拟键盘鼠标事件(adb shell 实现)
  2. Android(安卓)Activity生命周期
  3. (转载)再谈Android(安卓)AsyncTask
  4. Android(安卓)XML文件解析
  5. Android(安卓)获取汉字拼音
  6. ListView去掉分割线的几种方法
  7. Android(安卓)AccessibilityService 应用之微信抢红包外挂
  8. Android(安卓)VideoView设置静音,Android(安卓)设置VideoView静
  9. Android(安卓)Touch 事件的分发和消费机制

随机推荐

  1. 解决android客户端上传图片到服务端时,图
  2. Android组件学习笔记(自定义设计View,以及
  3. 妙用Fragment轻松实现Android动态权限申
  4. Android调试工具Genymotion的使用
  5. 【Android(安卓)Developers Training】 8
  6. MyEclip1se8.5搭建Android环境
  7. 从Android到IOS,IOS应用生命周期函数
  8. Android(安卓)4.0 SDK 环境搭建体验(Windo
  9. ViewPage滑动加载大图和点击关注效果《IT
  10. Robotium-无源码测试