转自: 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 布局如下:

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事件的传递顺序如下:

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

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

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

更多相关文章

  1. Android(安卓)studio实现按钮的点击事件
  2. android 同一个TextView不同文字的点击事件
  3. Android中点击事件之FocusChangedListener实现步骤
  4. Android(安卓)图片选择器
  5. 安卓 跳转淘宝、京东app,并打开商品详情页
  6. android XML解析
  7. Android实现“退出确认”对话框
  8. Android(安卓)Activity生命周期
  9. Android(Java)正则表达式判断手机号、邮箱、身份证号码、密码、Url

随机推荐

  1. Android性能优化——优化下载以高效地访
  2. Android的加载动画AVLoadingIndicatorVie
  3. Android(安卓)8.1 MTK6739平台客制化修改
  4. android NoticificationManager状态栏操
  5. android实现简单计算器功能
  6. IntentService解析
  7. ANDROID 一键搞定JNI创建C头文件
  8. Android返回键的捕捉与完全退出
  9. Android中ViewPager的简单使用(底部圆点)
  10. Android(安卓)self_adaption of screen