React Native 初步学习之动画

概述

目前,ReactNative的版本是0.43,主要的动画分为两大类
1、Animated 更加精确的交互式的动画
2、LayoutAnimation 用来实现布局切换的动画
今天首先介绍一下Animated

Animated动画的创建原理

一个最基本的Animated创建过程

1、创建Animated.Value,设置初始值,比如一个视图的opacity属性,最开始设置Animated.Value(0),来表示动画的开始时候,视图是全透明的。

2、AnimatedValue绑定到Style的可动画属性,比如透明度,{opacity: this.state.fadeAnim}。

3、使用Animated.timing来创建自动的动画,或者使用Animated.event来根据手势,触摸,Scroll的动态更新动画的状态(本文会侧重讲解Animated.timing)。

4、调用Animated.timeing.start()开始动画。

根据上述原理,下面我们就创建一个简单的动画(给这个默认的视图创建fade in动画,效果如下):

代码如下:

import React, { Component } from 'react';
import {
    AppRegistry,
    Text,
    View,
    StyleSheet,
    Animated,
} from 'react-native';

class SimpleAnimatedDemo extends React.Component {
  state: { //可以不写,我这里写是为了去除flow的warning
    fadeIn: Object,
  };
  constructor(props) {
     super(props);
     this.state = {
         fadeIn: new Animated.Value(0), //设置初始值
     };
   }
   componentDidMount() {
   Animated.timing(
     this.state.fadeIn,//初始值
     {toValue: 1}//结束值
   ).start();//开始
   }
  render() {
    return (
      <View style={styles.container}>
      <Animated.Text style={{opacity: this.state.fadeIn}}>//绑定到属性
          Welcome to React Native Animated!
      </Animated.Text>
      </View>
    );
  }
}

从代码可以看出来,简单的动画就是用Animated.Value指定初始值,然后在Animated.timing中设置结束值,其他的直接交给React native让它自动创建,我们只需要调用start开始动画即可。

运行的效果图是动态图,插入不进来,想看效果的直接在手机上或模拟器上运行一下就知道啦~

可动画的视图一般有View、Text、Image、createAnimatedComponent(自定义)

Animated详解

方法
static decay(value, config) 阻尼,将一个值根据阻尼系数动画到 0
static timing(value, config 根据时间函数来处理,常见的比如线性,加速开始减速结束等等,支持自定义时间函数
static spring(value, config) 弹性动画
static add(a, b) 将两个Animated.value相加,返回一个新的
static multiply(a, b) 将两个Animated.value相乘,返回一个新的
static modulo(a, modulus),将a对modulus取余,类似操作符%
static delay(time)延迟一段时间
static sequence(animations) 依次开始一组动画,后一个在前一个结束后才会开始,如果其中一个动画中途停止,则整个动画组停止
static parallel(animations, config?),同时开始一组动画,默认一个动画中途停止,则全都停止。可以通过设置stopTogether来重写这一特性
static stagger(time, animations),一组动画可以同时执行,但是会按照延迟依次开始
static event(argMapping, config?),利用手势,Scroll来手动控制动画的状态
static createAnimatedComponent(Component),自定义的让某一个Component支持动画
属性
Value,类型是AnimatedValue,驱动基本动画
AnimatedValueXY,类型是AnimatedValueXY,驱动二维动画

AnimatedValue类型

一个AnimatedValue一次可以驱动多个可动画属性,但是一个AnimatedValue一次只能由一个机制驱动。比如,一个Value可以同时动画View的透明度和位置,但是一个Value一次只能采用线性时间函数

方法
constructor(value) 构造器
setValue(value) 直接设置值,会导致动画终止
setOffset(offset) 设置当前的偏移量
flattenOffset() 将偏移量合并到最初值中,并把偏移量设为0,
addListener(callback) ,removeListener(id),removeAllListeners(),增加一个异步的动画监听者
stopAnimation(callback?) 终止动画,并在动画结束后执行callback
interpolate(config) 插值,在更新可动画属性前用插值函数对当前值进行变换
animate(animation, callback) 通常在React Native内部使用
stopTracking(),track(tracking) 通常在React Native内部使用

AnimatedValueXY

它和AnimatedValue类似,用在二维动画,使用起来和AnimatedValue类似,这里不在介绍,这里是文档

手势驱动

React Native最常用的手势就是PanResponser,
由于本文侧重讲解动画,所以不会特别详细的介绍PanResponser,想深入了解可以看官方文档,这里仅仅介绍用到的几个属性和回调方法

onStartShouldSetPanResponder: (event, gestureState) => {}//是否相应pan手势
onPanResponderMove: (event, gestureState) => {}//在pan移动的时候进行的回调
onPanResponderRelease: (event, gestureState) => {}//手离开屏幕
onPanResponderTerminate: (event, gestureState) => {}//手势中断

其中,通过event可以获得触摸的位置,时间戳等信息。通过gestureState可以获取移动的距离,速度等
下面写了一个拖动的动画,通过手指拖动小蓝球,移动小篮球.

代码如下:

// View随着手拖动而移动,手指离开会到原点

import {
    AppRegistry,
    Text,
    View,
    StyleSheet,
    Animated,
    PanResponder,
} from 'react-native';
class TransAnimatedDemo extends Component {
    state: {
        trans: AnimatedValueXY, //可以不定义,只是为了除去警告
    }
    _panResponder: PanResponder;

    constructor(props) {
        super(props);
        this.state = {
            trans: new Animated.ValueXY(),
        };

        this._panResponder = PanResponder.create({
            onStartShouldSetPanResponder: () => true, //响应手势
            onPanResponderMove: Animated.event(
                [null, {dx: this.state.trans.x, dy: this.state.trans.y}] // 绑定动画值
            ),
            onPanResponderRelease: () => {//手松开是回调,回到原始位置
                Animated.spring(this.state.trans, {toValue: {x: 0, y: 0}}
                ).start();
            },
            onPanResponderTerminate: () => {//手势中断时回调,回到原始位置
                Animated.spring(this.state.trans, {toValue: {x: 0, y: 0}}
                ).start();
            },
        });
    }
    render(){
        return(
            <View>
                <Animated.View style={
                    {
                        width:100,
                        height:100,
                        backgroundColor:'blue',
                        borderRadius:50,
                        transform:[
                            {translateX:this.state.trans.x},
                            {translateY:this.state.trans.y},
                        ],
                    }
                } {...this._panResponder.panHandlers}>

                </Animated.View>
            </View>
        );
    }
}

以上代码通过回调PanResponder的各个函数 实现移动的动画效果,具体的运行效果,请自行在模拟器或者真机上运行(因为动态图片插不进来,请谅解)。

参考资料:

官方关于动画的介绍
官方给出的复杂动画的示例

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • React Native 进阶(二)--动画 动画 流畅、有意义的动画对于移动应用用户体验来说是非常必要的。我们可...
    呼呼哥阅读 2,778评论 2 5
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,079评论 4 62
  • 本来想要开启一本空白手帐本,写起来比较自由随性,然后就开始在网上找一些好看的图片进行临摹,作为手帐的插画使用,结果...
    了不起的废柴阅读 353评论 0 10
  • 概述 本文希望帮助 Mentor 在指导实习生和新员工时,建立一些基本的共识和准则。本文主要讨论的是技术类的岗位。...
    唐巧阅读 2,681评论 0 6
  • 作者 林徽因 别丢掉 这一把过往的热情, 现在流水似的, 轻轻 在幽冷的山泉底, 在黑夜,在松林, 叹息似的渺茫,...
    iwedesign阅读 247评论 0 1