首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

同一个触摸监听器被多次调用

是指在触摸事件发生时,相同的触摸监听器会被多次触发执行。

触摸监听器是一种用于处理用户触摸事件的回调函数或方法。当用户在设备上触摸屏幕时,触摸事件会被触发,并且相应的触摸监听器会被调用执行。在某些情况下,可能会出现同一个触摸监听器被多次调用的情况,这可能是由于以下原因导致的:

  1. 多点触摸:如果用户同时使用多个手指触摸屏幕,每个手指的触摸事件都会独立触发相应的触摸监听器。因此,如果多个手指同时触摸屏幕,并且它们都注册了相同的触摸监听器,那么该监听器将会被多次调用。
  2. 事件冒泡:在某些情况下,触摸事件可能会在触摸屏幕的层次结构中向上冒泡传递。这意味着当用户触摸屏幕时,触摸事件会从最底层的元素开始传递,直到最上层的元素。如果多个元素都注册了相同的触摸监听器,并且触摸事件在它们之间冒泡传递,那么该监听器将会被多次调用。

为了避免同一个触摸监听器被多次调用,可以采取以下措施:

  1. 仅注册一次:在注册触摸监听器时,确保只注册一次,避免重复注册相同的监听器。
  2. 事件处理标记:在触摸监听器中添加一个标记,用于标识该监听器是否已经执行过。当监听器被调用时,首先检查标记,如果已经执行过,则直接返回,避免重复执行。
  3. 事件拦截:在触摸事件传递过程中,可以在适当的时机拦截事件,避免触摸事件继续向上层元素传递,从而避免多次调用相同的触摸监听器。

总结起来,同一个触摸监听器被多次调用可能是由于多点触摸和事件冒泡导致的。为了避免这种情况,可以采取合适的措施,如仅注册一次、添加事件处理标记或事件拦截等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 五 )

三、触摸事件没有消费的调用链分析 四、触摸事件拦截的调用链分析 五、ViewGroup 事件分发相关源码 六、View 事件分发相关源码 总结 前言 接上一篇博客 【Android 事件分发】事件分发源码分析...= true; } // 如果上面为 true ( 触摸监听器触摸事件处理返回 true ) , 就会阻断该分支的命中 , 该分支不执行了 // 也就不会调用...会被屏蔽掉 // 如果同时设置了 点击监听器 OnClickListener 和 触摸监听器 OnTouchListener // 触摸监听器 OnTouchListener 返回 false..., 点击监听器 OnClickListener 才能调用到 if (!..., 子组件优先进行判定 , 消费触摸事件 ; 如果子组件将事件消费掉 , 则父容器不再进行消费 , 即父容器的触摸事件屏蔽 ; ( 子组件 ) 如果子组件没有讲事件消费掉 , 则在子组件调用返回后

1.4K30

【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )

方法中 , 传入的子组件为空 , 表示事件拦截了 , 或消费不成功 , 此时需要消费自己的触摸事件 , 调用父类 View 的 dispatchTouchEvent 方法就是消费自己的触摸事件 ;...就是封装在该对象中 ListenerInfo li = mListenerInfo; // 判断该组件是否用户设置了 触摸监听器 OnTouchListener...= true; } // 如果上面为 true ( 触摸监听器触摸事件处理返回 true ) , 就会阻断该分支的命中 , 该分支不执行了 // 也就不会调用...会被屏蔽掉 // 如果同时设置了 点击监听器 OnClickListener 和 触摸监听器 OnTouchListener // 触摸监听器 OnTouchListener 返回 false..., 点击监听器 OnClickListener 才能调用到 if (!

1.2K20

手把手教你读懂源码,View的Touch事件传递流程详细剖析

View的onFilterTouchEventForSecurity方法 如果其他窗口遮挡,该方法返回false,表示需要过滤触摸事件,就会跳过dispatchTouchEvent方法中的if...每一个事件都是由一个触摸按下事件,一个触摸抬起事件和N个触摸滑动事件组成的,触摸按下事件就是这里的ACTION_DOWN,其为一系列事件的开端。...当View没有其他窗口遮挡时,判断mOnTouchListener是否为空,即判断该View有没有绑定OnTouchListener监听器。...如果通过调用setOnClickListener方法绑定了OnClickListener监听器,则调用onClick方法。 ?...如果通过调用setOnLongClickListener方法绑定了OnLongClickListener监听器,则调用onLongClick方法。 ?

72470

D3库实践笔记之图表交互 |可视化系列36

