博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ReactNative 触摸事件处理
阅读量:5316 次
发布时间:2019-06-14

本文共 2309 字,大约阅读时间需要 7 分钟。

ReactNative触摸事件处理

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

组件A、B、C结构

组件A    组件B        组件C

捕获、冒泡机制

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

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

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

补充:

来自CSDN博文

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中使用

事件参数

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

nativeEvent包含以下属性

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

gestureState包含以下属性:

stateID 此次触摸事件的IDmoveX 最近一次移动的屏幕坐标moveYx0 响应器产生时的屏幕坐标(手势第一个坐标)y0dx 触摸开始累积的横向路程dyvx 当前的横向移动速度vynumberActiveTouches 触摸点数量

事件生命周期

单点事件

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

你可能感兴趣的文章
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
(五)归一化
查看>>
使用信号量
查看>>
《数据分析实战》--第三章 python实现
查看>>
实验八 接口与实现接口的类
查看>>
PostgreSQL 保留关键字添加方法之一,不带参数的函数
查看>>
赛前热手 (天梯赛暴力题)
查看>>
Uva(10330)
查看>>
vlan学习
查看>>
【转贴】SAP HANA内存数据库详解
查看>>