Сводка
У меня есть значок экспозиции в виде стрелки в заголовке аккордеона, который я пытаюсь анимировать, чтобы перевернуть на 180 градусов при нажатии, чтобы пользователь знал, что можетбыть закрытым или открытым. Эти заголовки отображаются динамически;Я не знаю, сколько будет входить, поскольку оно основано на том, сколько объектов пользователь открыл в другом программном обеспечении через API веб-сокетов.
Я получил анимацию для работы, но она анимирует все значкии не только тот, на который я нажимаю.
Кроме того, чтобы понять, как работает код, я использую аккордеонный компонент из библиотеки, показанной в операторе импорта в разделе кода.
То, что я пытался
Я пытался подражать этому подходу: Реагировать на родной: только анимация одного из нескольких элементов
Кажется, это немного отличается от моей проблемы (они работают только с размером шрифта), поэтому я не смог успешно применить это решение к своему коду.
Я заметил, что в их коде есть тег, связанный с размером шрифта в штате. Я уверен, что именно поэтому их отдельные иконки анимируются при нажатии, а не у всех. Однако я не уверен, как применить эту концепцию к моему коду.
Состояние содержит значение анимации
this.state={
activeSections: [],
animValue: new Animated.Value(250),
}
}
Эта функция вызывается при нажатии заголовка.
handleSelect = () => {
this.state.animValue._value > 250
? Animated.timing(this.state.animValue, {
toValue: 250,
duration: 500
}).start()
: Animated.timing(this.state.animValue, {
toValue: 450,
duration: 500
}).start();
};
Это функция, которую вызывает аккордеон, чтобы визуализировать каждый заголовок отдельно. То есть, если компонент монтируется с 10 заголовками, эта функция вызывается 10 раз.
_renderHeader = section => {
let rotateAnimation = this.state.animValue.interpolate({
inputRange: [250, 450],
outputRange: ['0deg', '180deg']
});
const customStyle = {
transform:[{rotate:rotateAnimation}]
};
return (
<View style={styles.header}>
<View style={styles.headerTextContainer}>
<Text style={styles.headerText}>{section['title']}</Text>
<Animated.View style={[{marginLeft: 10}, customStyle]}>
<TouchableWithoutFeedback >
<Ionicons name="md-arrow-dropdown" size={20} color={EStyleSheet.value('$textColor')} />
</TouchableWithoutFeedback>
</Animated.View>
</View>
</View>
);
};
Ниже представлена функция аккордеона, которая срабатывает при каждом щелчке по заголовку. Здесь я запускаю функцию анимации.
_updateSections = activeSections => {
console.log(activeSections)
this.handleSelect()
//unrelated code...
Дополнительная информация
Я попытался смоделировать попытку, аналогичную ссылке для перекуса. Это включало изменение состояния на:
this.state={
activeSections: [],
animValue: [new Animated.Value(250),new Animated.Value(250),new Animated.Value(250),new Animated.Value(250),new Animated.Value(250),]
}
и настройку всех других функций для обработки ввода с помощью значения массива. Я также установил стиль иконки, чтобы иметь fontSize this.state.animValue, чтобы попытаться индивидуализировать каждый компонент.
Я столкнулся с этой ошибкой во время моей попытки:
TypeError: TypeError: undefined не является объектом (оценивается как _this.state.animValue [i] .interpolate ')