You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Skia结合Gesture Handler实现捏合缩放时解决“向原点偏移”问题的求助

React Native Skia结合Gesture Handler实现捏合缩放时解决“向原点偏移”问题的求助

大家好,我目前正在用React Native Gesture Handler和React Native Skia做一个支持平移+捏合缩放的画布功能,平移已经正常工作了,但缩放的时候总是会往画布原点偏移,试了一些方案都没解决这个问题,想请各位帮忙看看怎么调整代码,实现围绕捏合焦点的正常缩放,避免这种“向原点漂移”的情况?

以下是我的代码:

const canvasRef = useCanvasRef();
const WORLD_W = 3000;
const WORLD_H = 2000;

const scale = useSharedValue(1);
const savedScale = useSharedValue(1);
const startScale = useSharedValue(1);
const translateX = useSharedValue(0);
const translateY = useSharedValue(0);
const startX = useSharedValue(0);
const startY = useSharedValue(0);
const focalX = useSharedValue(0);
const focalY = useSharedValue(0);

const pan = Gesture.Pan()
  .onBegin(() => {
    startX.value = translateX.value;
    startY.value = translateY.value;
  })
  .onUpdate((e) => {
    translateX.value = startX.value + e.translationX;
    translateY.value = startY.value + e.translationY;
  });

const pinch = Gesture.Pinch()
  .onBegin(() => {
    savedScale.value = scale.value;
  })
  .onUpdate((e) => {
    const next = Math.max(0.5, Math.min(3, startScale.value * e.scale));
    const dx = e.focalX - translateX.value;
    const dy = e.focalY - translateY.value;
    const factor = next / scale.value;
    translateX.value = e.focalX - dx * factor;
    translateY.value = e.focalY - dy * factor;
    scale.value = next;
  });

const transform = useDerivedValue<Transforms3d>(
  () => [
    { translateX: translateX.value },
    { translateY: translateY.value },
    { scale: scale.value },
  ],
  []
);

const gestures = Gesture.Simultaneous(pan, pinch);

return (
  <GestureDetector gesture={gestures}>
    <Canvas ref={canvasRef} style={[styles.canvas, { marginTop: statusBarHeight }]} >
      <Group transform={transform}>
        {values.map((s) => (
          <Circle
            key={s.id}
            cx={s.x * WORLD_W}
            cy={s.y * WORLD_H}
            r={s.size}
            color="white"
            opacity={0.3 + 0.7 * s.baseBrightness}
          />
        ))}
      </Group>
    </Canvas>
  </GestureDetector>
);
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#000"
  },
  canvas: {
    flex: 1,
    backgroundColor: "#050815"
  },
});

麻烦各位帮忙排查下问题所在,给出可行的修改方案,非常感谢!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 06:48:03