使用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-简单的日历实现及Date对象语法介绍(附图)
May 30 Javascript
用js实现控件的隐藏及style.visibility的使用
Jun 14 Javascript
JS OffsetParent属性深入解析
Jan 13 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
Mar 11 Javascript
JavaScript使用concat连接数组的方法
Apr 06 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
Jun 19 Javascript
jquery实现叠层3D文字特效代码分享
Aug 21 Javascript
JavaScript中的this引用(推荐)
Aug 05 Javascript
深入理解react-router@4.0 使用和源码解析
May 23 Javascript
vue-cli3使用mock数据的方法分析
Mar 16 Javascript
基于PHP pthreads实现多线程代码实例
Jun 24 Javascript
深度解读vue-resize的具体用法
Jul 08 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
用PHP和ACCESS写聊天室(七)
2006/10/09 PHP
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
PHP数据对象映射模式实例分析
2019/03/29 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
不错的JS中变量相关的细节分析
2007/08/13 Javascript
node.js中watch机制详解
2014/11/17 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
基于vue组件实现猜数字游戏
2020/05/28 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
python调用新浪微博API项目实践
2014/07/28 Python
python在windows下创建隐藏窗口子进程的方法
2015/06/04 Python
在Python中移动目录结构的方法
2016/01/31 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
Django urls.py重构及参数传递详解
2019/07/23 Python
python编写俄罗斯方块
2020/03/13 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
幼儿园中班教学反思
2014/02/10 职场文书
企业诚信承诺书
2014/05/23 职场文书
升学宴学生答谢词
2015/01/05 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS