美文网首页ReactNative
React Native 动画之 Animated.timing

React Native 动画之 Animated.timing

作者: Kevin_小飞象 | 来源:发表于2019-03-20 16:18 被阅读0次

    Animated提供了三种动画类型。每种动画类型都提供了特定的函数曲线,用于控制动画值从初始值变化到最终值的变化过程:

    动画还可以使用组合函数以复杂的方式进行组合:

    Animated.timing()

    效果图

    animated.jpg

    实例代码

    import React, { Component } from 'react';
    import {
      StyleSheet,
      View,
      Animated,
      Easing
    } from 'react-native';
    export default class App extends Component { 
      constructor(props) {  //构造函数
        super(props);
        this.spinValue = new Animated.Value(0); //使用 Animated.Value 声明了一个 spinValue 变量,并传了一个 0 作为初始值。
      }
    
      componentDidMount() { 
        this.spin();    //app加载后运行动画
      }
    
      spin() {
        this.spinValue.setValue(0);   //重置为0
        Animated.timing( //并驱动 this.spinValue 的值以 Easing.linear 的动画方式在 4000 毫秒从 0 变成 1。
          this.spinValue,
          {
            toValue: 1,
            duration: 4000,
            easing: Easing.linear
          }
        ).start(() => { this.spin() }); //调用 start(),并将 this.spin 作为回调传递给 start,它将在(一次)动画完成之后调用,这也是创建无穷动画的一种基本方式。
      }
      render() {
        //创建了一个 spin 变量,并调用了 this.spinValue 的 interpolate 方法。
        //interpolate 方法可以在任何一个 Animated.Value 返回的实例上调用,该方法会在属性更新之前插入一个新值,如将 0~1 映射到 1~10。
        //在我们的demo中,利用 interpolate 方法将数值 0~1 映射到了 0deg~360deg。我们传递了 inputRange 和 outputRange 参数给interpolate 方法,并分别赋值为[0, 1] 和 & [‘0deg’, ‘360deg’]。
        const spin = this.spinValue.interpolate({
          inputRange: [0, 1],
          outputRange: ['0deg', '360deg']
        });
        return (
          <View style={styles.container}>
            <Animated.Image
              style={{
                width: 227,
                height: 200,
                transform:[{rotate:spin}]
              }}
              source={{ uri: 'https://s3.amazonaws.com/media-p.slid.es/uploads/alexanderfarennikov/images/1198519/reactjs.png'}}
            />
            </View>
        )
      }
    }
    
    const styles = StyleSheet.create({  
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: 'white'
      },
      
    });
    

    附:Easing源码

    创建复杂动画

    效果图

    animated02.jpg

    实例代码

    import React, { Component } from 'react';
    import {
      StyleSheet,
      View,
      Animated,
      Easing,
      Text
    } from 'react-native';
    export default class App extends Component { 
      constructor(props) {  
        super(props);
        this.animatedValue = new Animated.Value(0); 
      }
    
      componentDidMount() { 
        this.animate();    
      }
    
      animate() {
        this.animatedValue.setValue(0); 
        Animated.timing( 
          this.animatedValue,
          {
            toValue: 1,
            duration: 2000,
            easing: Easing.linear
          }
        ).start(() => { this.animate() }); 
      }
      render() {
        const marginLeft = this.animatedValue.interpolate({
          inputRange: [0, 1],
          outputRange: [0, 300]
        });
        const opacity = this.animatedValue.interpolate({
          inputRange: [0, 0.5, 1],
          outputRange: [0, 1, 0]
        });
    
        const movingMargin = this.animatedValue.interpolate({
          inputRange: [0, 0.5, 1],
          outputRange: [0, 300, 0]
        });
    
        const textSize = this.animatedValue.interpolate({
          inputRange: [0, 0.5, 1],
          outputRange: [18, 32, 18]
        });
    
        const rotateX = this.animatedValue.interpolate({
          inputRange: [0, 0.5, 1],
          outputRange: ['0deg', '180deg', '0deg']
        });
        return (
          <View style={styles.container}>
            <Animated.View
              style={{
                marginLeft,
                width: 30,
                height: 40,
                backgroundColor:'red'
              }}
            />
    
            <Animated.View
              style={{
                opacity,
                marginTop:10,
                width: 30,
                height: 40,
                backgroundColor: 'blue'
              }}
            />
    
            <Animated.View
              style={{
                marginLeft:movingMargin,
                marginTop: 10,
                width: 30,
                height: 40,
                backgroundColor: 'orange'
              }}
            />
    
            <Animated.Text
              style={{
                fontSize: textSize,
                marginTop: 10,
                color: 'green',
              }}
            >
              Animated Text!
            </Animated.Text>
    
            <Animated.View
              style={{
                transform: [{rotateX}],
                marginTop: 50,
                width: 40,
                height: 30,
                backgroundColor: 'black'
              }}
            >
              <Text style={{ color: 'white' }}>Hello from TransformX</Text>
            </Animated.View>
    
            </View>
        )
      }
    }
    
    const styles = StyleSheet.create({  
      container: {
        flex: 1,
        paddingTop:150,
        backgroundColor: 'white'
      },
      
    });
    

    相关文章

      网友评论

        本文标题:React Native 动画之 Animated.timing

        本文链接:https://www.haomeiwen.com/subject/sxhtvqtx.html