ReactNative触摸事件处理

对RN触摸事件的捕获与冒泡机制的理解

组件A、B、C结构

组件A组件B组件C

捕获、冒泡机制

sequenceDiagram
A->>A: 是否捕获?若是则停止向下一级传递
A->>B:
B->>B: 是否捕获?若是则停止向下一级传递
B->>C:
C->>C: 是否捕获?若是则停止向下一级传递
C->>C: 是否声明成为响应者?无论是否,都冒泡。
C->>B:
B->>B: 是否声明成为响应者?无论是否,都冒泡。
B->>A:
A->>A: 是否声明成为响应者?

捕获期可通过onStartShouldSetResponderCapture 或 onMoveShouldSetResponderCapture回调决定是否阻止事件往下级组件传递。

冒泡期可通过onStartShouldSetResponder或onMoveShouldSetPanResponder回调决定是否成为响应者。若上级组件与下级组件都返回true,则下级组件成为当前触摸事件的响应者。(层级越深的组件优先级越高)

补充:

react-native Touch事件的拦截与分发

RN如何处理触摸事件

View组件的pointerEvents属性

用于控制当前视图是否可以作为触控事件的目标。

  • auto:视图可以作为触控事件的目标。
  • none:视图不能作为触控事件的目标。
  • box-none:视图自身不能作为触控事件的目标,但其子视图可以。

View组件可用的手势

onTouchStart={()=>console.log('start')}
onTouchMove={()=>console.log('move')}
onTouchEnd={()=>console.log('end')}

PanResponder 手势监视器

// 创建监视器
this.panResponder = PanResponder.create({onStartShouldSetPanResponder: ()=>{},...
})// 在View中使用
<View{...this.panResponder}
/>

事件参数

每个事件都有两个返回参数nativeEvent, gestureState

nativeEvent包含以下属性

changedTouches - 在上一次事件之后,所有发生变化的触摸事件的数组集合(即上一次事件后,所有移动过的触摸点)
identifier - 触摸点的 ID
locationX - 触摸点相对于父元素的横坐标(实践证明不好用,值会突变!原因未知)
locationY - 触摸点相对于父元素的纵坐标(实践证明不好用,值会突变!)
pageX - 触摸点相对于根元素的横坐标
pageY - 触摸点相对于根元素的纵坐标
target - 触摸点所在的元素 ID
timestamp - 触摸事件的时间戳,可用于移动速度的计算
touches - 当前屏幕上的所有触摸点的集合

gestureState包含以下属性:

stateID 此次触摸事件的ID
moveX 最近一次移动的屏幕坐标
moveY
x0 响应器产生时的屏幕坐标(手势第一个坐标)
y0
dx 触摸开始累积的横向路程
dy
vx 当前的横向移动速度
vy
numberActiveTouches 触摸点数量

事件生命周期

单点事件

onStartShouldSetResponderCapture 如果父视图想要阻止子视图响应 touch start 事件,它就应该设置这个方法并返回 true。

onStartShouldSetResponder 在用户开始触摸的时候(手指刚刚接触屏幕的瞬间),返回是否愿意成为响应者

onPanResponderGrant 这个视图开始响应触摸事件。此时需要高亮告诉用户正在响应。

onPanResponderStart 触摸事件正式被监视

onPanResponderEnd 触摸事件结束

onPanResponderRelease 在整个触摸事件结束时调用这个函数。

移动事件

onMoveShouldSetResponderCapture 如果父视图想要阻止子视图响应 touch move 事件时,它就应该设置这个方法并返回 true

onMoveShouldSetPanResponder 这个视图想要“认领”这个 touch move 事件吗?每当有 touch move 事件在这个视图中发生,并且这个视图没有被设置为这个 touch move 的响应时,这个函数就会被调用。

onPanResponderGrant 监视器发出通知开始工作

onPanResponderMove 当用户正在屏幕上移动手指时调用这个函数。

异常事件

onPanResponderReject 有一个响应器正处于活跃状态,并且不会向另一个要求响应这个事件的视图释放这个事件。

onPanResponderTerminationRequest 其他某个视图想要成为事件的响应者,并要求这个视图放弃对事件的响应时,就会调用这个函数。如果允许释放响应,就返回true。

onPanResponderTermination 响应被从这个视图上“劫走”了。可能是在调用了 onResponderTerminationRequest 之后,被另一个视图“劫走”了(见 onresponderterminationrequest), 也可能是由于 OS 无条件终止了响应(比如说被 iOS 上的控制中心/消息中心)

