Android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。
一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP
当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底是ViewGroup来处理Touch事件,还是子view来处理Touch事件呢?我只能很肯定的对你说不一定。呵呵,为什么呢?看看下面我的调查结果你就明白了。
android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法:
1)public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent 2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent 3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
事件传递的两种方式:
    隧道方式:从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递。
    冒泡方式:从最内层子元素依次往外传递直到根元素或在中间某一元素中由于某一条件停止传递。

当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由 dispatchTouchEvent 方法进行分发,如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回 false ,则交给这个 view 的 interceptTouchEvent 方法来决定是否要拦截这个事件,如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。如果事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而如果传递到最上面的 onTouchEvent 也返回 false 的话,这个事件就会“消失”,而且接收不到下一次事件。
总结一下: dispatchTouchEvent() 和onInterceptTouchEvent() 是隧道方式从上往下.       onTouchEvent()是冒泡方式,从下往上.
文字说明不太清楚, 下边来个例子说明一下:

上图中总共有两个GrouView: Layout1, Layout2.  它们具有 onInterceptTouchEvent(). 还有一个View, 没有onInterceptTouchEvent 这里为了方便说明,给它们进行了编号. 见图上所示. 好了, 下面来说一说事件流向: 1. 当没有打断的情况下. 即 这图上的两个 onInterceptTouchEvent()和 三个onTouchEvent() 均返回false.   1.1 -> 2.1 -> 3 -> 2.2 -> 1.2 最后又回到了最上层的Activity. 2. 当 2.1 返回 true时, 则 事件直接从 1.1 -> 2.2, 根本不经过 2.1 了.   1.1 -> 2.2 3. 无论 2.2 处理与否(即其返回值不论是true或false), 2.2 -> 1.2 均不会执行了.

更多相关文章

  1. Android(安卓)RecyclerView设置点击事件
  2. Android(安卓)EventBus实战
  3. android解析JSON字符串 (最强最简便方法)
  4. Android的键盘事件处理
  5. Activity之间传递 List对象
  6. Android(安卓)自带语音识别功能
  7. 2011.09.14(3)——— android 自定义tabhost的tabs
  8. Android入门(7):活动的启动模式
  9. Android(安卓)手势识别GestureDector

随机推荐

  1. Mono for Android—初体验之“电话拨号器
  2. 关于Android(安卓)Pie(Android(安卓)9.0),你
  3. 全屏、小屏、横屏、竖屏的切换
  4. android listview的divider分割线的宽度
  5. Android Drawable缓存
  6. android之实现ProgressBar进度条组件
  7. Android 隐藏ActionBar
  8. Android 使用WebView控件展示SVG图
  9. 各种控件属性
  10. Android两种序列化方式详解(一):Serializabl