使用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 this关键字的问题
Jan 09 Javascript
使用UglifyJS合并/压缩JavaScript的方法
Mar 07 Javascript
javascript常见用法总结
May 22 Javascript
基于javascript实现listbox左右移动
Jan 29 Javascript
非常酷炫的Bootstrap图片轮播动画
May 27 Javascript
Vue.js单向绑定和双向绑定实例分析
Aug 14 Javascript
用webpack4开发小程序的实现方法
Jun 04 Javascript
JS async 函数的含义和用法实例总结
Apr 08 Javascript
ES6箭头函数和扩展实例分析
May 23 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
Jul 28 Javascript
vue抽出组件并传值实例
Jul 31 Javascript
Vue指令实现OutClick的示例
Nov 16 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
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
js渐变显示渐变消失示例代码
2013/08/01 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
JavaScript实现MIPS乘法模拟的方法
2015/04/17 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
详解在Angular项目中添加插件ng-bootstrap
2017/07/04 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
Vue父组件调用子组件事件方法
2018/02/23 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
python实现简单ftp客户端的方法
2015/06/28 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
Python人脸识别初探
2017/12/21 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
python 多线程重启方法
2019/02/18 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
Python实现爬取并分析电商评论
2020/06/19 Python
《最大的“书”》教学反思
2014/02/14 职场文书
公司投资建议书
2014/05/16 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
2015年监理个人工作总结
2015/05/23 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript