React Native 中的 onStartShouldSetPanResponder 与 onMoveShouldSetPanResponder

onStartShouldSetPanResponder vs onMoveShouldSetPanResponder in React Native

我正在使用 React Native 中的 PanResponder,并且正在考虑单击 Animated.View 并拖动它的场景。我有以下代码:

this.panResponder = PanResponder.create({
  onStartShouldSetPanResponder: () => true,
  onMoveShouldSetPanResponder: () => true,
  onPanResponderGrant: () => {
    this.animatedValue.setOffset({
      x: this._value.x,
      y: this._value.y,
    })
    this.animatedValue.setValue({ x: 0, y: 0})
  },
  onPanResponderMove: Animated.event([
    null,
    {
      dx: this.animatedValue.x,
      dy: this.animatedValue.y
    }
  ])
})

我的问题是:

1) 如果我单击 PanResponder 附加到的 Animated.View,我知道 onStartShouldSetPanResponder: () => true 会导致 Animated.View 成为此手势的响应者,但是 onMoveShouldSetPanResponder: () => true 导致它 're-become' 在拖动手势的每个后续增量上响应?

2) onPanResponderGrant() 是仅在我第一次单击 Animated.View 时被调用,还是在每次拖动手势的后续增量时也被调用?

3) 在onPanResponderMove中,dxdy是从触摸开始的总累积距离,还是对应于触摸的单个增量的小增量当前拖动手势? IE。如果我在 x 方向上将 Animated.View 总共拖了 100pxdx 会被 100px 还是像 1px 为拖动手势的当前增量?

如果你能给我一些关于其中任何一个的见解,那就太好了。

谢谢!

  1. 不会,它只会成为响应者一次。通常你只需要其中之一。例如,如果您只想在拖动时激活手势,您可以 return no from onStartShouldSetPanResponder.

  2. onPanResponderGrant() 对于给定的手势只会被调用一次。这通常是您可以更新状态或 UI 以通知用户手势处于活动状态的地方。

  3. dxdy 确实是相对于手势开始的累积 x 和 y 位置。因此,在您的示例中,它将是 100。