android官方文档有个标准解释,现摘录过来:
首先,看Android的官方文档正解
onInterceptTouchEvent()与onTouchEvent()的机制: 1. down事件首先会传递到onInterceptTouchEvent()方法 2. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理 3. 如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。 4. 如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理 5. 如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。
仅仅看这个官方文档解释,就能理解清楚这两个函数关系以及用途的绝对是富有经验的framework高手。
否则,一定需要一个案例来阐释。假设我们有这样一个layout,非常典型的
<com.test.LayoutView1 xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.test.LayoutView2 android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> <com.test.MyTextView android:layout_width="wrap_content" android:layout_height="wrap_content" /> </com.test.LayoutView2> </com.test.LayoutView1>
用一个示例图来解释这个layout:
通常外围的layoutview1,layoutview2,只是布局的容器不需要响应触屏的点击事件,仅仅Mytextview需要相应点击。但这只是一般情况,一些特殊的布局可能外围容器也要响应,甚至不让里面的mytextview去响应。更有特殊的情况是,动态更换响应对象。
那么首先看一下默认的触屏事件的在两个函数之间的传递流程。如下图:
如果仅仅想让MyTextView来响应触屏事件,让MyTextView的OnTouchEvent返回true,那么事件流就变成如下图,可以看到layoutview1,layoutview2已经不能进入OnTouchEvent:
另外一种情况,就是外围容器想独自处理触屏事件,那么就应该在相应的onInterceptTouchEvent函数中返回true,表示要截获触屏事件,比如layoutview1作截获处理,处理流变成如下图:
以此类推,我们可以得到各种具体的情况,整个layout的view类层次中都有机会截获,而且能看出来外围的容器view具有优先截获权。
当我们去做一些相对来讲具有更复杂的触屏交互效果的应用时候,经常需要动态变更touch event的处理对象,比如launcher待机桌面和主菜单(见下图),从滑动屏幕开始到停止滑动过程当中,只有外围的容器view才可以处理touch event,否则就会误点击上面的应用图标或者widget.反之在静止不动的状态下则需要能够响应图标(子view)的touch事件。摘取framework中abslistview代码如下:
public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { if (touchMode == TOUCH_MODE_FLING) { return true; //fling状态,截获touch,因为在滑动状态,不让子view处理 } break; } case MotionEvent.ACTION_MOVE: { switch (mTouchMode) { case TOUCH_MODE_DOWN: final int pointerIndex = ev.findPointerIndex(mActivePointerId); final int y = (int) ev.getY(pointerIndex); if (startScrollIfNeeded(y - mMotionY)) { return true;//开始滑动状态,截获touch事件,不让子view处理 } break; } break; } }
总结:
仅仅通过概览性的官方文档是很难理解onInterceptTouchEvent函数的用途的,只有通过演绎这个抽象的规则,配以图文才能获取这个重要的知识。很显然,默认是返回false,不做截获。返回true之后,事件流的后端控件就没有机会处理touch事件了,把默认的事件流中每个处理函数看作一个节点,这个节点只要返回true, 后续的事件就被截止了,这样想就很好理解。
相关推荐
在Android开发中,理解和掌握`onInterceptTouchEvent`与`onTouchEvent`的调用时序至关重要,因为它们是实现触摸事件处理的关键。这两个方法都属于Android的触摸事件处理机制,涉及到了ViewGroup与子View之间的事件...
在Android开发中,触屏事件处理是用户交互的核心部分,涉及到Activity、View和ViewGroup这三个关键组件。本文将深入探讨这些组件在触屏事件处理中的角色和机制。 首先,我们来理解Activity。Activity是Android应用...
总的来说,`dispatchTouchEvent`和`onInterceptTouchEvent`是Android触摸事件处理的核心,它们控制了事件的分发和拦截,为开发者提供了强大的定制能力。通过深入理解这两者,开发者可以更灵活地构建用户交互丰富的...
4. ACTION_CANCEL:触摸事件被取消,例如手指在触摸屏外的区域抬起,或者系统需要回收资源。 二、触摸事件的分发机制 Android系统中的触摸事件分发机制遵循“父控件优先”的原则,分为三个阶段: ...
四、自定义View的触摸事件处理 在开发自定义View时,可以通过重写`onTouchEvent()`和`onInterceptTouchEvent()`来定制触摸事件的处理方式。例如,如果希望自定义View在手指滑动时改变颜色,可以在`onTouchEvent()`中...
本文将深入探讨“android之Touch事件处理机制测试”,包括滑动事件冲突的解决、ViewGroup中的事件触发和传递机制。 一、Android Touch事件处理机制 1. 触摸事件流程:在Android中,触摸事件分为三个阶段,即ACTION...
综上所述,`onInterceptTouchEvent()`是Android触摸事件处理中的一个重要环节,理解和熟练运用它可以极大地提升应用的用户体验和功能多样性。通过深入研究和实践,开发者可以创建出更加灵活且响应式的用户界面。
在Android系统中,事件处理主要包括触摸事件、键盘事件、广播事件等,这些事件的处理方式直接影响到应用的用户体验和功能实现。下面我们将深入探讨Android事件处理机制的原理及其源码分析。 首先,Android事件处理...
Android事件处理主要包括两种方式:基于监听器(Listener)的事件处理和基于消息队列(Message Queue)的事件处理。本文将深入探讨这两种机制及其在实际开发中的应用。 一、基于监听器的事件处理 1. 视图层次结构...
具体来说,`onInterceptTouchEvent`的事件处理顺序是从ACTION_DOWN开始,因为ACTION_DOWN标志着一个触摸序列的开始。当`onInterceptTouchEvent`接收到ACTION_DOWN时,如果选择拦截(返回`true`),那么后续的ACTION_...
总之,`onInterceptTouchEvent(MotionEvent ev)` 和 `dispatchTouchEvent(MotionEvent ev)` 是Android触摸事件处理的核心,它们共同决定了触摸事件如何在视图层次结构中流动。通过合理利用这两个方法,开发者可以...
综上所述,这个压缩包中的代码可以帮助开发者深入理解Android事件分发的机制,并提供实际的代码示例,以便学习如何拦截和处理触摸事件。不过,由于描述中提到部分代码可能不可用,因此实际使用时可能需要进行调整。...
3. **事件处理**:`View`的`onTouchEvent()`方法用于处理具体事件。如果返回`true`,表示事件已被处理,系统不会继续向其他视图分发;如果返回`false`,事件将继续回溯到上层视图。在`onTouchEvent()`中,可以通过对...
总之,`onInterceptTouchEvent`和`onTouchEvent`是Android触摸事件处理的核心,它们协同工作,为开发者提供了强大的交互设计能力。通过深入理解并熟练应用这两个方法,开发者能够构建出更加丰富和流畅的用户界面。
总结,Android的触摸事件处理是应用程序与用户交互的核心部分。理解事件的生命周期、分发机制以及如何自定义事件处理,可以帮助开发者构建更加流畅、交互性强的应用程序。在"TouchProject"这个实例中,我们可以学习...
在Android应用开发中,事件处理机制是至关重要的组成部分,它涉及到用户与应用程序的交互,包括点击、滑动等各类操作。本示例"Android 事件处理机制 demo"将深入探讨这一主题,通过实际代码演示如何有效地管理和响应...
本文将深入探讨Android的触摸事件处理流程,包括事件的产生、分发以及处理过程,以实例的形式帮助开发者理解这一核心概念。 ### 一、事件产生 当用户在屏幕上触摸时,硬件层会生成原始的触控事件(MotionEvent),...
3. **事件处理**:每个View的`onTouchEvent()`方法负责处理实际的事件。如果`onTouchEvent()`返回true,表示事件已被当前View消费,事件流结束;如果返回false,事件会回溯到上一级View。 4. **ACTION_DOWN与ACTION...
在Android系统中,事件分发处理是用户界面交互的核心机制,尤其对于触摸...例如,`ButtonClickEvent`可能是一个用于深入研究按钮点击事件处理的示例,它可以帮助我们更好地理解事件处理在Android应用开发中的实际应用。