【问题标题】:React Native Animated - Card Won't flip backReact Native Animated - 卡片不会翻转
【发布时间】:2020-01-02 16:48:05
【问题描述】:

我一直在玩 React Native,我试图创建一个简单的卡片,可以在按下时翻转(来回):

我让它作为一个类组件工作,但现在我尝试重构为一个功能组件,它只翻转一种方式,但在第二次按下时不会返回。

有人可以告诉我我错过了什么吗? :/

我尝试使用 useState 和 useEffect 作为值和动画值等,但没有骰子...

import React from 'react';
import { View, StyleSheet, Animated, TouchableWithoutFeedback, Text } from 'react-native';
import TabBarIcon from '../components/TabBarIcon';

const App = () => {

        let animatedValue = new Animated.Value(0);
        let value = 0;

        animatedValue.addListener(({ value }) => {
            this.value = value;
        })

        let frontInterpolate = animatedValue.interpolate({
            inputRange: [0, 180],
            outputRange: ['0deg', '180deg'],
        })
        let backInterpolate = animatedValue.interpolate({
            inputRange: [0, 180],
            outputRange: ['180deg', '360deg']
        })
        let frontOpacity = animatedValue.interpolate({
        inputRange: [89, 90],
        outputRange: [1, 0]
        });

        let backOpacity = animatedValue.interpolate({
        inputRange: [89, 90],
        outputRange: [0, 1]
        });

        let elevationFront = animatedValue.interpolate({
          inputRange: [0, 25],
          outputRange: [10, 0]
          })

        let elevationBack = animatedValue.interpolate({
          inputRange: [155, 180],
          outputRange: [0, 10]
          })

        const flipCard = () => {
          if (value >= 90) {
            Animated.spring(animatedValue,{
              toValue: 0,
              friction: 8,
              tension: 10
            }).start();
          } else {
            Animated.spring(animatedValue,{
              toValue: 180,
              friction: 8,
              tension: 10
            }).start();
          }
        }


        const frontAnimatedStyle = {
        transform: [{ rotateY: frontInterpolate}]
        }
        const backAnimatedStyle = {
        transform: [{ rotateY: backInterpolate }]
        }


    return (
      <TouchableWithoutFeedback onPress={() => flipCard()} >
          <View>
                <Animated.View style={[frontAnimatedStyle, styles.paperFront,{elevation: elevationFront}, {opacity: frontOpacity}]}>
                  <Text style={{fontSize: 20,paddingTop: 8, paddingLeft: 8, color: 'black',lineHeight: 20}}>
                    Title Front {value} - <Text style={{fontSize: 8}}>KPI</Text>
                  </Text>
                    <View style={{position: "absolute", paddingTop: 3, right: 8}}>
                      <TabBarIcon style={{color: "black"}} name={"md-more"} />
                    </View>
                </Animated.View>

                <Animated.View style={[backAnimatedStyle, styles.paperBack, {elevation: elevationBack}, {opacity: backOpacity}]}>
                  <Text>Back title {value}</Text>
                </Animated.View>
            </View>
      </TouchableWithoutFeedback>
    );
}

const styles = StyleSheet.create({
    paperFront : {
      marginHorizontal: 15,
      backgroundColor: "white",
      minHeight: 200,
      borderRadius: 5,
      marginBottom: 15,

    },
    paperBack : {
      top: -215,
      marginHorizontal: 15,
      backgroundColor: "white",
      minHeight: 200,
      borderRadius: 5,
      marginBottom: 15,
    }
});

export default App

【问题讨论】:

    标签: javascript react-native react-animated


    【解决方案1】:

    你需要调用你的“value”而不是“this.value”,但既然你已经有了“value”参数,我建议你更改变量名:

     let val = 0;
    
     animatedValue.addListener(({ value}) => {
        val = value;
      });
    

    P.S:不要忘记将您对“value”变量的调用更改为“val”

    【讨论】:

    • 我也有同样的问题兄弟,我不明白 addListener 在这个动画中做了什么?以及为什么要设置 if >=90
    • 您好,30秒后可以自动翻转卡片吗?
    【解决方案2】:

    修复它

              if (this.value >= 90) {
    

    in expo

    【讨论】:

    • 嗨,我尝试按照您的代码进行操作,但由于某种原因,卡片没有在同一位置翻转
    猜你喜欢
    • 2022-01-13
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2017-04-03
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多