#reactjs #react-native #scrollview #flatlist
Вопрос:
Я читал много примеров с подобными проблемами, но я могу добиться ожидаемого поведения. Я думаю, что это не код, но реагирует родной язык.
У меня есть заголовок компонента (Представление) и плоский список, когда я прокручиваю вниз, я хочу скрыть заголовок компонента. Заголовок компонента успешно переведен в Y, но плоский список не перемещается вверх, и пустая область остается на месте.
Вот код:
const TestAnimatedFlatList = Animated.createAnimatedComponent(FlatList);
const [animatedValue, setanimatedValue] = useState(new Animated.Value(0));
let translateY = animatedValue.interpolate({
inputRange: [0, 230],
outputRange: [0, -230],
extrapolate: Extrapolate.CLAMP,
});
<View style={{ flex: 1 }}>
<Animated.View style={{
transform: [{translateY}],
backgroundColor: 'lightblue',
height: 230}}>
</Animated.View>
<TestAnimatedFlatList
data = {dataT}
renderItem={renderItem}
keyExtractor={ (item) => item }
style = {{flex: 1}}
onScroll={Animated.event(
[{nativeEvent: {
contentOffset: {
y: animatedValue
}
}
}],
{useNativeDriver: true}
)}
/>
Ожидаемое поведение должно заключаться в том, что, когда заголовок компонента исчезнет, плоский список до самого верха заменит его и покроет весь экран.
Фактическое поведение:
Я пробовал много чего, например: одновременно изменять размер и положение плоского списка, но это не отображается правильно, когда я прокручиваю и начинаю прыгать. Другая вещь заключалась в том, чтобы поместить плоский список в заголовок компонента (Представление) с тем же нежелательным результатом.
Из — за сложности заголовка моего компонента не рекомендуется помещать его в качестве заголовка в плоский список. Вот почему я использую анимированный компонент. Возможно, весь подход неверен.
Я использую: React Native 0.63.53
Комментарии:
1. Я продолжаю свой поиск и обнаружил, что если вы поставите верхнюю часть поля для изменения параллельно с переводом, эффект будет желательным, но он не работает на Android. Кто-нибудь знает, почему?
2. В конце дня я решил проблему, используя свойство FlatList «ListHeaderComponent».
Ответ №1:
Если цель состоит в том, чтобы скрыть заголовок в виде прокрутки, то вы должны отобразить свой заголовок в Flatlist
опоре ListHeaderComponent
, как показано ниже
<FlatList
ListHeaderComponent={() => (<View style={{ backgroundColor: 'lightblue', height: 230}}/>)}
data = {dataT}
renderItem={renderItem}
keyExtractor={ (item) => item }
style = {{flex: 1}}/>
Но если вы хотите анимировать, попробуйте выполнить код ниже:
const offset = useRef(new Animated.Value(0)).current;
const [animatedValue, setanimatedValue] = useState(new Animated.Value(0));
let scale = offset.interpolate({
inputRange: [0, 230],
outputRange: [1, 0],
extrapolate: "clamp"
});
<View style={{ flex: 1 }}>
<Animated.View style={{
transform: [{scale}],
backgroundColor: 'lightblue',
height: 230}}>
</Animated.View>
<Animated.FlatList
data = {dataT}
renderItem={renderItem}
keyExtractor={ (item) => item }
style = {{flex: 1}}
onScroll={Animated.event(
[{ nativeEvent: { contentOffset: { y: offset } } }],
{ useNativeDriver: true }
)}
/>
</View>
Комментарии:
1. Спасибо, что нашли время ответить. Я попробовал второй подход с тем же результатом, эффект изменился на масштаб, но пустое пространство остается там. Другими словами, плоский список не реорганизуется в верхнюю часть. Другой подход, который используют люди, — это изменение верхней части поля плоского списка, но затем анимация начинает мигать… У меня голова горит, когда я пытаюсь решить эту проблему…