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停止

设置布局如下图所示:

Android事件分发机制和一些疑问_第1张图片

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

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

Android事件分发机制和一些疑问_第2张图片

注意:

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设置任何控件透明度
  2. Android 控件及其属性2
  3. Android查询:模拟键盘鼠标事件(adb shell 实现)
  4. Android VideoView设置静音,Android 设置VideoView静音,Android
  5. Android Touch 事件的分发和消费机制
  6. ListView去掉分割线的几种方法
  7. Android 布局中如何使控件居中
  8. SDK Platform Tools component is missing! Please use the SDK
  9. Android的布局控件----LinearLayout(线性布局)

随机推荐

  1. Android设备定制为永不锁屏
  2. Android(安卓)OpenGL ES(五):GLSurfaceView
  3. 【Android】入门案例(二)——JDBC连接MyS
  4. {转}实现谷歌Android摄像头拍照 2010-06-
  5. [Android]Fragment生命周期
  6. android应用程序跳转到系统的各个设置页
  7. (转) Android的Window类
  8. Android小项目——简单计算器的实现
  9. Android监听WIFI网络的变化并且获得当前
  10. Android使用XML全攻略(1)