- 浏览: 463826 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
wwwjiandan:
我现在遇到的问题是将Activity设置为非全屏,且andro ...
Android中软键盘弹出时底部菜单上移问题 -
zjhdreams:
求下载链接
Android 9Patch (NinePatch) -
wtjandjay:
受教了 .......
从程序员到项目经理 -
mr_zhang2011:
将博客搬至CSDN -
fyc0109:
为什么我传过去的值, 有的都不对呢, 顺序也是一样的.就是获得 ...
Android Parcelable序列化自定义类集合在Activity间传递
本文源地址: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()。如我们将LayoutView2的onInterceptTouchEvent()返回值为true,则传递流程变成:
如果我们同时将LayoutView2的onInterceptTouchEvent()和onTouchEvent()设置成true,那么LayoutView2将消费被传递的事件,同时后续事件(如跟着ACTION_DOWN的ACTION_MOVE或者ACTION_UP)会直接传给LayoutView2的onTouchEvent(),不传给其他任何控件的任何函数。同时传递给子控件一个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事件。
实例见附件:
- InterceptTouchStudyActivity.zip (50.8 KB)
- 下载次数: 50
发表评论
-
android Log.isLoggable方法的使用
2014-06-06 15:35 2993android 动态控制logcat日志开关,通过Log. ... -
View not attached to window manager
2013-01-10 11:55 1077View not attached to window man ... -
代码设置android:icon,android:label
2013-01-05 15:26 7988requestWindowFeature( Window.F ... -
Android项目为一个apk设置多个ICON图标和执行入口
2013-01-05 12:13 3877Android开发中,一个工程对应一个AndroidManif ... -
Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
2012-12-04 12:15 01:调用系统发送短信界面 Uri smsT ... -
Android 源码目录结构详解
2012-11-22 17:20 1461这是Android2.1的源代码的 ... -
如何获取android源代码
2012-07-10 17:50 2738如何获取android源代码 研究 ... -
Android uses-permission大全
2012-06-12 17:33 1065android.permission.ACCESS_CHE ... -
Android 应用程序基础(Application Fundamentals)
2012-05-23 17:42 1255Android 应用程序基础(Application Fun ... -
转Android 音乐频谱实现
2012-02-18 23:35 0最近由于需要实现音乐频谱,所以今天就为大家普及一下。 这里实现 ... -
android VideoView本工程mp4文件
2012-01-09 18:42 2701最近在做一个demo,要求播放视频,记录一下。使用的是Vid ... -
关于android播放mp3与歌词同步问题收集
2012-01-09 17:57 1673关于android播放mp3与歌词同步问题收集,有时间再试。 ... -
android使用MediaPlayer播放音乐文件时遇到的问题
2012-01-09 17:38 18378把mp3文件放在Assets文件夹里,然后用MediaPlay ... -
android资源目录---assets与res/raw的不同
2012-01-05 11:49 2365android资源目录---assets与 ... -
Android 的cpu硬盘 内存 网络设置 系统信息 硬件信息
2012-01-04 10:56 1594转载 http://www.cnmsdn.com/html/2 ... -
使用 Android Compatibility Package 来简化开发工作
2012-01-04 10:12 1429转载 http://www.cnmsdn.com/html/2 ... -
Android 9Patch (NinePatch)
2011-12-26 16:06 45281:介绍 NinePatch图片以*.9.png结尾,和普通 ... -
Windows平台下Android源码的下载
2011-12-21 11:06 1256Windows平台下Android源码的下载 ... -
改变MenuItem默认背景
2011-12-07 19:58 1442@Override public boolean onCre ... -
Android横屏竖屏切换
2011-11-10 18:20 107转载 http://blog.csdn.net/leesido ...
相关推荐
理解并掌握`onInterceptTouchEvent`和`onTouchEvent`的调用关系,可以帮助开发者更灵活地控制触摸事件的流向,实现复杂的手势识别和用户界面交互。在实际开发中,我们可以通过重写这两个方法,为自定义View或...
`onInterceptTouchEvent`和`onTouchEvent`是两个至关重要的方法,它们共同构成了Android视图层次结构中的触摸事件分发机制。下面我们将深入探讨这两个方法的用法及其在实际开发中的应用场景。 1. `...
2. 若ViewGroup不拦截ACTION_DOWN(返回`false`),事件将传递给子View,子View的`onTouchEvent`会被调用,处理ACTION_DOWN。 3. 如果在后续的ACTION_MOVE或ACTION_UP事件中,ViewGroup想要拦截事件,它可以在`...
`onInterceptTouchEvent`和`onTouchEvent`是两个关键的方法,它们共同构成了Android事件分发机制的核心。 `onInterceptTouchEvent`方法在ViewGroup中定义,它的主要作用是拦截事件流,即决定事件是否由父视图处理,...
本文将深入探讨Android事件模型,特别是`onTouchEvent`和`interceptTouchEvent`的关系,帮助开发者更好地理解这两个方法如何协同工作以实现复杂的触摸事件处理。 首先,Android事件模型基于触摸事件的分发机制,它...
在Android开发中,触摸事件处理是用户界面交互的关键部分,`onTouchEvent` 和 `onInterceptTouchEvent` 是处理这些事件的两个重要方法。本文将深入探讨这两个方法的使用、顺序以及它们在Android事件分发机制中的角色...
onInterceptTouchEvent和onTouchEvent调用时序详解 测试demo 详细介绍请移步:http://blog.csdn.net/yiranxinshou/article/details/9201833
开发者通常会遇到的问题是,当试图添加自定义的滑动行为时,需要处理复杂的触摸事件监听(`onTouchEvent`)和事件分发(`onInterceptTouchEvent`),这可能导致性能下降,影响用户体验。而这个库则优化了这一过程,...
在Android开发中,触摸事件的处理是用户交互的基础,而`onTouchEvent`和`onInterceptTouchEvent`则是处理这些事件的关键方法。这篇文章将深入解析这两个方法的区别和它们在触摸事件处理链中的作用。 首先,`...
`dispatchTouchEvent`和`onInterceptTouchEvent`是Android组件处理触摸事件的关键方法,它们在View和ViewGroup之间协同工作,决定了事件如何被分发和拦截。这篇文章将深入探讨这两个方法的工作原理,以及它们如何...
Android的触摸事件分发分为三个阶段:dispatchTouchEvent()、onTouchEvent()和onInterceptTouchEvent()。 - dispatchTouchEvent(): 当触摸事件到达一个ViewGroup时,系统首先调用该方法,然后决定是否将事件分发给...
- ACTION_DOWN:事件开始,首先调用ViewGroup的dispatchTouchEvent(),然后可能调用到子View的onInterceptTouchEvent()或onTouchEvent()。 - ACTION_UP/ACTION_CANCEL:事件结束,通常在ACTION_DOWN之后发生,视...
例如,`onInterceptTouchEvent`和`onTouchEvent`方法是处理滑动事件的关键,而`open()`和`close()`方法则负责滑动层的展开和收起。 此外,该库还支持自定义视图,这意味着开发者可以根据自己的需求添加任意复杂的...
例如,自定义一个ScrollView并重写onInterceptTouchEvent和onTouchEvent方法,可以实现手势检测和滑动处理。 在实际项目中,为了实现图片加载和滑动特效的无缝结合,可能会在PagerAdapter(ViewPager的适配器)中...
为了实现上下左右滑动,我们需要在`onTouchEvent`中捕获ACTION_DOWN和ACTION_MOVE事件,并记录初始触点位置和后续移动的位置。以下是关键步骤: 1. **初始化状态**:在ACTION_DOWN事件中,获取当前触摸点的坐标(x1...
PullToRefresh库通过覆写ViewGroup的onInterceptTouchEvent和onTouchEvent方法,捕获并处理滑动事件。当用户下拉到一定距离时,显示刷新指示器,并启动刷新逻辑。同样,上拉加载更多也是监听上拉手势,触发加载新...
Android中的事件主要包括触摸事件和按键事件等,这些事件的分发遵循一定的层次结构。当一个事件发生时,如触摸屏幕或按下某个键,该事件首先会被传递给WindowManagerService(窗口管理服务),然后由...
本文将深入解析Android中事件捕获和冒泡的流程,帮助开发者更好地理解和运用这一机制。 事件在Android中主要通过View和 ViewGroup对象进行传递。当用户在屏幕上触摸或点击时,系统会生成一个事件对象,如...
当一个触摸事件发生时,Android系统会按照特定的顺序进行事件分发,这个过程可以概括为“传递”和“消耗”两个阶段。 1. **事件传递**: - **Activity**: 事件首先由系统发送到最顶层的Activity,Activity通过`...