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()。如我们将LayoutView2的onInterceptTouchEvent()返回值为true,则传递流程变成:
如果我们同时将LayoutView2的onInterceptTouchEvent()和onTouchEvent()设置成true,那么LayoutView2将消费被传递的事件,同时后续事件(如跟着ACTION_DOWN的ACTION_MOVE或者ACTION_UP)会直接传给LayoutView2的onTouchEvent(),不传给其他任何控件的任何函数。同时传递给子空间一个ACTION_CANCEL事件。传递流程变成(图中没有画出ACTION_CANCEL事件):
相关推荐
在博客《onTouchEvent 、onInterceptTouchEvent的顺序》中,作者可能详细解释了这两个方法在实际应用中的操作流程: 1. **默认行为**: 当用户触摸屏幕时,事件首先由父视图的 `dispatchTouchEvent` 处理,如果父...
如果在某个父View中`onInterceptTouchEvent`返回`true`,则表示该父View想要拦截并处理这个事件,后续的触摸事件将不再传递给子View。默认情况下,`onInterceptTouchEvent`返回`false`,表示不拦截事件,事件将继续...
这个事件会沿着View树自上而下进行分发,首先是父View,然后是子View,直到某个View消费掉事件或者事件传递回父View。 `onInterceptTouchEvent`是父View( ViewGroup)决定是否拦截子View事件的入口。当一个...
`dispatchTouchEvent` 负责将事件传递给合适的处理者,通常是调用 `onTouchEvent(MotionEvent ev)` 方法。对于ViewGroup,它会根据 `onInterceptTouchEvent` 的结果来决定是否将事件传递给子View,或者自己处理。 ...
例如,我们可以拦截触摸事件来实现滑动切换页面的效果,或者在`ViewGroup`中对特定的触摸事件进行特殊处理,而让其他事件传递给子`View`。 以文中给出的例子为例,创建了`LLayout`(继承自`FrameLayout`)和`LView`...
在你的项目中,`AndroidTest_onInterceptTouchEvent`很可能是一个示例应用,用于演示如何利用`MotionEvent`和`onTouchEvent`,以及`onInterceptTouchEvent`来实现触摸事件的处理和传递。通过调试和分析这个示例,你...
`onInterceptTouchEvent(MotionEvent ev)` 和 `dispatchTouchEvent(MotionEvent ev)` 是View和ViewGroup在处理触摸事件时的两个关键方法,它们共同构成了触摸事件的分发机制。了解这两个方法的工作原理对于优化用户...
2. **事件传递**:如果ViewGroup不拦截(即`onInterceptTouchEvent()`返回false),事件会沿着布局树向下传递到直接子视图。如果子视图消费了事件(`onTouchEvent()`返回true),事件流停止;否则,事件会回溯到父...
在本主题中,我们将深入探讨`ViewGroup`的事件传递,即事件分发过程。 1. **事件模型** Android事件处理基于一个简单的模型:当用户与屏幕上的UI元素交互时,系统会产生事件(如点击、滑动等)。这些事件首先被最...
在Android系统中,事件传递机制是用户界面交互的核心部分,主要处理用户与屏幕的各种触摸操作。这个机制确保了用户点击屏幕时,相应的视图能够正确地接收到并响应这些事件。我们今天将深入探讨Android的触摸事件...
1. 视图滑动:在实现滑动效果时,通常需要在ViewGroup的onInterceptTouchEvent()中判断滑动方向,当满足滑动条件时拦截事件,否则让事件传递给子View。 2. 多点触控:Android支持同时处理多个MotionEvent,通过...
在Android系统中,触摸事件(Touch Events)是用户与设备交互的主要方式,它涉及到了复杂的事件传递机制。本文将深入探讨Android的触摸事件处理流程,包括事件的产生、分发以及处理过程,以实例的形式帮助开发者理解...
在Android开发中,事件传递机制是用户界面交互的核心部分,它决定了用户在屏幕上触摸或点击时,事件如何在各个View之间进行分发。本Demo,"事件传递机制Demo",着重展示了这一机制的工作原理和常见应用场景。我们...
在Android系统中,事件传递机制是用户界面交互的基础,它涉及到Activity、View、 ViewGroup等组件之间的协同工作。本文将深入探讨这一机制,帮助你理解如何在Android应用中处理触摸事件。 1. 触摸事件的起源 触摸...
在Android开发中,事件传递是应用界面交互的关键部分,尤其是触摸事件(Touch Event)的处理。本示例“android事件传递demo”旨在演示如何在Android应用程序中管理触摸事件的分发流程,帮助开发者理解并有效地处理用户...
ViewGroup的onInterceptTouchEvent(MotionEvent ev)方法可以拦截事件传递,这个方法默认返回false,表示不拦截。如果重写这个方法并返回true,那么Touch事件就不会被传递给ViewGroup的子控件,而是转而由ViewGroup...
为了调试和优化触摸事件处理,开发者可以使用Logcat输出`MotionEvent`的信息,或者使用Android Studio的Layout Inspector查看视图树中的事件传递路径。此外,理解Android的触摸事件标志(如ACTION_DOWN、ACTION_UP、...
2. **Intercept阶段**:在事件传递过程中,ViewGroup可以通过重写`onInterceptTouchEvent()`方法来拦截事件。如果`onInterceptTouchEvent()`返回true,那么后续的事件将不再传递给子View,而是由当前ViewGroup处理。...
为了实现上下左右滑动,我们需要在`onTouchEvent`中捕获ACTION_DOWN和ACTION_MOVE事件,并记录初始触点位置和后续移动的位置。以下是关键步骤: 1. **初始化状态**:在ACTION_DOWN事件中,获取当前触摸点的坐标(x1...
但如果LinearLayout有需要响应触摸的子View,那么就需要在ScrollView的`onInterceptTouchEvent`中判断,只有当ScrollView没有滑动需求时,才允许事件传递给LinearLayout。 了解这两个方法的工作机制后,开发者可以...