Gesture Responder System
Gesture Responder System
手势响应器系统管理您的应用中手势的生命周期。触摸可以经历几个阶段,因为应用程序确定用户的意图是什么。例如,应用程序需要确定触摸是否滚动,滑动窗口小部件或点击。这甚至可以在触摸的持续时间内改变。也可以有多个同时触摸。
需要触摸响应器系统来允许组件协商这些触摸交互,而不需要关于其父组件或子组件的额外知识。这个系统的实施ResponderEventPlugin.js
,其中包含更多的细节和文件。
最佳实践
为了让您的应用感觉棒极了,每个动作都应该具有以下属性:
- 反馈/突出显示 - 向用户显示处理触摸的方式,以及释放手势时会发生什么
这些功能使用户在使用应用程序时更加舒适,因为它可以让人们进行实验和互动,而不用担心犯错误。
TouchableHighlight和Touchable *
响应者系统使用起来可能很复杂。所以我们提供了一个抽象的Touchable
应用程序,用于应该“可点击”的事物。这使用响应者系统,并允许您以声明方式轻松配置点击交互。使用TouchableHighlight
任何地方你可以使用一个按钮或网页链接。
响应者生命周期
视图可以通过实施正确的协商方法成为触摸响应者。有两种方法可以询问视图是否想成为响应者:
- View.props.onStartShouldSetResponder: (evt) => true, - 此视图是否希望成为触摸开始时的响应者?
如果视图返回true并尝试成为响应者,则会发生以下情况之一:
- View.props.onResponderGrant: (evt) => {} - 视图正在响应触摸事件。这是突出显示用户正在发生的事情的时候
如果视图正在响应,则可以调用以下处理程序:
- View.props.onResponderMove: (evt) => {} - 用户正在移动他们的手指
evt
是一种具有以下形式的合成触摸事件:
nativeEvent
捕获ShouldSet处理程序
onStartShouldSetResponder
并onMoveShouldSetResponder
以鼓泡模式调用,其中最深的节点首先被调用。这意味着当多个视图对于*ShouldSetResponder
处理程序返回true时,最深的组件将成为响应者。这在大多数情况下是可取的,因为它确保所有控件和按钮都可用。
但是,有时家长会希望确保它成为响应者。这可以通过使用捕获阶段来处理。响应者系统从最深的组件中冒出来之前,它会进行捕获阶段,触发on*ShouldSetResponderCapture
。因此,如果父视图想要防止孩子在触摸开始时成为响应者,则应该有一个onStartShouldSetResponderCapture
返回true 的处理程序。
- View.props.onStartShouldSetResponderCapture: (evt) => true,
PanResponder
对于更高级别的手势解释,请查看PanResponder。