使用RN Animated做一个“添加购物车”动画的方法


Posted in Javascript onSeptember 12, 2018

最近在选座的新项目中试用了一下 React Native,熟悉新框架的同时,可以略微将交互效果和 Native 看齐了。

分享一下项目本身比较重要的一个交互动画的做法, RT。

使用RN Animated做一个“添加购物车”动画的方法

这次我们就不装大象了,因为我真的买了冰箱 =,=

本着言简意赅,不故弄玄虚的原则,依然是三步:

第 1 步:通过 Animated 创建合成动画的 View。仔细观察,“选择座位” 动画和 “添加购物车” 动画类似,都可以分解为透明度变化( opacity )和 3D 变化( transform )两部分。而 transform 又能进一步分解为水平位移( translateX )、垂直位移( translateY )、旋转( rotateZ )、缩放( scale )四个分动画( 代码见 render() );

第 2 步:响应点击事件,准备好动画的相关参数。目标位置被点击时,在动画的父级组件中通过 onPress 事件的 event 对象获取点击的位置坐标( event.nativeEvent.changedTouches[0].pageX|Y )作为动画起始位置。终点位置一般为固定位置,当然你也可以指定动态值;

第 3 步:获取参数, start() 播放动画( 代码见 componentDidMount() )。从父级组件中获取位置参数并通过 props 传入子动画组件。其中 opacityrotateZscale 属性值都是静态变化,分别为 1 -> 0 0deg -> 360deg 1 -> 0 (可以利用 interpolate 方法做各个属性不同类型值的 mapping,更加方便统一控制);

注意:类似的全局动画要展示在最高层级,防止被后渲染的组件遮挡,最好单独封装组建提升其在 UI 中的渲染层级。

import React from 'react';

import {
 StyleSheet,
 View,
 Image,
 Animated
} from 'react-native';

export default class SeatDroppingextends React.PureComponent{
 constructor (props) {
  super(props);
  this.state = {
   animValue: new Animated.Value(0),
   fromPageX: props.clickedPosition.x, // from event.nativeEvent.changedTouches[0]
   fromPageY: props.clickedPosition.y,
   toPageX: props.psgPosition.x,
   toPageY: props.psgPosition.y
  };
 }
 componentDidMount() {
  Animated.timing(
   this.state.animValue,
   {
    toValue: 1,
    duration: 600
   }
  ).start();
 }
 render () {
  const {
   animValue,
   fromPageX,
   fromPageY,
   toPageX,
   toPageY
  } = this.state;
  return (
   <Animated.View
    style={{
     zIndex: 9,
     position: 'absolute',
     opacity: animValue.interpolate({
      inputRange: [0, 1],
      outputRange: [1, 0]
     }),
     transform: [
      {
       translateX: animValue.interpolate({
        inputRange: [0, 1],
        outputRange: [`${fromPageX}px`, `${toPageX}px`]
       })
      },
      {
       translateY: animValue.interpolate({
        inputRange: [0, 1],
        outputRange: [`${fromPageY}px`, `${toPageY}px`]
       })
      },
      {
       rotateZ: animValue.interpolate({
        inputRange: [0, 1],
        outputRange: ['0deg', '180deg']
       })
      },
      {
       scale: animValue.interpolate({
        inputRange: [0, 1],
        outputRange: [1, 0]
       })
      }
     ]}}
   >
    <Image
     source={require('../img/ic_seat_focus.png')}
     style={[
      {
       width: 36,
       height: 32,
       zIndex: 9
      }
     ]}
    />
   </Animated.View>
  );
 }
}

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript打开新窗口同时关闭旧窗口
Jan 16 Javascript
jQuery EasyUI 的EasyLoader功能介绍
Sep 12 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
Oct 27 Javascript
js前台判断开始时间是否小于结束时间
Feb 23 Javascript
说说JSON和JSONP 也许你会豁然开朗
Sep 02 Javascript
javascript继承之为什么要继承
Nov 10 Javascript
smartcrop.js智能图片裁剪库
Oct 14 Javascript
jquery获取下拉框中的循环值
Feb 08 Javascript
JS实现的二叉树算法完整实例
Apr 06 Javascript
ReactNative实现Toast的示例
Dec 31 Javascript
快速处理vue渲染前的显示问题
Mar 05 Javascript
fetch 如何实现请求数据
Dec 20 Javascript
小程序组件之仿微信通讯录的实现代码
Sep 12 #Javascript
Vue弹出菜单功能的实现代码
Sep 12 #Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
Sep 12 #Javascript
详解SPA中前端路由基本原理与实现方式
Sep 12 #Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
Sep 12 #Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
Sep 12 #Javascript
Vue $emit $refs子父组件间方法的调用实例
Sep 12 #Javascript
You might like
《Re:从零开始的异世界生活》剧情体验,手游新作定名
2020/04/09 日漫
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
php文档更新介绍
2011/07/22 PHP
php explode函数实例代码
2012/02/27 PHP
PHP实现搜索相似图片
2015/09/22 PHP
PHP实现获取并生成数据库字典的方法
2016/05/04 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
javascript时间函数基础介绍
2013/03/28 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
jQuery实现复选框的全选和反选
2017/02/02 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
原生JS实现天气预报
2020/06/16 Javascript
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
Python编程中的反模式实例分析
2014/12/08 Python
对python3 urllib包与http包的使用详解
2018/05/10 Python
使用python3实现操作串口详解
2019/01/01 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
python 实现识别图片上的数字
2019/07/30 Python
python selenium操作cookie的实现
2020/03/18 Python
Python 给下载文件显示进度条和下载时间的实现
2020/04/02 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
瑞典多品牌连锁店:Johnells
2021/01/13 全球购物
市场部规章制度
2014/01/24 职场文书
外语系毕业生求职自荐信
2014/04/12 职场文书
民事授权委托书范文
2014/08/02 职场文书
防暑降温通知书
2015/04/27 职场文书
MySQL官方导出工具mysqlpump的使用
2021/05/21 MySQL