使用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 相关文章推荐
通过Mootools 1.2来操纵HTML DOM元素
Sep 15 Javascript
JS两种定义方式的区别、内部原理
Nov 21 Javascript
js动态添加表格数据使用insertRow和insertCell实现
May 22 Javascript
JavaScript设置body高度为浏览器高度的方法
Feb 09 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
Feb 26 Javascript
Javascript生成带参数的二维码示例
Oct 10 Javascript
Javascript中click与blur事件的顺序详析
Apr 25 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
Aug 06 Javascript
解决ie img标签内存泄漏的问题
Oct 13 Javascript
vue使用 better-scroll的参数和方法详解
Jan 25 Javascript
node实现爬虫的几种简易方式
Aug 22 Javascript
JavaScript this关键字指向常用情况解析
Sep 02 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 adodb分页实现代码
2009/03/19 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
PHP7内核CGI与FastCGI详解
2019/04/14 PHP
解javascript 混淆加密收藏
2009/01/16 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
2015/02/04 Javascript
浅谈使用MVC模式进行JavaScript程序开发
2015/11/10 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
2016/05/21 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
Python3基础之函数用法
2014/08/13 Python
Python抓取手机号归属地信息示例代码
2016/11/28 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
基于python实现简单日历
2018/07/28 Python
python之消除前缀重命名的方法
2018/10/21 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
Django实现任意文件上传(最简单的方法)
2020/06/03 Python
html5与css3小应用
2013/04/03 HTML / CSS
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
大学生水文观测实习自我鉴定
2013/09/29 职场文书
处级领导班子全部召开专题民主生活会情况汇报
2014/09/27 职场文书
三峡导游词
2015/01/31 职场文书
公司人事任命通知
2015/04/20 职场文书
党章学习心得体会2016
2016/01/14 职场文书
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS