使用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数组中如何随机取出一个值
Jun 13 Javascript
深入分析jsonp协议原理
Sep 26 Javascript
微信小程序入门教程
Nov 18 Javascript
学习使用bootstrap的modal和carousel
Dec 09 Javascript
js判断一个字符串是以某个字符串开头的简单实例
Dec 27 Javascript
详谈js模块化规范
Jul 07 Javascript
React通过父组件传递类名给子组件的实现方法
Nov 13 Javascript
Vue Promise的axios请求封装详解
Aug 13 Javascript
vue-cli3.0配置及使用注意事项详解
Sep 05 Javascript
微信小程序使用gitee进行版本管理
Sep 20 Javascript
过滤器vue.filters的使用方法实现
Sep 18 Javascript
vue引入静态js文件的方法
Jun 20 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正则的Unknown Modifier错误解决方法
2010/03/02 PHP
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
2014/11/05 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
jQuery实现滚动效果
2017/11/17 jQuery
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
2016/04/27 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
旅游管理专业个人求职信范文
2013/12/24 职场文书
小区停车场管理制度
2014/01/27 职场文书
安卓程序员求职信
2014/02/28 职场文书
协议书怎么写
2014/04/21 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
JS如何使用剪贴板操作Clipboard API
2021/05/17 Javascript
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL