动画是提高用户体验不可缺少的一个元素。恰如其分的动画可以让用户更明确的感知当前的操作是什么。

无疑在使用React Native开发应用的时候也需要动画。这就需要知道RN都给我们提供了那些动画,和每个动画可以处理的功能有哪些。

填坑材料Animated

动画API提供了一些现成的组件:Animated.ViewAnimated.TextAnimated.Image默认支持动画。动画API会调用iOS或者Android的本地代码来完成这些组件的位移、大小等动画。这样各种动画在视觉上可以非常的流畅。

一个绕着屏幕转的动画

绕着屏幕转的动画:

<--<
|  |
V--^ 

基本代码

export default class AnimatedSquare extends React.Component {constructor(props) {super(props);// 1this.state = {pan: new Animated.ValueXY}}getStyle() {return [styles.square,{transform: this.state.pan.getTranslateTransform()}];}render() {return (<View style={styles.container}><Animated.View style={this.getStyle()} />
            </View>);}
}

解释一下:

  1. this.state里用了Animated.ValueXY的实例。这样Animated动画就知道需要处理的是X和Y两个方向的值。
  2. getStyle()方法会返回一个数组,因为动画需要squaretransform两个样式值。getTranslateTransform()方法会获得一个数组:[{translateX: xValue}, {translateY: yValue}]xValueyValue就是根据我们开始的时候设置的Animated.ValueXY解析出来的。
  3. 最后设置Animated.View。也就是动画最终作用的元素(或者叫做视图)。

依赖和样式

依赖项:

import React from 'react';
import {Dimensions,StyleSheet,View,Animated
} from 'react-native';let {width,height
} = Dimensions.get('window');const SQUARE_DIMENSIONS = 30;

样式:

const styles = StyleSheet.create({container: {flex: 1},square: {width: SQUARE_DIMENSIONS,height: SQUARE_DIMENSIONS,backgroundColor: 'blue'}
});

动起来

我们准备让这个目标物体,一个方框,从左上角:x = 0, y = 0到左下角: x = 0, y = (screenHeight - squreHeight)

const SPRING_CONFIG = {tension: 2, friction: 3};componentDidMount() {Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: 0, y: height - SQUARE_DIMENSIONS}                        // return to start}).start();}

componentDidMount方法是RN组件的生命周期方法,在组件完成html渲染的时候调用。在组件渲染完成后开始动画。

我们指定了SPRING_CONFIG为弹簧动画的弹力和摩擦力,值都不大。所以这个方框会在屏幕的每个角稍微弹几下。

依次的动动动。。。

