React Native动画-Animated

动画类型:

  • spring:基础的单次弹跳物理模型
  • timing:从时间范围映射到渐变的值
  • decay:以一个初始速度开始并且逐渐减慢停止

创建动画的参数:

  • value:AnimatedValue | AnimatedValueXY(X轴或Y轴 | X轴和Y轴)
  • config:SpringAnimationConfig | TimingAnimationConfig | DecayAnimationConfig(动画的参数配置)

值类型:

  • AnimatedValue:单个值
  • AnimatedValueXY:向量值

多数情况下,AnimatedValue可以满足需求(上面的示例),但有些情况下我们可能会需要AnimatedValueXY

比如:我们需要图片沿着X轴和Y轴交叉方向,向右下角移动一小段距离。

组件类型:

  • Animated.Text
  • Animated.Image
  • Animated.View:可以用来包裹任意视图
  • Animated.createAnimatedComponent():其它组件(较少用,用Animated.View包裹可以达到同样的效果
  • 让我们来看一个示例:图片透明度2秒内从不透明到全透明,线性变化。
    class Demo8 extends Component {
      // 构造
      constructor(props) {
          super(props);
          // 初始状态
          this.state = {
              fadeOutOpacity: new Animated.Value(0),
          };
      }
      render() {
          return (
            <Animated.View // 可选的基本组件类型: Image, Text, View(可以包裹任意子View)
                style = {{flex: 1,alignItems: ‘center‘,justifyContent: ‘center‘,
                        opacity: this.state.fadeOutOpacity,}}>
                <Image source = {{uri: ‘http://i.imgur.com/XMKOH81.jpg‘}}
                    style = {{width: 400,height: 400}}/>
            </Animated.View >
          );
      }
      startAnimation() {
          this.state.fadeOutOpacity.setValue(1);
          Animated.timing(this.state.fadeOutOpacity, {
              toValue: 0,
              duration: 2000,
              easing: Easing.linear,// 线性的渐变函数
          }).start();
      }
      componentDidMount() {
          this.startAnimation();
      }
    }
    AppRegistry.registerComponent(‘Demo8‘, () = >Demo8);

插值函数:

将输入值范围转换为输出值范围,如下:将0-1数值转换为0deg-360deg角度,旋转View时你会用到

//其中,transform是一个变换数组,常用的有scale, scaleX, scaleY, translateX, translateY, rotate, rotateX, rotateY, rotateZ:
...
transform: [  // scale, scaleX, scaleY, translateX, translateY, rotate, rotateX, rotateY, rotateZ
    {scale: this.state.bounceValue},  // 缩放
    {rotate: this.state.rotateValue.interpolate({ // 旋转,使用插值函数做值映射
        inputRange: [0, 1],
        outputRange: [‘0deg‘, ‘360deg‘]})},
    {translateX: this.state.translateValue.x}, // x轴移动
    {translateY: this.state.translateValue.y}, // y轴移动
],
...
this.state.rotateValue.interpolate({ // 旋转,使用插值函数做值映射
        inputRange: [0, 1],
        outputRange: [‘0deg‘, ‘360deg‘]})

组合动画:

  • parallel:同时执行
  • sequence:顺序执行
  • stagger:错峰,其实就是插入了delay的parrllel
  • delay:组合动画之间的延迟方法,严格来讲,不算是组合动画

监听当前的动画值:
addListener(callback):动画执行过程中的值
stopAnimation(callback):动画执行结束时的值
监听AnimatedValueXY类型translateValue的值变化:

this.state.translateValue.addListener((value) => {
  console.log("translateValue=>x:" + value.x + " y:" + value.y);
});
this.state.translateValue.stopAnimation((value) => {
  console.log("translateValue=>x:" + value.x + " y:" + value.y);
});

监听AnimatedValue类型rotateValue的值变化:

this.state.rotateValue.addListener((state) => {
  console.log("rotateValue=>" + state.value);
});
this.state.rotateValue.stopAnimation((state) => {
  console.log("rotateValue=>" + state.value);
});

让我们来看一个示例:图片首先缩小80%,2秒之后,旋转360度,之后沿着X轴与Y轴交叉方向向右下角移动一段距离,最后消失变成全透明

import React, {Component} from ‘react‘;
import {
    AppRegistry,
    StyleSheet,
    Animated,
    Easing,
    Image
} from ‘react-native‘;

class DomeTwo extends Component {
    // 构造
    constructor(props) {
        super(props);
        // 初始状态
        this.state = {
            bounceValue: new Animated.Value(0),
            rotateValue: new Animated.Value(0),
            translateValue: new Animated.ValueXY({x:0, y:0}), // 二维坐标
            fadeOutOpacity: new Animated.Value(0),
        };
    }

    render() {
        return (
            <Animated.View                         // 可选的基本组件类型: Image, Text, View(可以包裹任意子View)
                style={{
                  flex: 1,
                  alignItems: ‘center‘,
                  justifyContent: ‘center‘,
                  transform: [  // scale, scaleX, scaleY, translateX, translateY, rotate, rotateX, rotateY, rotateZ
                    {scale: this.state.bounceValue},  // 缩放
                    {rotate: this.state.rotateValue.interpolate({ // 旋转,使用插值函数做值映射
                            inputRange: [0, 1],
                            outputRange: [‘0deg‘, ‘360deg‘],
                        })
                    },
                    {translateX: this.state.translateValue.x}, // x轴移动
                    {translateY: this.state.translateValue.y}, // y轴移动
                  ],
                  opacity: this.state.fadeOutOpacity, // 透明度
                }}>
                <Image
                    source={{uri: ‘http://i.imgur.com/XMKOH81.jpg‘}}
                    style={{width: 400, height: 400}}
                />
            </Animated.View>
    );
    }

    startAnimation(){
        this.state.bounceValue.setValue(1.5);     // 设置一个较大的初始值
        this.state.rotateValue.setValue(0);
        this.state.translateValue.setValue({x:0, y:0});
        this.state.fadeOutOpacity.setValue(1);

        Animated.sequence(
            [
                Animated.sequence([  //  组合动画 parallel(同时执行)、sequence(顺序执行)、stagger(错峰,其实就是插入了delay的parrllel)和delay(延迟)
                    Animated.spring( //  基础的单次弹跳物理模型
                        this.state.bounceValue,
                        {
                            toValue: 0.8,
                            friction: 1, // 摩擦力,默认为7.
                            tension: 40, // 张力,默认40。
                        }
                    ),
                    Animated.delay(2000), // 配合sequence,延迟2秒
                    Animated.timing( // 从时间范围映射到渐变的值。
                        this.state.rotateValue,
                        {
                            toValue: 1,
                            duration: 800, // 动画持续的时间(单位是毫秒),默认为500
                            easing: Easing.out(Easing.quad), // 一个用于定义曲线的渐变函数
                            delay: 0, // 在一段时间之后开始动画(单位是毫秒),默认为0。
                        }
                    ),
                    Animated.decay( // 以一个初始速度开始并且逐渐减慢停止。  S=vt-(at^2)/2   v=v - at
                        this.state.translateValue,
                        {
                            velocity: 10, // 起始速度,必填参数。
                            deceleration: 0.8, // 速度衰减比例,默认为0.997。
                        }
                    ),

                ]),
                Animated.timing(
                    this.state.fadeOutOpacity,
                    {
                        toValue: 0,
                        duration: 2000,
                        easing: Easing.linear, // 线性的渐变函数
                    }
                ),
            ]
        ).start(() => this.startAnimation()); // 循环执行动画

        // 监听值的变化
        this.state.rotateValue.addListener((state) => {
            console.log("rotateValue=>" + state.value);
        });

        // ValueXY
        this.state.translateValue.addListener((value) => {
            console.log("translateValue=>x:" + value.x + " y:" + value.y);
        });

        this.state.fadeOutOpacity.addListener((state) => {
            console.log("fadeOutOpacity=>" + state.value);
        });
    }

    componentDidMount() {
        this.startAnimation();
    }
}
export default DomeTwo;

原文:http://www.jianshu.com/p/2532c0e99c85

时间: 2024-10-04 07:53:14

React Native动画-Animated的相关文章

React Native动画总结

最近在使用react native进行App混合开发,相对于H5的开发,RN所提供的样式表较少,RN中不能使用类似于css3中的动画,因此,RN提供了Animated的API 1.写一个最简单的动画 import React, { Component } from 'react' import { Animated, Text, View } from 'react-native' Class DropList extends React.Component { constructor(prop

React Native超棒的LayoutAnimation(布局动画)

该文翻译自:https://medium.com/@Jpoliachik/react-native-s-layoutanimation-is-awesome-4a4d317afd3e#.6syi2v6yh 刚创建的React Native技术交流群(282693535),欢迎各位大牛,React Native技术爱好者加入交流!同时博客右侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! 如果你是用React Native进行开发,然而还没有尝试过使用LayoutAnimation的话,

[]H5、React Native、Native应用对比分析

目录(?)[-] 一React Native的出现 二3款应用效果 三工程方案 四对比分析 开发方式 性能 体验 更新 维护 开发方式 性能 体验 更新 维护 五综合 开发方式 性能 体验 更新 维护 @王利华,vczero “存 在即合理”.凡是存在的,都是合乎规律的.任何新事物的产生总要的它的道理:任何新事物的发展总是有着取代旧事物的能力.React Native来的正是时候,一则是因为H5发展到一定程度的受限:二则是移动市场的迅速崛起强调团队快速响应和迭代:三则是用户的体验被放大,用户要求

React Native Android 应用层实战沦陷记

[工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 一眨眼又一年快要过去了,原计划今年的最后一个小目标(React Native)看样子要留尾巴到明年了,React Native 想说爱你不容易.怎么评价你呢?应用层 JSX 编写还是很友好的,尼玛框架接入的各种锅却让人痛哭不已,万事开头难,对于 React Native 的接入可以说大量工作可能都需要投入到框架接入中(各种灰度实验的兼容性.各种锅),一旦接入稳定以

前端知识 | React Native Animated动画浅谈

在移动开发中,动画能有效的提高用户体验.在 React Native 中,也有相应的 API 供我们做动画.这里着重说一下 Animated 动画库,它可以让我们非常简便的去实现各式各样的动画和交互方式,而且具备很高的性能.Animated 目前只封装了四个可以动画化的组件:View.Text.Image.ScrollView,不过你也可以用 Animated.createAnimatedComponent() 来封装你自己的组件. 话不多说,我们来举个栗子: 步骤拆解 1.创建 Animate

[React Native] Animate Styles of a React Native View with Animated.timing

In this lesson we will use Animated.timing to animate the opacity and height of a View in our React Native application. This function has attributes that you can set such as easing and duration. import React, {Component} from 'react'; import {Text, V

React Native专题-江清清

本React Native讲解专题:主要讲解了React Native开发,由基础环境搭建配置入门,基础,进阶相关讲解. 刚创建的React Native交流8群:533435865  欢迎各位大牛,React Native技术爱好者加入交流!同时博客右侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! 关于React Native各种疑难杂症,问题深坑总结方案请点击查看: Mac和Windows安装搭建React Native环境教程如下: Mac OS X版本:Mac OS X安装R

React Native 从零到高级- 0基础学习路线

React Native QQ交流群(美团,饿了么,阿里的大神都在里面):576089067 React Native  从0 基础到高级 视频教程正在重录中,要了解最新进度可以关注菜鸟窝微信公众号(下图),旧版视频教程可以点击这里在线学习 学习路线(文章版),江清清老师出品,点击这里关注江清清 ,同时可以关注一下他的课程 基础入门:1.React Native For Android环境配置以及第一个实例2.React Native开发IDE安装及配置3.React Native应用设备运行(

【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框&&获取组件实例常用的两种方式

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2346.html 本篇Himi来利用ListView和TextInput这两种组件实现对话.聊天框. 首先需要准备的有几点:(组件的学习就不赘述了,简单且官方有文档) 1. 学习下 ListView: 官方示例:http://reactnative.cn/docs/0.27/tutorial.html#content