转自: http://www.360doc.com/content/13/0503/16/7857928_282701201.shtml Android onInterceptTouchEven onTouchEvent 事件处理 dispatchTouchEvent

AndroiddispatchTouchEvent,onInterceptTouchEvent, onTouchEvent的理解

android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。
一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP

android的事件处理分为3步。

1)public booleandispatchTouchEvent(MotionEvent ev)这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEventev) 这个方法用来处理TouchEvent

假设当前Activity 布局如下:

Android事件传递机制_第1张图片

dispatchTouchEvent事件分发

当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent 。然后由dispatchTouchEvent 方法进行分发,如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回 false ,则交给这个 view 的 onInterceptTouchEvent方法来决定是否要拦截这个事件,

如果onInterceptTouchEvent返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果onInterceptTouchEvent返回 false ,那么就传递给子 view,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。

如图:

事件拦截:onInterceptTouchEvent

onInterceptTouchEvent用于改变事件的传递方向。决定传递方向的是返回值,返回为false时事件会传递给子控件,返回值为true时事件会传递给当前控件的onTouchEvent(),这就是所谓的Intercept(拦截)。

[tisa ps:正确的使用方法是,在此方法内仅判断事件是否需要拦截,然后返回。即便需要拦截也应该直接返回true,然后由onTouchEvent方法进行处理。]

onTouchEvent用于处理事件,返回值决定当前控件是否消费(consume)了这个事件。尤其对于ACTION_DOWN事件,返回 true,表示我想要处理后续事件(ACTION_MOVE或者ACTION_UP);返回false,表示不关心此事件,并返回由父类进行处理。

在没有重写onInterceptTouchEvent()和onTouchEvent()的情况下(他们的返回值都是false),对上面这个布局,MotionEvent事件的传递顺序如下:

Android事件传递机制_第2张图片

当某个控件的onInterceptTouchEvent()返回值为true时,就会发生截断,事件被传到当前控件的onTouchEvent()。如我们将LayoutView2的onInterceptTouchEvent()返回值为true,则传递流程变成:

Android事件传递机制_第3张图片

如果我们同时将LayoutView2的onInterceptTouchEvent()和onTouchEvent()设置成true,那么 LayoutView2将消费被传递的事件,同时后续事件(如跟着ACTION_DOWN的ACTION_MOVE或者ACTION_UP)会直接传给 LayoutView2的onTouchEvent(),不传给其他任何控件的任何函数。同时传递给子空间一个ACTION_CANCEL事件。传递流程 变成(图中没有画出ACTION_CANCEL事件):

Android事件传递机制_第4张图片

小总结:onInterceptTouchEvent是自rootiew向下传递, onTouchEvent正好相反。

更多相关文章

  1. android:注册时的协议---》方法一:弹出框
  2. android获取屏幕宽高的两种方法
  3. android 同一个TextView不同文字的点击事件
  4. Android studio实现按钮的点击事件
  5. Java如何操作Android的adb shell 之 我自己在程序中的使用方法
  6. Android 控件界面转成Bitmap
  7. Android 改变View位置 setLeft、etRight、setTop、setBottom等在
  8. android:程序中安装APK方法
  9. 关于android Http访问,上传,用了三个方法

随机推荐

  1. 定位原理、模态框以及三列布局
  2. 作业_0706
  3. 前端作业-07-09
  4. 通过canvas作图片缓存
  5. uniapp H5图片上传压缩自动旋转
  6. canvas图片设置crossOrigin属性
  7. 演示文本操作3个功能+演示样式属性操作 3
  8. 模仿京东手机端
  9. jquery $()的参数和选择器
  10. 刘燕酿制美乳霜以实力斩获2021年瑞丽美容