使用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 编程引入命名空间的方法
Jun 29 Javascript
javascript 火狐(firefox)不显示本地图片问题解决
Jul 05 Javascript
Javascript类库的顶层对象名用户体验分析
Oct 24 Javascript
JavaScript中的setUTCDate()方法使用详解
Jun 11 Javascript
整理JavaScript创建对象的八种方法
Nov 03 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
Nov 16 Javascript
基于JavaScript实现文字超出部分隐藏
Feb 29 Javascript
JS清除字符串中重复值的实现方法
Aug 03 Javascript
AngularJS指令中的绑定策略实例分析
Dec 14 Javascript
微信小程序中悬浮窗功能的实现代码
Aug 02 Javascript
Vue 的双向绑定原理与用法揭秘
May 06 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
Nov 11 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数据加密详解
2013/06/18 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
2013/06/28 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
谈谈对JavaScript原生拖放的深入理解
2016/09/20 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
.vue文件 加scoped 样式不起作用的解决方法
2018/05/28 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
在python中用url_for构造URL的方法
2019/07/25 Python
django 中的聚合函数,分组函数,F 查询,Q查询
2019/07/25 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
python3.6使用SMTP协议发送邮件
2020/05/20 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
加拿大时装零售商:Influence U
2018/12/22 全球购物
2014年高三毕业生自我评价
2014/01/11 职场文书
元旦活动感言
2014/03/08 职场文书
暑期培训班策划方案
2014/08/26 职场文书
终止劳动合同协议书
2014/10/05 职场文书
群众路线对照检查剖析材料
2014/10/09 职场文书
电影建国大业观后感
2015/06/01 职场文书
教师节校长致辞
2015/07/31 职场文书