diff --git a/src/zoom.tsx b/src/zoom.tsx index 70ce1c8d6a43e711f06b93d1eda3b44a3ad9a659..cdc2713470f2d332b8bf3e9c97e38fd9b78281df 100644 --- a/src/zoom.tsx +++ b/src/zoom.tsx @@ -4,6 +4,7 @@ import Animated, { useSharedValue, useAnimatedStyle, useDerivedValue, + withDecay, withTiming, cancelAnimation, runOnJS, @@ -120,11 +121,22 @@ export function Zoom(props: Props) { } } }) - .onEnd(() => { + .onEnd((event) => { if (isPinching.value || !isZoomed.value) return; - panTranslateX.value = 0; - panTranslateY.value = 0; + const maxTranslateX = (viewWidth.value / 2) * scale.value - viewWidth.value / 2; + const minTranslateX = -maxTranslateX; + translationX.value = withDecay({ + velocity: event.velocityX, + clamp: [minTranslateX, maxTranslateX] + }); + + const maxTranslateY = (viewHeight.value / 2) * scale.value - viewHeight.value / 2; + const minTranslateY = -maxTranslateY; + translationY.value = withDecay({ + velocity: event.velocityY, + clamp: [minTranslateY, maxTranslateY] + }); }); const pinch = Gesture.Pinch()