首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >React原生Animated.timing()多个动画

React原生Animated.timing()多个动画
EN

Stack Overflow用户
提问于 2021-02-04 09:54:52
回答 1查看 548关注 0票数 0

我有一个使用Animated.timing()的动画,当条件为mapIsCentered = true时,它可以滑动一个组件来查看。当条件不满足时,该组件就会很不雅观地消失。我想让它随着情况的变化而滑入滑出。

要注意的一件事是,mapIsCentered状态在不同的屏幕上更新,并作为道具传递给我正在使用的组件。我已经记录了状态,当地图移动时,它会更新。

**幻灯片的效果与预期一致

感谢@Ashwith的第一个答案

代码语言:javascript
运行
复制
  const values = useRef(new Animated.ValueXY({ x: 0, y: 120 })).current;

  useEffect(() => {
    Animated.timing(values, {
      toValue: mapIsCentered ? { x: 0, y: 0 } : { x: 0, y: 120 },
      duration: 500,
      useNativeDriver: false,
    }).start();
  }, [mapIsCentered]);
代码语言:javascript
运行
复制
        {!walkInProgress && !hasOnGoingWalks && (
          <Animated.View
            style={{
              transform: [{ translateY: values.y }],
            }}
          >
            <WeatherToast
              translations={translations}
              loading={loading}
              weather={weather}
            />
          </Animated.View>

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2021-02-04 14:08:51

我已经改变了结构,希望它对你有用...

点心:https://snack.expo.io/@ashwith00/excited-orange

App.js

代码语言:javascript
运行
复制
const walkInProgress = false , hasOnGoingWalks = false;

export default function App() {
  const { width } = useWindowDimensions();
  const [mapCentered, setMapCentered] = React.useState(false)

  const toggle = () => {
    setMapCentered((ct) => !ct);
  };
  
  return (
    <View style={styles.container}>
      <WeatherToast mapCentered={mapCentered && !walkInProgress && !hasOnGoingWalks} />
      <Button title="shift" onPress={toggle} />
    </View>
  );
}

WeatherTost.js

代码语言:javascript
运行
复制
export default ({ mapCentered }) => {
  const [visible, setVisible] = useState(mapCentered);
  const { width } = useWindowDimensions();

  const values = React.useRef(new Animated.ValueXY({ x: 0, y: 120 })).current;

  React.useEffect(() => {
    if (mapCentered) {
      setVisible(true);
      Animated.timing(values, {
        toValue: { x: 0, y: 0 },
        duration: 300,
      }).start();
    } else {
      Animated.timing(values, {
        toValue: { x: width, y: 0 },
        duration: 300,
      }).start(({ finished }) => {
        if (finished) {
          setVisible(false);
        }
      });
    }
  }, [mapCentered]);

  const styles = [];

  return visible ? (
    <Animated.View
      style={{
        width: 200,
        height: 200,
        position: 'absolute',
        backgroundColor: 'red',
        transform: [
          {
            translateX: values.x,
          },
          {
            translateY: values.y,
          },
        ],
      }}
    />
  ) : (
    <View />
  );
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66038298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档