转载于:https://www.cnblogs.com/foxNike/p/11119204.html

ReactNative 触摸事件处理相关推荐

  1. ​iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景.

    2019独角兽企业重金招聘Python工程师标准>>> 主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块,(1)首先在 ...

  2. iOS UITouch 触摸事件处理

    1. UITouch 的主要方法: C代码   - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)to ...

  3. UITouch 触摸事件处理(实例)

    1. UITouch 的主要方法: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesM ...

  4. ios触摸超出_iOS触摸事件处理

    在开发过程中,大家或多或少的都会碰到令人头疼的手势冲突问题,正好前两天碰到一个类似的bug,于是借着这个机会了解了iOS中的事件传递与处理的相关内容,整理出来方便以后查阅. iPhone的成功,很大的 ...

  5. Android 触摸事件处理机制

     Android 触摸事件的处理主要涉及到几个方法: onInterceptTouchEvent(), dipatchTouchEvent(), onTouchEvent(), onTouch() ...

  6. Android开发之触摸事件处理机制详解

     android触碰消息传递机制 用户的每次触碰(onClick,onLongClick,onScroll,etc.)都是由一个ACTION_DOWN+n个ACTION_MOVE+1个ACTION ...

  7. Cocos2dx-lua触摸事件处理

    方式1: local MainScene = class("MainScene", cc.load("mvc").ViewBase)function MainS ...

  8. flutter onPressed onTap等手势检测及触摸事件处理

    我怎么给 Flutter 的 widget 添加一个点击监听者? 在 Flutter 中,有两种方法来添加点击监听者: 1.如果 widget 本身支持事件监测,直接传递给它一个函数,并在这个函数里实 ...

  9. Android键盘和触摸事件处理

    activity和VIEW都能接收触摸和按键,如果响应事件只需要在继承类里复写事件函数即可 但是对于VIEW来说,我们如果不改变DRAW,不需要继承,所以如果想响应事件,则需要 当一个视图(如一个按钮 ...

最新文章

  1. ​Xamarin iOS教程之视图显示图像
  2. 工作中这些实用的小技巧,90%的程序员不知道
  3. 51,AVR,PIC,DSP,DIY等资源
  4. T-SQL:流程控制 4,Case 语句
  5. Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群
  6. 根可达算法的根_好屌好屌的「GC系列」JVM垃圾定位及垃圾回收算法浅析
  7. System.Threading.Timer 定时器的用法
  8. 江南大学计算机科学esi排名,喜忧参半!2021年5月ESI世界大学排行榜,21个学科排名数据分析!...
  9. 编写可复用的自定义按钮
  10. 笔记本装服务器系统 无线网卡无法驱动,笔记本Win8.1系统无线网卡驱动装不上如何解决...
  11. keras遥感图像Unet语义分割(支持多波段多类)
  12. AD再见--AdGuardHome神器
  13. 只有加法也能做深度学习,北大、华为等提出AdderNet,性能不输传统CNN
  14. 男人副业做什么好?男生适合做啥副业?男士副业都有什么
  15. 微信内的浏览器缓存清理方法
  16. 重写hashcode方法需要重写equals方法吗?为什么?
  17. Studing Git
  18. 速都app推广:移动网页seo优化和APP发布与aso优化试水
  19. 【历史上的今天】2 月 19 日:Hacker News 上线;Adob​​e Photoshop 诞生;DVD 退出历史舞台
  20. 元宇宙将如何重塑摄影艺术?

热门文章

  1. 安卓APP_ Fragment(2)—— Activity与Fragment的通信
  2. 学习笔记~~~~LinkedHashMap
  3. cwntos新建目录挂载磁盘_详解Linux磁盘挂载、分区、扩容操作的实现方法
  4. 最常问的MySQL面试题集合
  5. 硬件:RS232基础知识笔记
  6. SQLSERVER得到数据库中所有表字段及字段中文描述
  7. 空间句法软件_【特训营报名】空间句法理论与实践应用(第二期更新版)丨城市数据派...
  8. html为什么要进行表单验证_化学锚栓为什么要进行拉拔试验?
  9. php字符串转换mysql_在PHP中将字符串转换为MySQL时间戳格式
  10. php位运算重要吗,PHP位运算的用途