`
张江兴
  • 浏览: 122486 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

android触屏事件处理onInterceptTouchEvent

 
阅读更多

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, 后续的事件就被截止了,这样想就很好理解。

  • 大小: 20.2 KB
  • 大小: 48.7 KB
  • 大小: 47 KB
  • 大小: 48.2 KB
分享到:
评论

相关推荐

    android事件2-onInterceptTouchEvent和onTouchEvent调用时序

    在Android开发中,理解和掌握`onInterceptTouchEvent`与`onTouchEvent`的调用时序至关重要,因为它们是实现触摸事件处理的关键。这两个方法都属于Android的触摸事件处理机制,涉及到了ViewGroup与子View之间的事件...

    android触屏事件之activity,view,viewgroup

    在Android开发中,触屏事件处理是用户交互的核心部分,涉及到Activity、View和ViewGroup这三个关键组件。本文将深入探讨这些组件在触屏事件处理中的角色和机制。 首先,我们来理解Activity。Activity是Android应用...

    android中dispatchTouchEvent和onInterceptTouchEvent研究

    总的来说,`dispatchTouchEvent`和`onInterceptTouchEvent`是Android触摸事件处理的核心,它们控制了事件的分发和拦截,为开发者提供了强大的定制能力。通过深入理解这两者,开发者可以更灵活地构建用户交互丰富的...

    android_触摸事件Demo

    4. ACTION_CANCEL:触摸事件被取消,例如手指在触摸屏外的区域抬起,或者系统需要回收资源。 二、触摸事件的分发机制 Android系统中的触摸事件分发机制遵循“父控件优先”的原则,分为三个阶段: ...

    android中触摸事件的分发机制

    四、自定义View的触摸事件处理 在开发自定义View时,可以通过重写`onTouchEvent()`和`onInterceptTouchEvent()`来定制触摸事件的处理方式。例如,如果希望自定义View在手指滑动时改变颜色,可以在`onTouchEvent()`中...

    android之Touch事件处理机制测试

    本文将深入探讨“android之Touch事件处理机制测试”,包括滑动事件冲突的解决、ViewGroup中的事件触发和传递机制。 一、Android Touch事件处理机制 1. 触摸事件流程:在Android中,触摸事件分为三个阶段,即ACTION...

    onInterceptTouchEvent

    综上所述,`onInterceptTouchEvent()`是Android触摸事件处理中的一个重要环节,理解和熟练运用它可以极大地提升应用的用户体验和功能多样性。通过深入研究和实践,开发者可以创建出更加灵活且响应式的用户界面。

    Android事件处理机制详解及源码

    在Android系统中,事件处理主要包括触摸事件、键盘事件、广播事件等,这些事件的处理方式直接影响到应用的用户体验和功能实现。下面我们将深入探讨Android事件处理机制的原理及其源码分析。 首先,Android事件处理...

    Android 事件处理机制

    Android事件处理主要包括两种方式:基于监听器(Listener)的事件处理和基于消息队列(Message Queue)的事件处理。本文将深入探讨这两种机制及其在实际开发中的应用。 一、基于监听器的事件处理 1. 视图层次结构...

    onInterceptTouchEvent与OntouchEvent之间

    具体来说,`onInterceptTouchEvent`的事件处理顺序是从ACTION_DOWN开始,因为ACTION_DOWN标志着一个触摸序列的开始。当`onInterceptTouchEvent`接收到ACTION_DOWN时,如果选择拦截(返回`true`),那么后续的ACTION_...

    View的onInterceptTouchEvent(MotionEvent ev)和dispatchTouchEvent(MotionEvent ev) 解析

    总之,`onInterceptTouchEvent(MotionEvent ev)` 和 `dispatchTouchEvent(MotionEvent ev)` 是Android触摸事件处理的核心,它们共同决定了触摸事件如何在视图层次结构中流动。通过合理利用这两个方法,开发者可以...

    自己写的android事件分发拦截处理的代码可以清楚知道事件分发拦截和处理的过程.rar

    综上所述,这个压缩包中的代码可以帮助开发者深入理解Android事件分发的机制,并提供实际的代码示例,以便学习如何拦截和处理触摸事件。不过,由于描述中提到部分代码可能不可用,因此实际使用时可能需要进行调整。...

    android事件分发、拦截、处理的示例代码

    3. **事件处理**:`View`的`onTouchEvent()`方法用于处理具体事件。如果返回`true`,表示事件已被处理,系统不会继续向其他视图分发;如果返回`false`,事件将继续回溯到上层视图。在`onTouchEvent()`中,可以通过对...

    onInterceptTouchEvent和onTouchEvent使用demo

    总之,`onInterceptTouchEvent`和`onTouchEvent`是Android触摸事件处理的核心,它们协同工作,为开发者提供了强大的交互设计能力。通过深入理解并熟练应用这两个方法,开发者能够构建出更加丰富和流畅的用户界面。

    android触摸事件

    总结,Android的触摸事件处理是应用程序与用户交互的核心部分。理解事件的生命周期、分发机制以及如何自定义事件处理,可以帮助开发者构建更加流畅、交互性强的应用程序。在"TouchProject"这个实例中,我们可以学习...

    Android 事件处理机制 demo

    在Android应用开发中,事件处理机制是至关重要的组成部分,它涉及到用户与应用程序的交互,包括点击、滑动等各类操作。本示例"Android 事件处理机制 demo"将深入探讨这一主题,通过实际代码演示如何有效地管理和响应...

    android Touch事件传递机制

    本文将深入探讨Android的触摸事件处理流程,包括事件的产生、分发以及处理过程,以实例的形式帮助开发者理解这一核心概念。 ### 一、事件产生 当用户在屏幕上触摸时,硬件层会生成原始的触控事件(MotionEvent),...

    [android][Android点击事件分发机制分析]

    3. **事件处理**:每个View的`onTouchEvent()`方法负责处理实际的事件。如果`onTouchEvent()`返回true,表示事件已被当前View消费,事件流结束;如果返回false,事件会回溯到上一级View。 4. **ACTION_DOWN与ACTION...

    Android事件分发处理

    在Android系统中,事件分发处理是用户界面交互的核心机制,尤其对于触摸...例如,`ButtonClickEvent`可能是一个用于深入研究按钮点击事件处理的示例,它可以帮助我们更好地理解事件处理在Android应用开发中的实际应用。

Global site tag (gtag.js) - Google Analytics