0

My main code:

const [pan] = useState(new Animated.ValueXY());
const panResponder: PanResponderInstance = PanResponder.create({
    onStartShouldSetPanResponder: (evt, gestureState) => {
      setShowInsertShapeMenu(false);
      return !moveCursor;
    },
    onMoveShouldSetPanResponder: (evt, gestureState) => {
      return (
        !moveCursor &&
        (Math.abs(gestureState.dx) > 2 || Math.abs(gestureState.dy) > 2)
      );
    },
    onPanResponderGrant: () => {
      pan.setOffset({
        x: pan.x._value,
        y: pan.y._value,
      });
    },
    onPanResponderMove: (evt, gestureState) => {
      if (evt.nativeEvent.touches.length === 2) {
        let dx =
          evt.nativeEvent.touches[0].pageX - evt.nativeEvent.touches[1].pageX;
        let dy =
          evt.nativeEvent.touches[0].pageY - evt.nativeEvent.touches[1].pageY;
        let distance = Math.sqrt(dx * dx + dy * dy);
        const newScale = distance / 400;
        if (
          newScale >= Hardcoded.minScalePan &&
          newScale <= Hardcoded.maxScalePan
        ) {
          setScale(newScale);
        }
      } else {
        const scaledDx = gestureState.dx / scale;
        const scaledDy = gestureState.dy / scale;

        pan.setValue({
          x: scaledDx,
          y: scaledDy,
        });
      }
    },
    onPanResponderRelease: () => {
      pan.flattenOffset();
    },
  });



UI:
 <View>
      <View
        ref={viewRef}
        style={{
          backgroundColor: "rgb(240, 240, 240)",
          height: '100%',
          width: "100%",
        }}
        {...panResponder.panHandlers}
      >
        <Animated.View
          style={{
            transform: [
              { translateX: pan.x },
              { translateY: pan.y },
              { scale: scale },
            ],
          }}
        >
          {children}
        </Animated.View>
      </View>
</View>

So basically using pan values i can move the whiteboard (just like in figma) or you can say can move the children inside Animated.View. Children is a list of shapes like rectangle, circle, etc. Now I want to restrict the pan movement to height: 1600 and width:1600. I have tried everything but is not able to achieve the intended functionality.

Thanks in advance for answering.

I tried by putting basic if conditions to check that new pan x > 0 and < 1600. Then only I set it. Same for pan y. Also tried asking chat GPT. but didn't got any solution from there.

Abe
  • 4,500
  • 2
  • 11
  • 25

0 Answers0