【React Native】文件翻譯閱讀紀錄 - APIs - PanResponder

by - 上午9:00

Facebook Open Source React Native


PanResponder

PanResponder 將多個觸摸調和為一個手勢。它使單點觸控手勢能夠適應額外的觸摸,並可用於識別簡單的多點觸控手勢。

默認情況下,PanResponder保存一個 InteractionManager 句柄,以阻止長時間運行的JS事件中斷活動手勢。

它提供了由手勢響應器系統提供的響應者處理程序的可預測包裝器。對於每個處理程序,它在本機事件對象旁邊提供一個新的gestureState對象:


onPanResponderMove: (event, gestureState) => {}
本機事件是具有以下形式的合成觸摸事件:
  • nativeEvent
    • changedTouches - 自上次事件以來已更改的所有觸摸事件的數組
    • identifier -觸摸的ID
    • locationX - 觸摸的X位置,相對於元素
    • locationY - 觸摸的Y位置,相對於元素
    • pageX -觸摸的X位置,相對於根元素
    • pageY - 觸摸的Y位置,相對於根元素
    • target - 接收觸摸事件的元素的節點ID
    • timestamp - 觸摸的時間標識符,用於速度計算
    • touches - 屏幕上所有當前觸摸的數組
gestureState 對象具有以下內容:
  • stateID - 只要屏幕上至少有一次觸摸,就會保持gestureState的ID
  • moveX - 最近移動的觸摸的最新屏幕坐標
  • moveY - 最近移動的觸摸的最新屏幕坐標
  • x0 - 響應者授權的屏幕坐標
  • y0 - 響應者授權的屏幕坐標
  • dx - 觸摸開始後手勢的累積距離
  • dy - 觸摸開始後手勢的累積距離
  • vx - 手勢的當前速度
  • vy - 手勢的當前速度
  • numberActiveTouches - 當前屏幕上的觸摸次數

基本用法

  class ExampleComponent extends Component {
    constructor(props) {
      super(props)
      this._panResponder = PanResponder.create({
        // Ask to be the responder:
        onStartShouldSetPanResponder: (evt, gestureState) => true,
        onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
        onMoveShouldSetPanResponder: (evt, gestureState) => true,
        onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,

        onPanResponderGrant: (evt, gestureState) => {
          // The gesture has started. Show visual feedback so the user knows
          // what is happening!

          // gestureState.d{x,y} will be set to zero now
        },
        onPanResponderMove: (evt, gestureState) => {
          // The most recent move distance is gestureState.move{X,Y}

          // The accumulated gesture distance since becoming responder is
          // gestureState.d{x,y}
        },
        onPanResponderTerminationRequest: (evt, gestureState) => true,
        onPanResponderRelease: (evt, gestureState) => {
          // The user has released all touches while this view is the
          // responder. This typically means a gesture has succeeded
        },
        onPanResponderTerminate: (evt, gestureState) => {
          // Another component has become the responder, so this gesture
          // should be cancelled
        },
        onShouldBlockNativeResponder: (evt, gestureState) => {
          // Returns whether this component should block native components from becoming the JS
          // responder. Returns true by default. Is currently only supported on android.
          return true;
        },
      });
    }

    render() {
      return (
        <View {...this._panResponder.panHandlers} />
      );
    }
  }

工作實例

要查看它的實際效果,請嘗試 PanResponder example in RNTester

Methods


參考

Methods

create()

static create(config)
@param {object} config所有響應者回調的增強版本,不僅提供典型的ResponderSyntheticEvent,還提供PanResponder手勢狀態。只需在每個典型的onResponder *回調中替換單詞Responder with PanResponder。例如,配置對像看起來像:
  • onMoveShouldSetPanResponder: (e, gestureState) => {...}
  • onMoveShouldSetPanResponderCapture: (e, gestureState) => {...}
  • onStartShouldSetPanResponder: (e, gestureState) => {...}
  • onStartShouldSetPanResponderCapture: (e, gestureState) => {...}
  • onPanResponderReject: (e, gestureState) => {...}
  • onPanResponderGrant: (e, gestureState) => {...}
  • onPanResponderStart: (e, gestureState) => {...}
  • onPanResponderEnd: (e, gestureState) => {...}
  • onPanResponderRelease: (e, gestureState) => {...}
  • onPanResponderMove: (e, gestureState) => {...}
  • onPanResponderTerminate: (e, gestureState) => {...}
  • onPanResponderTerminationRequest: (e, gestureState) => {...}
  • onShouldBlockNativeResponder: (e, gestureState) => {...}
通常,對於具有捕獲等價物的事件,我們在捕獲階段更新一次gestureState,並且也可以在冒泡階段使用它。

注意onStartShould *回調。 它們僅反映冒泡/捕獲到節點的開始/結束事件的更新的gestureState。 一旦節點是響應者,您就可以依賴手勢處理的每個開始/結束事件,並相應地更新gestureState。 (numberActiveTouches)可能不完全準確,除非您是響應者。



You May Also Like

0 意見