事件监听器 JavaScript 有一个事件模型,在这个模型中,“事件”由发生的事情来触发,比如用户通过键鼠或触摸屏输入信息。大多数情况下,没人监听事件,事件就自生自灭,我们就无感知。...而如果我们添加事件监听器后,触发对应的事件就能调用这个监听器的设置,具体来说就是执行某些代码。 D3的选择集有一个方法on(),用来设定事件的监听器。...;•mouseup:鼠标按钮松开; 以下代码为图表标题添加了一个单击事件的监听器,当点击标题元素,会将标题加粗并在控制台输出当前标题文本;而如果当前是加粗的效果,点击后是变成非加粗文本,也就是点击会切换加粗和正常文本两种效果...常用的触屏事件有以下三种: •touchstart:当触摸放在触摸屏上时,也就是触摸到某个元素;•touchmove:当触摸点在触摸屏上移动时;•touchend:当触摸点从触摸屏上拿开时; 我们可以为触摸事件配置点击事件以及拖动事件...,也就是触摸有选中并拖动的效果。

5.3K00

札记:android手势识别,MotionEvent

根据android的ui-events(输入事件)的传递机制,监听器的回调方法会先于各种相应的处理器方法被执行,对于那些有返回boolean值的回调方法,返回值表示是否让事件继续传播,所以应该根据需要谨慎设计返回值...MotionEvent 触摸动作触发的输入事件由MotionEvent表示,它实现了Parcelable接口——IPC需求。 目前的设备几乎都支持多点触摸,每个触摸中的手指当做一个poiner。...一次触摸操作会发送一系列事件,所以onTouchEvent会被“很多次调用。...Multi-Touch 上面对MotionEvent的介绍中可以看到,每个处于触摸的手指当做一个pointer。目前大多数手机设备几乎都是支持10点触摸。...需要注意的是,必须是检测同一个pointer,因为允许多点触摸,那么就需要记录一个作为移动参考的pointer——定义为activePointer。

5K70

【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 )

; 这里再分析下触摸事件消费之后的 , 触摸事件记录过程 ; 触摸事件如果成功消费 , 则 dispatchTransformedTouchEvent 方法返回 true ; 对应的会调用 addTouchTarget...就是封装在该对象中 ListenerInfo li = mListenerInfo; // 判断该组件是否用户设置了 触摸监听器 OnTouchListener...= true; } // 如果上面为 true ( 触摸监听器触摸事件处理返回 true ) , 就会阻断该分支的命中 , 该分支不执行了 // 也就不会调用...会被屏蔽掉 // 如果同时设置了 点击监听器 OnClickListener 和 触摸监听器 OnTouchListener // 触摸监听器 OnTouchListener 返回 false..., 点击监听器 OnClickListener 才能调用到 if (!

1.1K20

【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )

onSingleTapUp , onScroll , onLongPress , onFling 五个方法 ; ② 触摸监听器 : 自定义组件实现 OnTouchListener 触摸监听器 , 并重写...(context, this); ④ 为组件设置触摸监听器 : 为本自定义组件设置触摸监听器 ; setOnTouchListener(this); 2 ....触摸事件传递给 GestureDetector : 在 View.OnTouchListener 触摸监听器的 onTouch 触摸回调方法中 , 将触摸事件传递给 mGestureDetector 处理...触摸滑动操作 : ① onScroll 方法 : 触摸滑动主要在 GestureDetector.OnGestureListener 监听器中的 onScroll 方法中实现 , 该方法是触摸滑动事件..., 手指全程没有离开屏幕 ; ② 区域解码操作 : 调用 mRect.offset 方法 , 重新设置解码区域 , 该方法可以移动 x 轴 , y 轴的解码 , 向上滑动分析 : 当向上滑动时 , 触摸坐标由大变小

1.4K22

cocos creator鼠标键盘事件总结

紧接着A节点会收到事件,由于C节点完整处在A节点中,所以注册在A节点上的事件监听器都将收到触摸按下事件。以上的过程解释了事件冒泡的过程和根据节点区域来判断是否分发事件的逻辑。...除了根据节点区域来判断是否分发事件外,鼠标和触摸事件的冒泡过程与普通事件的冒泡过程并没有区别。所以,调用 event 的 stopPropagation 函数可以主动停止冒泡过程。...,有可能随时修改 如何定义输入事件 除了键盘、设备重力传感器事件是通过函数 cc.systemEvent.on(type, callback, target) 注册以外 其他的例如:鼠标事件与触摸事件请参考系统内置事件...事件监听器类型:cc.EventListener.TOUCH_ONE_BY_ONE 事件触发后的回调函数: 触摸开始:onTouchBegan(touches, event); 触摸移动时:onTouchMoved...cc.eventManager.addListener(listener, this.node); 多点触摸事件 事件监听器类型:cc.EventListener.TOUCH_ALL_AT_ONCE

