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

2023年useAnimatedGestureHandler在react-native-gesture-handler中是否仍有效及组合手势问题

react-native-gesture-handler 手势组合问题及useAnimatedGestureHandler适用性疑问

我关注react-native-gesture-handler的正确使用方式,官方文档指出Gesture Handlers已废弃,应使用GestureDetector。我需要组合手势,尝试编写了如下代码:

const gesture = useMemo(() => Gesture.Tap().onStart(() => {}), []);
const gesture2 = useAnimatedGestureHandler<PanGestureHandlerGestureEvent>({
  onStart: () => {},
});

const combined = Gesture.Exclusive(gesture, gesture2);
return (
  <GestureDetector gesture={gesture}>
    <Animated.View style={styles.button} disabled={disabled} android_disableSound>
      <Animated.View style={styles.ripple} />
      <Text style={styles.text}>{children}</Text>
    </Animated.View>
  </GestureDetector>
);

但无法正常运行,gesture2下方出现红色下划线,提示错误:

Argument of type 'OnGestureEvent<PanGestureHandlerGestureEvent>' is not assignable to parameter of type 'Gesture'.ts(2345)

请问useAnimatedGestureHandler是否仍有适用场景,还是已被废弃?


问题原因

你报错的核心是**useAnimatedGestureHandler返回的不是Gesture类型对象**,而Gesture.Exclusive要求传入的必须是通过Gesture.*(比如Gesture.Tap()、Gesture.Pan())创建的手势实例,两者不属于同一API体系,不能混用。

useAnimatedGestureHandler的现状

它并没有被完全废弃,但属于旧版手势体系的API,现在官方主推的是新版的Gesture API(也就是你用的Gesture.Tap()、GestureDetector这套)。

正确的手势组合写法

如果你要组合Tap和Pan手势,应该用新版API统一创建:

import { Gesture, GestureDetector } from 'react-native-gesture-handler';
import Animated from 'react-native-reanimated';

// 组件内部逻辑
const gesture = useMemo(() => {
  const tapGesture = Gesture.Tap().onStart(() => {
    // 处理Tap手势开始逻辑
  });
  
  const panGesture = Gesture.Pan().onStart(() => {
    // 处理Pan手势开始逻辑
  });
  
  // 用Exclusive组合两个手势,同一时间只有一个生效
  return Gesture.Exclusive(tapGesture, panGesture);
}, []);

return (
  <GestureDetector gesture={gesture}>
    <Animated.View style={styles.button} disabled={disabled} android_disableSound>
      <Animated.View style={styles.ripple} />
      <Text style={styles.text}>{children}</Text>
    </Animated.View>
  </GestureDetector>
);

useAnimatedGestureHandler的适用场景

只有当你维护旧版代码(使用PanGestureHandler这类旧组件)时,才需要用到它。新版API中,所有手势逻辑都可以通过Gesture.*的链式调用完成,比如要结合Reanimated动画,直接在手势的回调里使用动画API即可:

const panGesture = Gesture.Pan()
  .onStart((event) => {
    // 在这里直接处理动画逻辑,比如更新SharedValue
  })
  .onUpdate((event) => {
    // 实时更新动画状态
  });

内容的提问来源于stack exchange,提问作者seven

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:47:07