使用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 Mobile入门—多页面切换示例学习
Jan 08 Javascript
jQuery实现仿Google首页拖动效果的方法
May 04 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
Jun 27 Javascript
谈谈jQuery之Deferred源码剖析
Dec 19 Javascript
vue动态生成dom并且自动绑定事件
Apr 19 Javascript
html5+canvas实现支持触屏的签名插件教程
May 08 Javascript
D3.js进阶系列之CSV表格文件的读取详解
Jun 06 Javascript
基于Jquery Ajax type的4种类型(详解)
Aug 02 jQuery
详解基于vue-cli优化的webpack配置
Nov 06 Javascript
Vue 换肤的示例实践
Jan 23 Javascript
Webpack中loader打包各种文件的方法实例
Sep 03 Javascript
vue中实现动态生成二维码的方法
Feb 21 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学习之变量的使用
2011/05/29 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
使用php清除bom示例
2014/03/03 PHP
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
jquery Mobile入门—多页面切换示例学习
2013/01/08 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
JS实现放烟花效果
2020/03/10 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
[15:41]教你分分钟做大人——灰烬之灵
2015/03/11 DOTA
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
Python处理CSV与List的转换方法
2018/04/19 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
详解如何减少python内存的消耗
2019/08/09 Python
大家都说好用的Python命令行库click的使用
2019/11/07 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
九州传奇上机题
2014/07/10 面试题
业务员薪酬管理制度
2014/01/15 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
OpenCV-Python使用cv2实现傅里叶变换
2021/06/09 Python
Python中的套接字编程是什么?
2021/06/21 Python
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
图文详解nginx日志切割的实现
2022/01/18 Servers
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