使用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 相关文章推荐
js png图片(有含有透明)在IE6中为什么不透明了
Feb 07 Javascript
jQuery学习笔记之Helloworld
Dec 22 Javascript
游览器中javascript的执行过程(图文)
May 20 Javascript
使用node.js半年来总结的 10 条经验
Aug 18 Javascript
JavaScript实现自动消除按钮功能的方法
Aug 05 Javascript
AngularJS过滤器filter用法实例分析
Nov 04 Javascript
Bootstrap基本样式学习笔记之图片(6)
Dec 07 Javascript
PHP实现本地图片上传和验证功能
Feb 27 Javascript
单页面vue引入百度统计的使用方法示例详解
Oct 13 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
Oct 23 Javascript
JS面向对象之多选框实现
Jan 17 Javascript
ES6中Promise的使用方法实例总结
Feb 18 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
WordPress中Gravatar头像缓存到本地及相关优化的技巧
2015/12/19 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
PHP用PDO如何封装简单易用的DB类详解
2017/07/30 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
php ajax confirm 删除实例详解
2019/03/06 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
node 解析图片二维码的内容代码实例
2019/09/11 Javascript
基于Django模板中的数字自增(详解)
2017/09/05 Python
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
Python3使用TCP编写一个简易的文件下载器功能
2019/05/08 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
Python3实现二叉树的最大深度
2019/09/30 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
大学生工作推荐信范文
2013/12/02 职场文书
应届毕业生求职信范文
2013/12/18 职场文书
七年级地理教学反思
2014/01/26 职场文书
2014群众路线学习笔记
2014/11/06 职场文书
结婚仪式主持词
2015/06/29 职场文书
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