react-native [Expo]:我可以增加 PanResponder 的输入采样率吗?

如何解决react-native [Expo]:我可以增加 PanResponder 的输入采样率吗?

我目前正在为我的 Expo 应用程序实现基于 react-native-svg 的绘图输入(这是对这个答案的轻微修改link)。我使用 PanResponder注册移动事件并创建不同的路径,然后在用户在视图上绘制时将这些路径显示为多个 polyline 元素,如下所示:

const GesturePath: React.FC<GesturePathProps> = ({
  paths,color,width,height,strokeWidth,}) => {
  return (
    <Svg height='100%' width='100%' viewBox={`0 0 ${width} ${height}`}>
      {paths.map((path) => (
        <polyline
          key={path.id}
          points={path.points.map((p) => `${p.x},${p.y}`).join(" ")}
          fill='none'
          stroke={color}
          strokeWidth={strokeWidth}
        />
      ))}
    </Svg>
  );
};

不幸的是,我生成的线条非常粗糙和参差不齐,我相信 PanResponder.onPanResponderMove 处理程序的触发频率太低,无法满足我的需要(在 Android Pixel 4 模拟器上平均每 50 毫秒调用一次,我不是确定我是否可以从真实设备中获得更多期望)。

在我的用例中,也许有比 PanResponder 更适合处理手势的候选者?

我已经实现了一个平滑函数(基于这个答案 link),它的行为是正确的,但由于这些点彼此相距很远,用户的输入会明显失真。

这是一个没有平滑的例子:

SVG drawing example

在我的 GestureHandler 实现下面:

const GestureRecorder: React.FC<GestureRecorderProps> = ({ addpath }) => {
  const buffRef = useRef<Position[]>([]);
  const pathRef = useRef<Position[]>([]);
  const timeRef = useRef<number>(Date.Now());
  const pathIdRef = useRef<number>(0);

  const panResponder = useRef(
    PanResponder.create({
      onStartShouldSetPanResponder: () => true,onStartShouldSetPanResponderCapture: () => true,onMoveShouldSetPanResponder: () => true,onMoveShouldSetPanResponderCapture: () => true,onPanResponderMove: (event) => {
        // workaround for release event
        // not working consistently on android
        if (Date.Now() - timeRef.current > RELEASE_TIME) {
          pathIdRef.current += 1;
          pathRef.current = [];
          buffRef.current = [];
        }
        timeRef.current = Date.Now();

        pathRef.current.push({
          x: event.nativeEvent.locationX,y: event.nativeEvent.locationY,});

        addpath({
          points: calculateSmoothedpath(event),id: pathIdRef.current,});
      },// not working on Android
      // release event is not consistent
      // onPanResponderRelease: () => {
      // pathIdRef.current += 1;
      // pathRef.current = [];
      // buffRef.current = [];
      // },})
  ).current;

  const calculateSmoothedpath = (event: GestureResponderEvent) => { 
    // implementation
    // ...
    // see: https://stackoverflow.com/questions/40324313/svg-smooth-freehand-drawing
  }

  return (
    <View
      style={StyleSheet.absoluteFill}
      collapsable={false}
      {...panResponder.panHandlers}
    />
  );
};

旁注

我没有发现任何关于 PanResponder 的文档表明存在采样率配置选项,所以我完全接受替代方案(甚至完全放弃 PanResponder + 原生 SVG 方法),只要我不必弹出 expo 项目并且我可以控制布局(我不想使用带有特定 UI 的外部组件)。

我曾尝试使用 expo-pixi 库(特别是 Sketch 组件),但似乎不再维护该存储库,并且在使用它时 expo 客户端始终崩溃。

解决方法

在我发布问题后,我一直在尝试不同的解决方案,但最终对我的 GestureHandler 实现略有更改。 我现在使用 react-native-gesture-handler 中的 PanGestureHandler 而不是 PanResponder。 这个组件让用户指定一个 minDist 属性来调整激活,这里是文档中的描述:

在处理程序激活之前手指(或多个手指)需要移动的最小距离。以点数表示。

在新实现下方:

<PanGestureHandler
  minDist={1}
  onGestureEvent={(e) => {
    // same code from the previous onPanResponderMove
  }
>
  <View style={StyleSheet.absoluteFill} collapsable={false} />
</PanGestureHandler>

我在运行模拟器时也高估了我的 GPU 能力,在构建 APK 并在真实设备上进行测试后,我意识到绘图输入的行为更加流畅。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?