你将如何在 react-native 中实现双指缩放?

IT技术 ios reactjs react-native zooming
2021-05-24 15:45:00

我一直在研究 PanResponder。我目前的工作假设是,我会检测是否有两个向外移动的触摸,如果是,则增加onPanResponderMove函数中的元素大小

这似乎是一种混乱的方法。有没有更顺畅的方法?

4个回答

如果您只需要简单的捏缩放功能,只需使用 ScrollView(此处为文档

只需根据需要提供maximumZoomScale(大于一)和minimumZoomScale

注意:此答案与平移响应器无关,而是解决了如何在 React Native 中实现捏合缩放的主要问题。

在没有 expo 的情况下使用 Expo 或 React-Native,您可以PinchGestureHandler从 react-native-gesture-handler导入这里还有其他手势处理程序:react-native-gesture-handler

import { PinchGestureHandler } from 'react-native-gesture-handler';

在示例中,假设我们正在使用相机并且我们想要检测缩放的捏合:

<PinchGestureHandler
    onGestureEvent={this.onPinchGestureEvent}
  >
    <View>
          <Camera
              type={cameraType}
              flashMode={flashMode}
              zoom={zoom}
              style={styles.preview}
              ref={camera => this.camera = camera}
          />
    </View>
        </PinchGestureHandler>

然后我们可以像这样对手势事件采取行动:

   onPinchGestureEvent = event => {
      console.log(event.nativeEvent.scale);
    }

除了查看平移响应器之外,您还需要查看手势响应器系统

特别evt是响应者返回的那个。这是 React-Native 文档所说的。

evt is a synthetic touch event with the following form:

nativeEvent
    changedTouches - Array of all touch events that have changed         since the last event
    identifier - The ID of the touch
    locationX - The X position of the touch, relative to the element
    locationY - The Y position of the touch, relative to the element
    pageX - The X position of the touch, relative to the root element
    pageY - The Y position of the touch, relative to the root element
    target - The node id of the element receiving the touch event
    timestamp - A time identifier for the touch, useful for velocity calculation
    touches - Array of all current touches on the screen

现在您有了触摸,您可以确定哪些区域/对象正在被触摸并相应地调整项目。

您需要使用手势响应系统

简单的捏合和缩放手势需要平移和缩放。

要计算平移和缩放因子,您需要存储触摸事件并使用触摸位置增量。

我已经编写了一个 NPM module来执行此操作。

react-native-pinch-zoom-responder