使用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 相关文章推荐
删除节点的jquery代码
Jan 13 Javascript
JQuery导航菜单选择特效
Apr 11 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
Aug 10 Javascript
js判断一个字符串是以某个字符串开头的简单实例
Dec 27 Javascript
jquery 禁止鼠标右键并监听右键事件
Apr 27 jQuery
Angular2中如何使用ngx-translate进行国际化
May 21 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
Jun 07 Javascript
Vuex 进阶之模块化组织详解
Jan 12 Javascript
vue2.0+koa2+mongodb实现注册登录
Apr 10 Javascript
layui 给数据表格加序号的方法
Aug 20 Javascript
Vue使用zTree插件封装树组件操作示例
Apr 25 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
小程序组件之仿微信通讯录的实现代码
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数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
Aptana调试javascript图解教程
2009/11/30 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
jQuery实现hover合成事件的方法
2015/08/06 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
node.js的事件机制
2017/02/08 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
多版本Python共存的配置方法
2017/05/22 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
Python3多线程操作简单示例
2018/05/22 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
python如何随机生成高强度密码
2020/08/19 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
pandas针对excel处理的实现
2021/01/15 Python
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
自我鉴定范文
2013/11/10 职场文书
给领导的致歉信范文
2014/01/13 职场文书
学生安全承诺书
2014/05/22 职场文书
营销总经理岗位职责范本
2014/09/02 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
python实现进度条的多种实现
2021/04/29 Python
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers