#react-native #react-animated
#react-native #реагирующий анимированный
Вопрос:
Можно получить текущее анимированное значение, используя ._value, в то время как nativeDriver имеет значение false .
Но возможно ли получить текущее значение, когда nativeDriver имеет значение true?
Есть ли у нас какие-либо обходные пути?
Комментарии:
1. Это звучит как проблема XY . Что вы на самом деле пытаетесь сделать?
2. @Kraylog Я пытаюсь реализовать список привязки. Поэтому необходимо вычислить индекс, используя значение animated.value в реальном времени. Таким образом, анимированное значение привязывается к scrollview.
3. Необходимо отображать заголовок на основе элемента, который находится в центре экрана.
Ответ №1:
используйте addListener следующим образом:
this._animatedValue = new Animated.Value(0);
this._animatedValue.addListener(({value}) => this._value = value);
Animated.timing(this._animatedValue, {
toValue: 100,
duration: 500
}).start();
Ответ №2:
Я нашел обходной путь для подобных сценариев, когда собственный драйвер портит наше смещение и дает скачок в нашей анимации ближе к концу.
Создайте псевдо анимированное значение (которое не будет использоваться ни для какой анимации) и продолжайте обновлять его вместе с вашим исходным анимированным значением. Наконец, когда ваша анимация закончится (например, decay, spring и т. Д.), Установите смещения и текущий угол с псевдо-значением, как показано ниже:
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);
});
}