- 浏览: 121510 次
- 性别:
- 来自: 广州
文章分类
最新评论
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, 后续的事件就被截止了,这样想就很好理解。
发表评论
文章已被作者锁定,不允许评论。
-
stopSelf()与stopSelf(startId)的区别
2016-04-14 14:44 1113startId:表示启动服务的次数 stopSelf(sta ... -
安装/卸载/替换成功广播接收
2016-01-08 11:59 817<receiver android:name=" ... -
ContentProivder
2015-12-09 09:26 490ContentProvider 我们实现了其中的几个方法 ... -
Android获取网络时间
2015-11-19 11:27 11911、实时获取: LocationManager locatio ... -
android animation知识
2015-11-14 11:47 581<?xml version="1.0" ... -
代码中设置android:drawableTop等
2015-11-14 10:42 1027btnAttachment.setCompoundDrawab ... -
自定义View
2015-11-04 15:09 407一般来说,自定义View都会去重写onMeasure()方法, ... -
SimpleOnGestureListener
2015-11-04 12:03 559onScroll()缓慢滑动,手指滑动屏幕的过程中执行; on ... -
设置dialog在底部并宽度全屏显示
2015-11-02 11:53 2295pickerDialog.setContentView(vie ... -
横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效
2015-10-29 10:51 1808在之前的版本中都是在Manifest文件中设置Activity ... -
Dialog注意点
2015-10-28 17:14 533dialog:setCancelable与setCancele ... -
清除setBackgroundResource的原有值
2015-10-23 16:50 1176setBackgroundResource(0);清除原有的s ... -
接收隐式意图
2015-10-22 11:29 552想接收隐式意图,必须在他们的意图过滤器中配有:android. ... -
严苛模式
2015-10-14 20:25 1380//启用严苛模式,StrictMode可以用于捕捉发生在应用程 ... -
Android使用Animation完成动画保留最后一帧的办法
2015-09-08 10:43 2449在动画效果的xml中,在set标签中加上一条android:f ... -
控件getHeight和getWidth等于0的解决办法
2015-09-07 17:27 1444//监听layoutContainer是否初始化完成 l ... -
Service和Thread的区别?
2015-08-19 13:25 502servie是系统的组件,它由系统进程托管(servicema ... -
避免内存泄露
2015-08-18 19:21 4991、尽量避免在Activity使用static。 2、能使用A ... -
需要context的时候用activity还是application?
2015-08-17 17:02 775需要context的时候用activity还是applicat ... -
谈谈UI中, Padding和Margin有什么区别?
2015-08-10 17:18 1105Padding 文字对边框, margin是控件与控件之间的距 ...
相关推荐
在Android开发中,理解和掌握`onInterceptTouchEvent`与`onTouchEvent`的调用时序至关重要,因为它们是实现触摸事件处理的关键。这两个方法都属于Android的触摸事件处理机制,涉及到了ViewGroup与子View之间的事件...
在Android开发中,触屏事件处理是用户交互的核心部分,涉及到Activity、View和ViewGroup这三个关键组件。本文将深入探讨这些组件在触屏事件处理中的角色和机制。 首先,我们来理解Activity。Activity是Android应用...
总的来说,`dispatchTouchEvent`和`onInterceptTouchEvent`是Android触摸事件处理的核心,它们控制了事件的分发和拦截,为开发者提供了强大的定制能力。通过深入理解这两者,开发者可以更灵活地构建用户交互丰富的...
4. ACTION_CANCEL:触摸事件被取消,例如手指在触摸屏外的区域抬起,或者系统需要回收资源。 二、触摸事件的分发机制 Android系统中的触摸事件分发机制遵循“父控件优先”的原则,分为三个阶段: ...
综上所述,`onInterceptTouchEvent()`是Android触摸事件处理中的一个重要环节,理解和熟练运用它可以极大地提升应用的用户体验和功能多样性。通过深入研究和实践,开发者可以创建出更加灵活且响应式的用户界面。
四、自定义View的触摸事件处理 在开发自定义View时,可以通过重写`onTouchEvent()`和`onInterceptTouchEvent()`来定制触摸事件的处理方式。例如,如果希望自定义View在手指滑动时改变颜色,可以在`onTouchEvent()`中...
本文将深入探讨“android之Touch事件处理机制测试”,包括滑动事件冲突的解决、ViewGroup中的事件触发和传递机制。 一、Android Touch事件处理机制 1. 触摸事件流程:在Android中,触摸事件分为三个阶段,即ACTION...
在Android系统中,事件处理主要包括触摸事件、键盘事件、广播事件等,这些事件的处理方式直接影响到应用的用户体验和功能实现。下面我们将深入探讨Android事件处理机制的原理及其源码分析。 首先,Android事件处理...
具体来说,`onInterceptTouchEvent`的事件处理顺序是从ACTION_DOWN开始,因为ACTION_DOWN标志着一个触摸序列的开始。当`onInterceptTouchEvent`接收到ACTION_DOWN时,如果选择拦截(返回`true`),那么后续的ACTION_...
Android事件处理主要包括两种方式:基于监听器(Listener)的事件处理和基于消息队列(Message Queue)的事件处理。本文将深入探讨这两种机制及其在实际开发中的应用。 一、基于监听器的事件处理 1. 视图层次结构...
总之,`onInterceptTouchEvent(MotionEvent ev)` 和 `dispatchTouchEvent(MotionEvent ev)` 是Android触摸事件处理的核心,它们共同决定了触摸事件如何在视图层次结构中流动。通过合理利用这两个方法,开发者可以...
总之,`onInterceptTouchEvent`和`onTouchEvent`是Android触摸事件处理的核心,它们协同工作,为开发者提供了强大的交互设计能力。通过深入理解并熟练应用这两个方法,开发者能够构建出更加丰富和流畅的用户界面。
综上所述,这个压缩包中的代码可以帮助开发者深入理解Android事件分发的机制,并提供实际的代码示例,以便学习如何拦截和处理触摸事件。不过,由于描述中提到部分代码可能不可用,因此实际使用时可能需要进行调整。...
3. **事件处理**:`View`的`onTouchEvent()`方法用于处理具体事件。如果返回`true`,表示事件已被处理,系统不会继续向其他视图分发;如果返回`false`,事件将继续回溯到上层视图。在`onTouchEvent()`中,可以通过对...
在Android应用开发中,事件处理机制是至关重要的组成部分,它涉及到用户与应用程序的交互,包括点击、滑动等各类操作。本示例"Android 事件处理机制 demo"将深入探讨这一主题,通过实际代码演示如何有效地管理和响应...
在Android开发中,触摸事件处理是用户界面交互的关键部分,`onTouchEvent` 和 `onInterceptTouchEvent` 是处理这些事件的两个重要方法。本文将深入探讨这两个方法的使用、顺序以及它们在Android事件分发机制中的角色...
总结,Android的触摸事件处理是应用程序与用户交互的核心部分。理解事件的生命周期、分发机制以及如何自定义事件处理,可以帮助开发者构建更加流畅、交互性强的应用程序。在"TouchProject"这个实例中,我们可以学习...
本文将深入探讨Android的触摸事件处理流程,包括事件的产生、分发以及处理过程,以实例的形式帮助开发者理解这一核心概念。 ### 一、事件产生 当用户在屏幕上触摸时,硬件层会生成原始的触控事件(MotionEvent),...
在Android开发中,事件处理是UI交互的核心部分。事件派发机制确保了用户与界面的交互能够正确地被处理和响应。本示例"android事件派发验证demo"旨在帮助开发者深入理解并验证这一机制。下面我们将详细探讨Android...