`
冷暖人间
  • 浏览: 1035 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android中触摸事件传递机制

阅读更多

         本文只讨论由触摸触发的事件,暂不讨论轨迹球等事件。

         以前写 android ,对事件的处理没有太深入,只是简单的 onTouchEvent 、setOnTouchListener就 ok 了,现在写的 UI ,很多自定义组件,父 view 和子view 都需要接收事件,然后处理,这就要求对事件传递机制有一定的了解。

         Android的事件:onClick, onScroll, onFling等等,都是由许多个Touch组成的。其中Touch的第一个状态肯定是 ACTION_DOWN, 表示按下了屏幕, ACTION_MOVE 表示为移动手势 ACTION_UP  表示为离开屏幕 ,本文就着中讨论这三种事件的传递。

         在Android中,有一类控件是中还可以包含其他的子控件,这类控件是继承于ViewGroup类,例如:LinearLayout, RelativeLayout。还有一类控件是不能再包含子控件,例如:TextView,Button。

         本文以LinearLayout中嵌套LinearLayout,LinearLayout中再嵌套TextView的布局来讨论Touch事件传递机制。

            对于ViewGroup类的控件,有一个很重要的方法,就是onInterceptTouchEvent(),用于处理事件并改变事件的传递方向,它的返回值是一个布尔值,决定了Touch事件是否要向它包含的子View继续传递,这个方法是从父View向子View传递。而方法onTouchEvent(),用于接收事件并处理,它的返回值也是一个布尔值,决定了事件及后续事件是否继续向上传递,这个方法是从子View向父View传递。

先来看下布局文件

<?xml version="1.0" encoding="utf-8"?>
<com.slid.slidingdemo.view.OuterTouchLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:contentDescription="outerLayout"
    android:background="#F0F0F0"
    android:orientation="horizontal" >

    <com.slid.slidingdemo.view.TouchLinearLayout
        android:layout_width="fill_parent"
        android:layout_height="300dp"
        android:contentDescription="innerLayout"
        android:background="#A9CDEB"
        android:orientation="horizontal" >

        <com.slid.slidingdemo.view.TouchTextView
            android:id="@+id/preYear"
            android:background="#5994E6"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textColor="#ffffff"
            android:contentDescription="textView"
            android:text="如果在西安遇见你,那么,我们一定要一起去咸阳机场,不坐飞机,也坐不起飞机,只为感受一下机场的豪华,我会偷偷看几眼空姐,然后对你说:“宝贝儿,她们都没有你漂亮”。" />
    </com.slid.slidingdemo.view.TouchLinearLayout>

</com.slid.slidingdemo.view.OuterTouchLinearLayout>

 OuterTouchLinearLayout,TouchLinearLayout分别重写了onInterceptTouchEvent、onTouchEvent,TouchTextView重写了onTouchEvent,并在Activity里重写了dispatchTouchEvent,onTouchEvent,在其中加入了打印代码,在此偷个懒,少打点字,以A代替Activity,以O代表外层(父)OuterTouchLinearLayout,I代表TouchLinearLayout,T代表 TouchTextView,d代表 dispatchTouchEvent,t代表onTouchEvent,i代表onInterceptTouchEvent。(如Ad代表触发了Activity的dispatchTouchEvent方法

        在TextView上划屏下,记录结果,并分别改变重写方法的返回值,得到如下结果集

测试结果
1、默认
0 ad-oi-ii-tt-it-ot-at 2 ad-at-ad-at 1 ad-at

2、a d
0 ad 2 ad-ad-ad 1 ad

3、ad at
0 ad 2 ad-ad-ad 1 ad

4、at
0 ad-oi-ii-tt-it-ot-at 2 ad-at-ad-at 1 ad-at

5、oi
0 ad-oi-ot-at 2 ad-at-ad-at 1 ad-at

6 oi ot
0 ad-oi-ot 2 ad-ot-ad-ot 1 ad-ot

7 ot
0 ad-oi-ii-tt-it-ot 2 ad-ot-ad-ot 1 ad-ot

8 ii
0 ad-oi-ii-it-ot-at 2 ad-at-ad-at 1 ad-at

9 ii it
0 ad-oi-ii-it 2 ad-oi-it-ad-oi-it 1 ad-oi-it

10 it
0 ad-oi-ii-tt-it 2 ad-oi-it 1 ad-oi-it

11 tt
0 ad-oi-ii-tt 2 ad-oi-ii-tt 1 ad-oi-ii-tt

 分析这些结果,可以得出结论:

 

        ACTION_DOWN事件首先会传到Activity的dispatchTouchEvent中,若返回false,则事件传递到ViewGroup类的onInterceptTouchEvent,onInterceptTouchEvent如果返回false,则DOWN事件继续向子ViewGroup类的onInterceptTouchEvent传递,如果子View不是ViewGroup类的控件,则传递给子View的onTouchEvent。

 

            另外:只要onInterceptTouchEvent()返回false,而且目标控件View::onTouchEvent()返回true,那么事件的每一个动作(按下、移动、抬起等)会都会首先传递到onInterceptTouchEvent()中。

 

        如果onInterceptTouchEvent返回了true,则DOWN事件传递给VIewGroup的onTouchEvent,不再继续传递,并且之后的后续事件也都传递给它的onTouchEvent。

 

        如果某View的onTouchEvent返回了false,则DOWN事件继续向其父ViewGroup类的onTouchEvent传递;如果返回了true,则后续事件会直接传递给其onTouchEvent继续处理。(后续事件只会传递给对于必要事件ACTION_DOWN返回了true的onTouchEvent)

 

 

 

Activity的onTouchEvent方法是事件最后被处理的地方。如果不处理,系统将抛弃这个事件。暂时没有发现这个方法的返回值对程序有什么意义。我觉得可以这样理解,就如我们说话给别人听,当所有需要听到的人听到这句话了,那这句话就完成了它的意义,在这之后不管又传了多远,还是被墙壁吸收了,都没啥影响。

 

 

分享到:
评论

相关推荐

    极致:android触摸事件传递机制

    android触摸事件传递机制图文详解,自认为最简略最完善的流程图!

    android中触摸事件的分发机制

    总结,Android触摸事件的分发机制是Android UI交互的基础,理解这一机制有助于开发者更有效地控制视图的行为,创建出更加丰富的用户界面。在实际开发中,可以通过灵活运用`onTouchEvent()`和`onInterceptTouchEvent...

    《Android高级进阶》 第一章 Android 触摸事件传递机制 @DEMO View的事件传递机制

    以后会按标准一个个的写完测试DEMO,一是自我学习,二是方便同样在学习的其他同学这是,本系列代码均来自《Android高级进阶》,经过测试可以运行,这是 第一章 Android 触摸事件传递机制 View的事件传递机制

    Android触摸事件传递机制

    Android触摸事件传递机制图解,这个流程详细的受不鸟!

    Android Touch事件传递机制解析

    在Android系统中,触摸事件是用户与应用交互的重要方式,理解其事件传递机制对于优化UI交互和处理复杂触摸逻辑至关重要。本文将深入解析Android的Touch事件传递机制,并结合源码进行详细阐述。 首先,Android的触摸...

    Android事件传递机制

    在Android系统中,事件传递机制是用户界面交互的核心部分,主要处理用户与屏幕的各种触摸操作。这个机制确保了用户点击屏幕时,相应的视图能够正确地接收到并响应这些事件。我们今天将深入探讨Android的触摸事件...

    android Touch事件传递机制

    在Android系统中,触摸事件(Touch Events)是用户与设备交互的主要方式,它涉及到了复杂的事件传递机制。本文将深入探讨Android的触摸事件处理流程,包括事件的产生、分发以及处理过程,以实例的形式帮助开发者理解...

    android_触摸事件Demo

    在Android开发中,触摸事件是用户与应用交互的基础,它涉及到`MotionEvent`类和触摸事件的处理机制。本教程将深入探讨`android_触摸事件Demo`,帮助开发者理解如何在Android应用程序中处理用户的触摸输入。 一、...

    Android 中触摸事件与点击事件分析

    本篇文章将深入探讨Android中的View事件传递机制、事件消费以及触摸事件和点击事件的区别。 首先,让我们来了解Android的事件传递机制。在Android中,事件(如触摸事件)是从根View开始,沿着View树向下传递的。这...

    android触摸消息传递

    总的来说,理解Android的触摸事件传递机制对于开发交互丰富的应用程序至关重要。掌握`MotionEvent`、`onTouchEvent`和`onInterceptTouchEvent`的用法,可以帮助你创建更加灵活和用户友好的UI,尤其在设计滑动菜单或...

    android事件传递机制

    在Android系统中,事件传递机制是用户界面交互的基础,它涉及到Activity、View、 ViewGroup等组件之间的协同工作。本文将深入探讨这一机制,帮助你理解如何在Android应用中处理触摸事件。 1. 触摸事件的起源 触摸...

    事件传递机制Demo

    在Android开发中,事件传递机制是用户界面交互的核心部分,它决定了用户在屏幕上触摸或点击时,事件如何在各个View之间进行分发。本Demo,"事件传递机制Demo",着重展示了这一机制的工作原理和常见应用场景。我们...

    Android触摸事件传递机制初识

    Android 触摸事件传递机制是 Android 系统中的一项核心机制,它决定了事件如何从 Activity 传递到 View,然后再传递到 ViewGroup 中。理解这个机制是非常重要的,因为它关系到应用程序的交互性和用户体验。 首先,...

    Android onTouch事件传递机制

    本篇文章将深入探讨Android的`onTouch`事件传递机制,帮助开发者更好地理解和运用这一功能。 首先,Android的触摸事件主要由三个基本事件构成:`ACTION_DOWN`、`ACTION_UP`和`ACTION_MOVE`。`ACTION_DOWN`表示手指...

    事件传递机制和原理

    在Android开发过程中,理解事件传递机制对于实现高效的用户交互界面至关重要。本篇文章基于一个关于“事件传递机制和原理”的流程图进行深入解析,旨在帮助开发者更好地掌握事件传递的核心概念与流程。 #### 一、...

    Android点击事件传递分析Demo

    本文将通过"Android点击事件传递分析Demo"深入探讨这一主题,结合示例代码和图表,帮助开发者理解Android中点击事件的传递机制。 首先,Android中的点击事件主要由四个基本的触摸事件构成:ACTION_DOWN(手指触摸...

    android 事件传递机制dome

    在Android开发中,事件传递机制是一个非常重要的概念,它涉及到用户与应用界面的交互。标题“android 事件传递机制dome”表明我们将深入探讨这一机制,并通过实例(dome,通常指的是示例代码)来理解其工作原理。...

Global site tag (gtag.js) - Google Analytics