`

【转】android触屏事件处理onInterceptTouchEvent的问题

阅读更多



android官方文档有个标准解释,现摘录过来:
首先,看Android的官方文档正解

  onInterceptTouchEvent()与onTouchEvent()的机制:
  1. down事件首先会传递到onInterceptTouchEvent()方法
  2.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之returnfalse,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理
  3.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后returntrue,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
  4.如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理
  5.如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。

仅仅看这个官方文档解释,就能理解清楚这两个函数关系以及用途的绝对是富有经验的framework高手。
否则,一定需要一个案例来阐释。假设我们有这样一个layout,非常典型的

  xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"android:layout_width="fill_parent"  
    android:layout_height="fill_parent">  
      
        android:orientation="vertical"android:layout_width="fill_parent"  
        android:layout_height="fill_parent"android:gravity="center">  
          
            android:layout_width="wrap_content"   android:layout_height="wrap_content"  
      />  
      


用一个示例图来解释这个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代码如下

  publicboolean onInterceptTouchEvent(MotionEvent ev){
        int action = ev.getAction();

        switch(action &MotionEvent.ACTION_MASK){
        caseMotionEvent.ACTION_DOWN:{
 
            if(touchMode == TOUCH_MODE_FLING){
                returntrue;  //fling状态,截获touch,因为在滑动状态,不让子view处理
            }
            break;
        }

        caseMotionEvent.ACTION_MOVE:{
            switch(mTouchMode){
            case TOUCH_MODE_DOWN:
                finalint pointerIndex = ev.findPointerIndex(mActivePointerId);
                finalint y =(int) ev.getY(pointerIndex);
                if(startScrollIfNeeded(y - mMotionY)){
                    returntrue;//开始滑动状态,截获touch事件,不让子view处理
                }
                break;
            }
            break;
        }
}



总结:

仅仅通过概览性的官方文档是很难理解onInterceptTouchEvent函数的用途的,只有通过演绎这个抽象的规则,配以图文才能获取这个重要的知识。很显然,默认是返回false,不做截获。返回true之后,事件流的后端控件就没有机会处理touch事件了,把默认的事件流中每个处理函数看作一个节点,这个节点只要返回true, 后续的事件就被截止了,这样想就很好理解。



分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    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系统中的触摸事件分发机制遵循“父控件优先”的原则,分为三个阶段: ...

    onInterceptTouchEvent

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

    android中触摸事件的分发机制

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

    android之Touch事件处理机制测试

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

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

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

    onInterceptTouchEvent与OntouchEvent之间

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

    Android 事件处理机制

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

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

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

    onInterceptTouchEvent和onTouchEvent使用demo

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

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

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

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

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

    Android 事件处理机制 demo

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

    onTouchEvent 、onInterceptTouchEvent的顺序~

    在Android开发中,触摸事件处理是用户界面交互的关键部分,`onTouchEvent` 和 `onInterceptTouchEvent` 是处理这些事件的两个重要方法。本文将深入探讨这两个方法的使用、顺序以及它们在Android事件分发机制中的角色...

    android触摸事件

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

    android Touch事件传递机制

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

    android事件派发验证demo

    在Android开发中,事件处理是UI交互的核心部分。事件派发机制确保了用户与界面的交互能够正确地被处理和响应。本示例"android事件派发验证demo"旨在帮助开发者深入理解并验证这一机制。下面我们将详细探讨Android...

Global site tag (gtag.js) - Google Analytics