2.1K51

Android开发笔记(四十五)手势事件

上面可以看出,只有容器类才能操作onInterceptTouchEvent方法,这是因为该方法用于拦截发往下层视图的事件,而控件类已经位于底层只有拦截的份没有拦截别人的份,同样页面类本身并不拥有下层视图...: OnGestureListener 设置监听器的方法,先给指定控件注册触摸监听器,然后在触摸方法onTouch中由GestureDetector接管触摸事件 :  private ScrollTextView...监听器需要重写的方法 :  onDown : 在用户按下时调用 onShowPress : 已按下但还未滑动或松开时调用,通常用于pressed状态时的高亮显示 onSingleTapUp : 在用户轻点一下再弹起时调用...,通常用于点击事件 onScroll : 在用户滑动过程中调用 onLongPress : 在用户长按时调用,通常用于长按事件 onFling : 在用户飞快掠出一段距离时调用,通常用于翻页事件...这样多个控件争相响应同一个手势事件,就会产生滑动冲突,如果没处理好冲突,页面上的某些控件便无法正常使用。避免滑动冲突的处理办法,主要有以下三个: 1、对不同的手势事件,要返回正确的布尔值。

1.2K30

笔记31 | 归纳总结Android的点击事件

为此,View类还提供了几个与点击有关的监听器,用来处理一些特殊场景。举例如下: a、触摸事件,从用户按下屏幕就开始响应,直到用户松开才终止响应,期间可处理按下、移动、松开等动作。...,不但在触摸时全程响应,还能获知当前按下的是哪个键。...在标签页选中时调用 onTabUnselected : 在标签页取消选中时调用,该方法一般为空onTabReselected : 在标签页在选中状态下再次选中时调用,该方法一般为空 public class...,相关的点击处理方法说明如下:onMenuItemSelected : 在菜单项选择时调用,其内部做分支判断,如果是选项菜单,则调用onOptionsItemSelected; 如果是上下文菜单,则调用...onOptionsItemSelected : 在选项菜单的菜单项选中时调用。onContextItemSelected : 在上下文菜单的菜单项选中时调用

1.4K80

Android开发笔记(四十三)点击事件

为此,View类还提供了几个与点击有关的监听器,用来处理一些特殊场景。举例如下: 1、触摸事件,从用户按下屏幕就开始响应,直到用户松开才终止响应,期间可处理按下、移动、松开等动作。...,该事件比触摸事件更进一步,不但在触摸时全程响应,还能获知当前按下的是哪个键。...控件,在某个元素点击时触发。...: onItemClick 2、单项长按事件,一般用于ListView控件和GridView控件,在某个元素长按时触发。...: 在标签页选中时调用 onTabUnselected : 在标签页取消选中时调用,该方法一般为空 onTabReselected : 在标签页在选中状态下再次选中时调用,该方法一般为空 标签导航项的点击事件的具体实现代码可参考

1.3K30

Android6.0源码分析之View(一)

