Как получить текущее значение анимированных значений с параметром useNativeDriver, установленным в true?
Я пытаюсь получить текущее значение animated.Value
это имеет возможность useNativeDriver
установите в true, но это не работает. С другими анимированными значениями, которые имеют одинаковую опцию со значением false, он работает отлично.
4 ответа
Это происходит потому, что, когда для useNativeDriver установлено значение true, анимация больше не выполняется в потоке JS, а переходит в поток собственного пользовательского интерфейса, и, таким образом, текущее анимированное значение не обновляется на стороне JS, как мы ожидали. Это вызывает резкое поведение ближе к концу цикла анимации.
Я нашел обходной путь для таких сценариев, когда собственный драйвер портит наше смещение и дает скачок в нашей анимации ближе к концу.
Создайте псевдоанимированное значение (которое не будет использоваться для какой-либо анимации) и продолжайте обновлять его вместе с исходным анимированным значением. Наконец, когда ваша анимация закончилась (например, распад, пружина и т. Д.), Установите смещения и текущий угол с псевдо-значением, как показано ниже:
const angle = useRef(new Animated.Value(0)).current; //original value used in animation; will run on native side
const psuedoAngle = useRef(new Animated.Value(0)).current; //only to track the value on JS side
//using PanResponder
...
onPanResponderMove: (evt, gestureState) => {
angle.setValue(some_value);
psuedoAngle.setValue(same_value);
},
onPanResponderRelease: (evt, {vx, vy}) => {
// calculate your velocity
...
const decay1 = Animated.decay(angle,{
velocity: velocity,
deceleration: 0.997,
useNativeDriver: true
}
);
const decay2 = Animated.decay(psuedoAngle,{
velocity: velocity,
deceleration: 0.997,
useNativeDriver: false //this will keep your pseudo value intact
}
);
//set offset and current angle in callback as below
Animated.parallel([decay1,decay2]).start(() => {
psuedoAngle.flattenOffset();
angle.setOffset(psuedoAngle._value); //correct value passed to original value
psuedoAngle.setOffset(psuedoAngle._value);
angle.setValue(0);
psuedoAngle.setValue(0);
});
}
Вы можете подписаться на изменение его значения:this.state.animatedValue.addListener(({value}) => {/* your logic */});
Number.parseFloat(JSON.stringify(animatedValue))
Попробуйте, это сработает?
Я столкнулся с точно такой же проблемой, и использование функции addListener не решило ее для меня. Я создал ссылку и изменил это значение внутри функции обратного вызова в методе start() следующим образом:
Таким образом, вы гарантируете, что каждый раз, когда анимированное значение обновляется, оно сохраняется в ссылке и может быть использовано, например, для сравнения различий значений. Надеюсь это поможет!