我们可以让几个动画按照顺序依次执行。这些动画会一个挨一个的执行。sequence方法是动画API组织动画的多种方式之一。也可以使用parallel来组织,这样几个动画会并行执行。

    componentDidMount() {Animated.sequence([Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: 0, y: height - SQUARE_DIMENSIONS} //animate to bottom left}),Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: width - SQUARE_DIMENSIONS, y: height - SQUARE_DIMENSIONS} // animated to bottom right}),Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: width - SQUARE_DIMENSIONS, y: 0} //animate to top right}),Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: 0, y: 0} // return to start})]).start(cb);}

我们定义了四个弹簧动画。这个四个一组的动画执行的顺序就是前文指定的顺序。

重复动画

调用动画的start方法的时候可以传入一个回调方法作为参数。这个回调方法会在这一组动画执行完成之后调用。在本例中,每次动画执行完之后会再次调用开始动画的方法。

    componentDidMount() {this.startAndRepeat();}startAndRepeat() {this.triggerAnimation(this.startAndRepeat);}triggerAnimation(cb) {Animated.sequence([Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: 0, y: height - SQUARE_DIMENSIONS} //animate to bottom left}),Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: width - SQUARE_DIMENSIONS, y: height - SQUARE_DIMENSIONS} // animated to bottom right}),Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: width - SQUARE_DIMENSIONS, y: 0} //animate to top right}),Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: 0, y: 0} // return to start})]).start(cb);}

调用triggerAnimation方法开始动画,并传入再次开始动画的方法startAndRepeat

完整代码

import React from 'react';
import {Dimensions,StyleSheet,View,Animated
} from 'react-native';let {width,height
} = Dimensions.get('window');const SQUARE_DIMENSIONS = 30;
const SPRING_CONFIG = {tension: 2, friction: 3};export default class AnimatedSquare extends React.Component {constructor(props) {super(props);this.state = {pan: new Animated.ValueXY}// bindthis.startAndRepeat = this.startAndRepeat.bind(this);this.getStyle = this.getStyle.bind(this);this.startAndRepeat = this.startAndRepeat.bind(this);this.triggerAnimation = this.triggerAnimation.bind(this);}componentDidMount() {this.startAndRepeat();}startAndRepeat() {this.triggerAnimation(this.startAndRepeat);}getStyle() {return [styles.square,{transform: this.state.pan.getTranslateTransform()}];}triggerAnimation(cb) {Animated.sequence([Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: 0, y: height - SQUARE_DIMENSIONS} //animate to bottom left}),Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: width - SQUARE_DIMENSIONS, y: height - SQUARE_DIMENSIONS} // animated to bottom right}),Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: width - SQUARE_DIMENSIONS, y: 0} //animate to top right}),Animated.spring(this.state.pan, {...SPRING_CONFIG,toValue: {x: 0, y: 0} // return to start})]).start(cb);}render() {return (<View style={styles.container}><Animated.View style={this.getStyle()} />
            </View>);}
}const styles = StyleSheet.create({container: {flex: 1},square: {width: SQUARE_DIMENSIONS,height: SQUARE_DIMENSIONS,backgroundColor: 'blue'}
});

更多相关代码请移步:https://github.com/future-challenger/petshop/tree/master/client/petshop

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!
本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/5914230.html,如需转载请自行联系原作者

React Native填坑之旅--动画相关推荐

  1. React Native填坑之旅--动画篇

    React Native填坑之旅--Button篇 React Native填坑之旅--动画 React Native填坑之旅--HTTP请求篇 动画是提高用户体验不可缺少的一个元素.恰如其分的动画可 ...

  2. React Native填坑之旅 -- 回归小插曲

    回归RN,非常开心啊! 在React Native 0.49.5上开发,直接遇到一个ios模拟器的问题.这个问题很简单就是Bundle URL not present. 在网上找了很多的解决方法,都不 ...

  3. 一次动态代理的填坑之旅

    转载自  一次动态代理的填坑之旅 背景 想在现有的接口加上熔断降级或者限流的功能,比较好的方式是通过注解的方式,并基于动态代理进行实现,下面代码是Rhino的实现 @Rhino public clas ...

  4. 如何在React Native中创建精美的动画加载器

    by Vikrant Negi 通过Vikrant Negi 如何在React Native中创建精美的动画加载器 (How to create a beautifully animated load ...

  5. Jenkins项目实战之-MacOS High Sierra自动化打包方案的填坑之旅

    前面我介绍了如何在android和iOS实现公司内部app的自动化打包构建的过程.这里写一个关于这个app自动化打包平台从想法到实践再到放机房平稳运行的一个回忆录.总的来说,在jenkins上实现an ...

  6. 【填坑之旅】手把手教你如何用AndroidStudio上传自己的library到Jcenter库

    [填坑之旅]手把手教你如何用AndroidStudio上传自己的library到Jcenter库 前言:我们在使用AndroidStudio的时候,会经常用到第三方的代码库.引入第三方库的方式无非就是 ...

  7. 《Getting Started with D3》填坑之旅(六):第三章(下)

    Chapter 3. Scales, Axes and Lines(比例尺.坐标轴与线) (接上篇:<Getting Started with D3>填坑之旅(五):第三章(上)) 示例2 ...

  8. AppCode Updating indexes一直不停的填坑之旅

    最近在做APP安装包瘦身,找到了传说中的AppCode神器. AppCode 提供了 Inspect Code 来诊断代码,其中含有查找无用代码的功能.它可以帮助我们查找出 AppCode 中无用的类 ...

  9. React Native Expo 项目中添加动画音效

    目录 背景 实现 代码 效果 参考链接 背景 最近做一个学校作业,用 React Native 写一个游戏.游戏中涉及一个物体下落的动效,是用 React Native 的 Animated API ...

  10. 超详细 React Native 入坑使用指南,我在元宇宙等你

    前言 大家好,我是虚竹,今天给大家分享一下我是如何快速通关打怪搭建 React Native 跨端开发环境,并使用大家非常熟悉的开发工具 VSCode 来编写丝滑般的代码.编写丝滑般代码会再下一篇输出 ...

最新文章

  1. 网络请求方式Fetch简介
  2. 使用gparted live分区工具对VMware及ESXI(vsphere)虚拟机进行根目录扩容(可视化界面操作)
  3. 优化Image设置Tiled类型产生过多的三角形顶点
  4. keepalived实现haproxy高可用详解
  5. 您好,dotnet tool
  6. php 共享内存列队,php中对共享内存,消息队列的操作
  7. qbittorrent container 改共享文件_SSH连接docker中的container
  8. 电脑桌面便签_电脑桌面便签软件哪个好
  9. 04-初始mysql语句
  10. 求立方根_12.初中数学:立方根号a,等于0.1738,怎么求a的值?期末考试真题
  11. java web 编程技术 答案_《javaweb编程技术》课后习题答案.docx
  12. 华为数通ensp命令(四)
  13. cdr添加节点快捷键_CDR快捷键大全(精编排).doc
  14. [随文杂记][转]魔兽争霸vs星际争霸vs红色警戒
  15. python爬虫英文单词_利用PYTHON 爬虫爬出自己的英语单词库
  16. Mybaits-Plus Invalid bound statement (not found) 问题
  17. 双十一最值得入手什么,盘点几款最实用的数码好物
  18. Arduino之干接点控制继电器取反实例
  19. 如何部署JSP应用到阿里云服务器上(一)
  20. EPSON1100清零软件 在哪有?

热门文章

  1. Zookeeper动态更新服务器列表
  2. python把字典转换成json字符串
  3. Wireshark系列之5 显示过滤器
  4. android 开发怎么让程序生成的图片文件不会被系统扫描到
  5. 方法、脚本-Pig Grunt之简单命令及实例说明-by小雨
  6. 5个CSS3技术实现设计增强
  7. ms sql server 2005 select guid返回null的问题
  8. java集群之间共享数据_多个JVM之间,数据共享的问题?
  9. arcobjects java开发_ArcGIS Engine SDK for Java 最小示例学习
  10. 北航计算机组成重修,北航计算机组成原理123希望大伙把作业上传.pdf