view但是不可见此时控件可以有事件处理逻辑,gone是指控件不存在屏幕上现在不存在该view); Chapter Two,Using View(view如何使用) 一个Window窗口中所有的view都在同一个...requestfocus方法 3>,监听事件,listener,view允许客户端设置监听器,当所监听的事件发生时会进行notify。...(事件处理) onKeyDown(int,KeyEvent) 当有物理按键按下时会调用 onKeyUp(int,KeyEvent) 当物理按键抬起时会调用 onTrackBallEvent(MotionEvent...触摸模式的状态时activity保存的 ,通过activity调用isInTouchMode方法,可以看看当前是否处于触摸模式下。...父view可能对子view多次调用measure方法。例如,父view去测量未指明大小的view所想要的size,又或者所有view的大小加起来过大或者过小时就会重新进行measure。

84580

Android 中屏幕点击事件的实现Android onTouchEvent, onClick及onLongClick的调用机制

在android下,事件的发生是在监听器下进行,android系统能够响应按键事件和触摸屏事件,事件说明例如以下: onClick(View v)一个普通的点击button事件 boolean onKeyMultiple...这三个事件标识出了最主要的用户触摸屏幕的操作,含义也非常清楚。...performClick(); break; 能够看到,Click的触发是在系统捕捉到ACTION_UP后发生并由performClick()运行的,performClick里会调用先前注冊的监听器的...要弄清楚这个问题仅仅要理解Android对事件处理的所谓消费(consume)概念就可以,一个用户的操作会被传递到不同的View控件和同一个控件的不同监听方法处理,不论什么一个接收并处理了该次事件的方法假设在处理完后返回了...true,那么该次event就算全然处理了,其它的View或者监听方法就不会再有机会处理该event了。

3.1K30

使用 PreviewView 来展示相机预览

下面的示例展示了如何使用 触摸监听器 (touch listener) 在 PreviewView 上实现轻点对焦功能: fun onTouch(x: Float, y: Float) { //...想要在 PreviewView 上实现它,在其之上添加一个 触摸监听器,并将其绑定到缩放手势监听器 (scale gesture listener) 上。...cameraControl.setZoomRatio(currentZoomRatio * delta) return true } } // 将 PreviewView 的触摸监听器绑定到缩放手势监听器上...val scaleGestureDetector = ScaleGestureDetector(context, listener) // 将 PreviewView 的触摸事件传递给缩放手势监听器上...这些测试会验证 preview 在各种情况时的状态,包括在应用运行时进行多次关闭然后重新打开,切换前置后置摄像头,以及应用的生命周期销毁后重新创建的情况。

1.5K00

使用 PreviewView 来展示相机预览

下面的示例展示了如何使用触摸监听器 (touch listener) 在 PreviewView 上实现轻点对焦功能: fun onTouch(x: Float, y: Float) { //...想要在 PreviewView 上实现它,在其之上添加一个触摸监听器,并将其绑定到缩放手势监听器 (scale gesture listener) 上。...cameraControl.setZoomRatio(currentZoomRatio * delta) return true } } // 将 PreviewView 的触摸监听器绑定到缩放手势监听器上...val scaleGestureDetector = ScaleGestureDetector(context, listener) // 将 PreviewView 的触摸事件传递给缩放手势监听器上...这些测试会验证 preview 在各种情况时的状态,包括在应用运行时进行多次关闭然后重新打开,切换前置后置摄像头,以及应用的生命周期销毁后重新创建的情况。

2.6K20

Android 中 View 的手势事件处理

,如果这个方法调用,那么是无法识别滑动事件的,也就是说长按之后, * 这个触摸事件就对于这个手势监听器来说就结束了,之后只有松开之后在次触摸(重新触发触摸事件) *..., * 也就是说这个方法调用了之后不可能再调用双击行为方法,注意和 onSingleTap的区别, * 调用顺序:onDown --> onSingleTapUp --...GestureDetector.OnGestureListener gestureListener = new GestureDetector.OnGestureListener() { // 当控件触摸到的一瞬间就会调用的方法...,如果这个方法调用,那么是无法识别滑动事件的,也就是说长按之后, * 这个触摸事件就结束了,之后只有松开之后在次触摸(重新触发触摸事件) * 但是如果对手势识别器(...单击一个位置之后,onDown 方法和 onSingleTapUp 方法调用,并且模拟器中显示出了单击位置的坐标,接下来试试滑动: ?

1.4K20

Android事件处理概述

当用户按下一个按钮或者单击某个菜单项时,这些动作就会激发一个相应的事件,该事件就会触发事件源上注册的事件监听器(特殊的Java对象),事件监听器调用对应的事件处理器 (事件监听器里的实例方法)来做出相应的响应...因为同一个事件源上可能发生多种事件,委派式事件处理方式可以把事件源上所有可能发生的事件分别授权给不同的事件监听器来处理;同时也可以让一类事件都使用同一个事件监听器来处理。...获取普通界面组件(事件源),也就是监听的对象。 实现事件监听器类,该监听器类是一个特殊的Java类,必须实现一个XxxListener接口。...调用事件源的setXxxListener方法将事件监听器对象注册给普通组件(事件源)。...View.OnLongClickListener:长按事件的事件监听器必须实现的接口。 View.OnTouchListener:触摸事件的事件监听器必须实现的接口。

98990

【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )

"onClick") public @interface OnClick { int[] value(); // 接收 int 类型数组 } 通过反射获取注解的 value 方法 , 调用注解的...组件的事件设置方法 , 如果设置的是点击事件 , 就是获取 setOnClickListener 方法 , 如果设置的是长按事件 , 就是获取 onLongClickListener 方法 , 如果设置的是触摸方法..., 就是获取 setOnTouchListener 方法 ; 获取方法时 , 需要传入方法的参数 , 就是设置的事件监听器对象 , 点击事件的事件监听器是 View.OnClickListener 监听器..., 触摸事件的事件监听器是 View.OnTouchListener 监听器 ; // 获取 View 视图组件的 listenerSetter 对应方法..." 的方法 , 需要通过反射调用该方法 , 同时传入事件监听器 , 事件监听器需要用到动态代理 , 在下一篇博客介绍 ; // 执行 View 的 setOnClickListener

1.7K20
领券