`

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

阅读更多

 本文源地址:http://www.cnblogs.com/rocky_yi/archive/2011/01/21/1941522.html#

 

onInterceptTouchEvent()用于处理事件并改变事件的传递方向。返回值为false时事件会传递给子控件的onInterceptTouchEvent();返回值为true时事件会传递给当前控件的onTouchEvent(),而不在传递给子控件,这就是所谓的Intercept(截断)

onTouchEvent() 用于处理事件,返回值决定当前控件是否消费(consume)了这个事件。可能你要问是否消费了又区别吗,反正我已经针对事件编写了处理代码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。

<?xml version="1.0" encoding="utf-8"?>
<com.touchstudy.LayoutView1 xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <com.touchstudy.LayoutView2
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center">
       <com.touchstudy.MyTextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv"
            android:text="AB"
            android:textSize="40sp"
            android:textStyle="bold"
            android:background="#FFFFFF"
            android:textColor="#0000FF"/>
   </com.touchstudy.LayoutView2>
</com.touchstudy.LayoutView1>

 

 

在没有重写onInterceptTouchEvent()onTouchEvent()的情况下(他们的返回值都是false), 对上面这个布局,MotionEvent事件的传递顺序如下:

 

 

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

 

 

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

 

      
LayoutView2.onTouchEvent().ACTION_DOWN
会调用LayoutView1.OntnterceptTouchEvent().ACTION_MOVE
如下:

05-25 07:02:44.149: DEBUG/LayoutView1(1820): onInterceptTouchEvent action:ACTION_DOWN
05-25 07:02:44.149: DEBUG/LayoutView2(1820): onInterceptTouchEvent action:ACTION_DOWN
05-25 07:02:44.149: DEBUG/LayoutView2(1820): onTouchEvent action:ACTION_DOWN
05-25 07:02:44.179: DEBUG/LayoutView1(1820): onInterceptTouchEvent action:ACTION_MOVE
05-25 07:02:44.179: DEBUG/LayoutView2(1820): onTouchEvent action:ACTION_MOVE
05-25 07:02:44.210: DEBUG/LayoutView1(1820): onInterceptTouchEvent action:ACTION_MOVE
05-25 07:02:44.219: DEBUG/LayoutView2(1820): onTouchEvent action:ACTION_MOVE
05-25 07:02:44.239: DEBUG/LayoutView1(1820): onInterceptTouchEvent action:ACTION_MOVE
05-25 07:02:44.249: DEBUG/LayoutView2(1820): onTouchEvent action:ACTION_MOVE
05-25 07:02:44.269: DEBUG/LayoutView1(1820): onInterceptTouchEvent action:ACTION_MOVE
05-25 07:02:44.279: DEBUG/LayoutView2(1820): onTouchEvent action:ACTION_MOVE
05-25 07:02:44.299: DEBUG/LayoutView1(1820): onInterceptTouchEvent action:ACTION_MOVE
05-25 07:02:44.299: DEBUG/LayoutView2(1820): onTouchEvent action:ACTION_MOVE
05-25 07:02:44.329: DEBUG/LayoutView1(1820): onInterceptTouchEvent action:ACTION_MOVE
05-25 07:02:44.329: DEBUG/LayoutView2(1820): onTouchEvent action:ACTION_MOVE
05-25 07:02:44.359: DEBUG/LayoutView1(1820): onInterceptTouchEvent action:ACTION_MOVE
05-25 07:02:44.359: DEBUG/LayoutView2(1820): onTouchEvent action:ACTION_MOVE
05-25 07:02:44.379: DEBUG/LayoutView1(1820): onInterceptTouchEvent action:ACTION_MOVE
05-25 07:02:44.389: DEBUG/LayoutView2(1820): onTouchEvent action:ACTION_MOVE
05-25 07:02:44.389: DEBUG/LayoutView1(1820): onInterceptTouchEvent action:ACTION_UP
05-25 07:02:44.399: DEBUG/LayoutView2(1820): onTouchEvent action:ACTION_UP

 

 

SDK给出的说明:

·  You will receive the down event here.

·  The down event will be handled either by a child of this view group, or given to your own onTouchEvent() method to handle; this means you should implement onTouchEvent() to return true, so you will continue to see the rest of the gesture (instead of looking for a parent view to handle it). Also, by returning true from onTouchEvent(), you will not receive any following events in onInterceptTouchEvent() and all touch processing must happen in onTouchEvent() like normal.

·  For as long as you return false from this function, each following event (up to and including the final up) will be delivered first here and then to the target's onTouchEvent().

·  If you return true from here, you will not receive any following events: the target view will receive the same event but with the action ACTION_CANCEL, and all further events will be delivered to your onTouchEvent() method and no longer appear here.

 

来自http://hi.baidu.com/j_fo/blog/item/7321c91324203437dc54017d.html

总结:

onInterceptTouchEvent()说的是是否允许Touch事件继续向下(子控件)传递,一但返回True,则向下传递之路被截断(所有子控件将没有机会参与Touch事件);

onTouchEvent()说的是当前控件在处理完Touch事件后,是否还允许Touch事件继续向上(父控件)传递,一但返回True,则父控件不用操心,由自己来处理Touch事件。

 

实例见附件:

  • 大小: 12.8 KB
  • 大小: 12.4 KB
  • 大小: 13.3 KB
  • 大小: 14.7 KB
分享到:
评论
2 楼 WH_Always 2011-11-16  
demo不能运行啊。。。。。
1 楼 WH_Always 2011-11-16  
 

相关推荐

    onInterceptTouchEvent和onTouchEvent调用关系详解

    理解并掌握`onInterceptTouchEvent`和`onTouchEvent`的调用关系,可以帮助开发者更灵活地控制触摸事件的流向,实现复杂的手势识别和用户界面交互。在实际开发中,我们可以通过重写这两个方法,为自定义View或...

    onInterceptTouchEvent和onTouchEvent使用demo

    `onInterceptTouchEvent`和`onTouchEvent`是两个至关重要的方法,它们共同构成了Android视图层次结构中的触摸事件分发机制。下面我们将深入探讨这两个方法的用法及其在实际开发中的应用场景。 1. `...

    onInterceptTouchEvent和onTouchEvent学习

    2. 若ViewGroup不拦截ACTION_DOWN(返回`false`),事件将传递给子View,子View的`onTouchEvent`会被调用,处理ACTION_DOWN。 3. 如果在后续的ACTION_MOVE或ACTION_UP事件中,ViewGroup想要拦截事件,它可以在`...

    onInterceptTouchEvent与OntouchEvent之间

    `onInterceptTouchEvent`和`onTouchEvent`是两个关键的方法,它们共同构成了Android事件分发机制的核心。 `onInterceptTouchEvent`方法在ViewGroup中定义,它的主要作用是拦截事件流,即决定事件是否由父视图处理,...

    Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解

    本文将深入探讨Android事件模型,特别是`onTouchEvent`和`interceptTouchEvent`的关系,帮助开发者更好地理解这两个方法如何协同工作以实现复杂的触摸事件处理。 首先,Android事件模型基于触摸事件的分发机制,它...

    onTouchEvent 、onInterceptTouchEvent的顺序~

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

    Android中touch事件传递测试demo

    onInterceptTouchEvent和onTouchEvent调用时序详解 测试demo 详细介绍请移步:http://blog.csdn.net/yiranxinshou/article/details/9201833

    android-sticky-viewpagerAndroid 源代码

    开发者通常会遇到的问题是,当试图添加自定义的滑动行为时,需要处理复杂的触摸事件监听(`onTouchEvent`)和事件分发(`onInterceptTouchEvent`),这可能导致性能下降,影响用户体验。而这个库则优化了这一过程,...

    浅谈Android onTouchEvent 与 onInterceptTouchEvent的区别详解

    在Android开发中,触摸事件的处理是用户交互的基础,而`onTouchEvent`和`onInterceptTouchEvent`则是处理这些事件的关键方法。这篇文章将深入解析这两个方法的区别和它们在触摸事件处理链中的作用。 首先,`...

    android中dispatchTouchEvent和onInterceptTouchEvent研究

    `dispatchTouchEvent`和`onInterceptTouchEvent`是Android组件处理触摸事件的关键方法,它们在View和ViewGroup之间协同工作,决定了事件如何被分发和拦截。这篇文章将深入探讨这两个方法的工作原理,以及它们如何...

    android 事件传递demo

    Android的触摸事件分发分为三个阶段:dispatchTouchEvent()、onTouchEvent()和onInterceptTouchEvent()。 - dispatchTouchEvent(): 当触摸事件到达一个ViewGroup时,系统首先调用该方法,然后决定是否将事件分发给...

    android事件派发验证demo

    - ACTION_DOWN:事件开始,首先调用ViewGroup的dispatchTouchEvent(),然后可能调用到子View的onInterceptTouchEvent()或onTouchEvent()。 - ACTION_UP/ACTION_CANCEL:事件结束,通常在ACTION_DOWN之后发生,视...

    android-sliding-layer-lib-master.rar

    例如,`onInterceptTouchEvent`和`onTouchEvent`方法是处理滑动事件的关键,而`open()`和`close()`方法则负责滑动层的展开和收起。 此外,该库还支持自定义视图,这意味着开发者可以根据自己的需求添加任意复杂的...

    android-image-slide图片加载和滑动特效.rar

    例如,自定义一个ScrollView并重写onInterceptTouchEvent和onTouchEvent方法,可以实现手势检测和滑动处理。 在实际项目中,为了实现图片加载和滑动特效的无缝结合,可能会在PagerAdapter(ViewPager的适配器)中...

    安卓onTouchEvent上下左右滑动事件

    为了实现上下左右滑动,我们需要在`onTouchEvent`中捕获ACTION_DOWN和ACTION_MOVE事件,并记录初始触点位置和后续移动的位置。以下是关键步骤: 1. **初始化状态**:在ACTION_DOWN事件中,获取当前触摸点的坐标(x1...

    下拉上拉刷新Android-PullToRefresh-1.2.1.zip

    PullToRefresh库通过覆写ViewGroup的onInterceptTouchEvent和onTouchEvent方法,捕获并处理滑动事件。当用户下拉到一定距离时,显示刷新指示器,并启动刷新逻辑。同样,上拉加载更多也是监听上拉手势,触发加载新...

    Android 事件分发机制视频讲解

    Android中的事件主要包括触摸事件和按键事件等,这些事件的分发遵循一定的层次结构。当一个事件发生时,如触摸屏幕或按下某个键,该事件首先会被传递给WindowManagerService(窗口管理服务),然后由...

    Android-传统事件捕获和冒泡的流程解析

    本文将深入解析Android中事件捕获和冒泡的流程,帮助开发者更好地理解和运用这一机制。 事件在Android中主要通过View和 ViewGroup对象进行传递。当用户在屏幕上触摸或点击时,系统会生成一个事件对象,如...

    android事件分发流程

    当一个触摸事件发生时,Android系统会按照特定的顺序进行事件分发,这个过程可以概括为“传递”和“消耗”两个阶段。 1. **事件传递**: - **Activity**: 事件首先由系统发送到最顶层的Activity,Activity通过`...

Global site tag (gtag.js) - Google Analytics