使用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日期处理函数
Oct 16 Javascript
nodeType属性返回被选节点的节点类型介绍
Nov 22 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
May 23 Javascript
Javascript模拟加速运动与减速运动代码分享
Dec 11 Javascript
JS实现定时自动关闭DIV层提示框的方法
May 11 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
May 11 Javascript
connection reset by peer问题总结及解决方案
Oct 21 Javascript
Vue 2.X的状态管理vuex记录详解
Mar 23 Javascript
Vue.js中兄弟组件之间互相传值实例
Jun 01 Javascript
JS中Map和ForEach的区别
Feb 05 Javascript
vue修改对象的属性值后页面不重新渲染的实例
Aug 09 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
Aug 08 jQuery
小程序组件之仿微信通讯录的实现代码
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适配器模式介绍
2012/08/14 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
PHP实现查询两个数组中不同元素的方法
2016/02/23 PHP
PHPstorm激活码2020年5月13日亲测有效
2020/09/17 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
JQuery球队选择实例
2015/05/18 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
python3 拼接字符串的7种方法
2018/09/12 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
初学者学习Python好还是Java好
2020/05/26 Python
python3.7调试的实例方法
2020/07/21 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
大学秋游活动方案
2014/02/11 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
纪检干部现实表现材料
2014/08/21 职场文书
村道德模范事迹材料
2014/08/28 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2015新年寄语大全
2014/12/08 职场文书
身份证丢失证明
2015/06/19 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书