为什么我的自定义底部标签栏导航器的所有图标都在同时移动?

Why all the Icons of my custom bottom tab bar navigator are moving at the same time?

我正在尝试在 React Native 中创建一个 CustomBottomTabNavigator。到目前为止,我已经应用了线性渐变并在选项卡顶部添加了图标。我的目标是在焦点上时将图标向上移动,但由于某种原因,当焦点在其上时所有图标都向上移动只有一个图标。

代码如下:

import React, { useRef } from "react";
import {
  View,
  Text,
  StyleSheet,
  Animated,
  TouchableOpacity,
} from "react-native";
import * as Icons from "@expo/vector-icons";
import { LinearGradient } from "expo-linear-gradient";

const CustomTabBar = ({ state, descriptors, navigation }) => {
  let icons_name = ["home", "search", "tv", "user"];
  const animatedValueHome = useRef(new Animated.Value(0)).current;

  const translateY = animatedValueHome.interpolate({
    inputRange: [50, 100, 150],
    outputRange: [25, 50, 75],
  });

  const animationHome = (focus, name) => {
    console.log("name", name);
    navigation.navigate(name);
    if (focus === true) {
      Animated.timing(animatedValueHome, {
        toValue: -25,
        duration: 1000,
        useNativeDriver: false,
      }).start();
    } else {
      Animated.timing(animatedValueHome, {
        toValue: 0,
        duration: 1000,
        useNativeDriver: false,
      }).start();
    }
  };

  return (
    <LinearGradient
      colors={["#181823", "#3A3A46", "#3A3A46"]}
      start={{ x: 0, y: 0.5 }}
      end={{ x: 1, y: 0.5 }}
      locations={[0.2, 0.6, 0.3]}
      style={styles.container}
    >
      <View style={styles.tabs}>
        {state.routes.map((route, index) => {
          const isFocused = state.index === index;
          return (
            <Animated.View
              key={index}
              style={{
                flex: 1,
                flexDirection: "row",
                transform: [{ translateY }],
              }}
            >
              <Icons.Feather
                name={icons_name[`${index}`]}
                size={24}
                color="#fff"
                onPress={() => animationHome(isFocused, route.name)}
              />
            </Animated.View>
          );
        })}
      </View>
    </LinearGradient>
  );
};

export default CustomTabBar;

const styles = StyleSheet.create({
  container: {
    position: "absolute",
    height: 40,
    bottom: 20,
    right: 30,
    left: 20,
    elevation: 2,
    borderRadius: 20,
  },
  tabs: {
    flex: 1,
    flexDirection: "row",
    alignItems: "center",
    marginLeft: 48,
  },
});

这是正在发生的动画的gif Gif。我正在使用 react-native 的动画 API 来实现这个动画。

让每个子组件都有自己的动画值。

// In the parent component
{state.routes.map((route, index) => {
  const isFocused = state.index === index;
  return <Child isFocused={isFocused} />;
})}

// Then for each child
const Child = ({ isFocused }) => {
  const animatedValueHome = useRef(new Animated.Value(0)).current;

  const translateY = animatedValueHome.interpolate({
    inputRange: [50, 100, 150],
    outputRange: [25, 50, 75],
  });

  const animationHome = (focus, name) => {
    console.log("name", name);
    navigation.navigate(name);
    if (focus === true) {
      Animated.timing(animatedValueHome, {
        toValue: -25,
        duration: 1000,
        useNativeDriver: false,
      }).start();
    } else {
      Animated.timing(animatedValueHome, {
        toValue: 0,
        duration: 1000,
        useNativeDriver: false,
      }).start();
    }
  };

return (
  <Animated.View
    style={{
      transform: [{ translateY }],
    }}
  >
    <Icons.Feather onPress={() => animationHome(isFocused, route.name)}/>
  </Animated.View>
  );
}