使用react-native-gesture-handler中的PanGestureHandler时位置重置为0

ras*_*tay 4 javascript animation reactjs react-native react-native-gesture-handler

import React, { useRef, useState, useCallback } from 'react';
import { View, Animated } from 'react-native';
import { PanGestureHandler } from 'react-native-gesture-handler';


const InfoBox = ({ info }: Props) => {
  const [currenPos, setCurrentPos] = useState<number>(0);
  const translateY = useRef(new Animated.Value(0)).current;

  const onGestureEvent = useCallback(
    Animated.event(
      [
        {
          nativeEvent: {
            translationY: translateY,
          },
        },
      ],
      {
        useNativeDriver: true,
      },
    ),
    [],
  );

  const handleTransformStyle = {
    transform: [
      {
        translateY,
      },
      {
        translateX: -55,
      },
    ],
  };

  return (
    <View style={styles.container}>
      <PanGestureHandler
        onGestureEvent={onGestureEvent}
      >
        <Animated.View style={[styles.handleBar, handleTransformStyle]}>
          <View style={styles.separator} />
        </Animated.View>
      </PanGestureHandler>
    </View>
  );
};

export default InfoBox;
Run Code Online (Sandbox Code Playgroud)

我提供了一个非常简单的例子PanGestureHandler。第一次移动盒子时,它会移动到一个位置并停留在该位置。但是,如果我尝试再次移动它,它会从位置零开始,而不是从我离开它的同一位置开始。

任何帮助将非常感激。

编辑

我意识到这是由于偏移量重置而发生的。

ras*_*tay 9

我已经找到了解决这个问题的方法。

添加:onHandlerStateChangePanGestureHandler

 <PanGestureHandler
    onGestureEvent={onPanGestureEvent}
    onHandlerStateChange={onHandlerStateChange}
 >
...
</PanGestureHandler>
Run Code Online (Sandbox Code Playgroud)

然后,创建一个onHandlerStateChange像这样的函数:

  const onHandlerStateChange = useCallback(() => {
    translateY.extractOffset();
  }, []);
Run Code Online (Sandbox Code Playgroud)

translateY.extractOffset();施展了魔法。它设置偏移值。唷!