使用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常见注意事项
Jan 01 Javascript
fckeditor 获取文本框值的实现代码
Feb 09 Javascript
jQuery页面滚动浮动层智能定位实例代码
Aug 23 Javascript
JavaScript初学者建议:不要去管浏览器兼容
Feb 04 Javascript
jQuery的deferred对象详解
Nov 12 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
Jun 23 Javascript
js正则表达式验证表单【完整版】
Mar 06 Javascript
JavaScript实现前端实时搜索功能
Mar 26 Javascript
通过源码分析Vue的双向数据绑定详解
Sep 24 Javascript
React Native实现地址挑选器功能
Oct 24 Javascript
vue+element实现批量删除功能的示例
Feb 28 Javascript
微信小程序解析富文本过程详解
Jul 13 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
web方式ftp
2006/10/09 PHP
基于mysql的bbs设计(五)
2006/10/09 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
通过实践编写优雅的JavaScript代码
2019/05/30 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
Python subprocess库的使用详解
2018/10/26 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
医大实习自我鉴定
2013/12/07 职场文书
行政专员的岗位职责
2014/03/10 职场文书
会员活动策划方案
2014/08/19 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
雾霾停课通知
2015/04/24 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
Tomcat项目启动失败的原因和解决办法
2022/04/20 Servers