如何在Animated.Event中为Animated Value追加数值而非替换?
解决React Native Animated事件累加值的问题
我来帮你搞定这个问题!你遇到的错误核心原因很明确:setValue()方法需要传入具体的数字,但你传入了Animated.add()返回的Animated.Value动画节点对象,导致类型不匹配,才出现了"translateX":"[object Object]0"这种奇怪的错误提示。
要实现每次触摸事件后touchX = touchX + translationX的累加效果,这里有两种可靠的解决方案:
方案一:利用Animated.event的listener回调处理累加
这种方式适合不需要平滑过渡的场景,直接在事件回调里拿到触摸增量,同步更新你的touchX和touchY:
Animated.event( // 第一个参数:先临时接收translation的数值,不直接绑定到touchX/Y [{ nativeEvent: { translationX: new Animated.Value(0), translationY: new Animated.Value(0) } }], { useNativeDriver: false, // 在listener回调里处理累加逻辑 listener: (event) => { const { translationX, translationY } = event.nativeEvent; // 获取touchX当前的数值,加上本次的translation增量 const newTouchX = this.touchX._value + translationX; const newTouchY = this.touchY._value + translationY; // 用setValue设置新的数值 this.touchX.setValue(newTouchX); this.touchY.setValue(newTouchY); } } )(event);
小提示:
_value是Animated.Value的内部属性,用来存储当前的数值。如果担心内部属性变更,也可以用Animated.getValue(this.touchX)来获取当前值,在非native驱动场景下两种方式都安全可用。
方案二:使用动画节点链式操作(适合需要平滑过渡的场景)
如果你希望累加的过程有平滑的动画过渡,可以用Animated.timing来将touchX/Y过渡到新的数值:
Animated.event( [{ nativeEvent: { translationX: new Animated.Value(0), translationY: new Animated.Value(0) } }], { useNativeDriver: false, listener: (event) => { const { translationX, translationY } = event.nativeEvent; // 平滑过渡touchX到新的累加值 Animated.timing(this.touchX, { toValue: this.touchX._value + translationX, duration: 100, // 可以根据需求调整过渡时长 useNativeDriver: false, }).start(); // 同理处理touchY Animated.timing(this.touchY, { toValue: this.touchY._value + translationY, duration: 100, useNativeDriver: false, }).start(); } } )(event);
为什么你原来的写法行不通?
你之前的代码:
this.touchX.setValue( Animated.add(this.touchX, new Animated.Value(translationX)) );
这里Animated.add(a, b)返回的是一个新的Animated.Value对象,它代表的是一个动画计算节点,而不是具体的数字。setValue()只能接收数字类型,所以当React Native尝试把这个对象当作translateX的值时,就会把对象转成字符串[object Object],再和其他值拼接,最终出现了你看到的错误。
内容的提问来源于stack exchange,提问作者Budaa
相关产品推荐
相关产品推荐

