2021SC@SDUSC“F2移动端可视化方案”源码分析(七)——Plugin 插件机制——Animate深入分析

2021SC@SDUSC 

目录

简介

如何按需求引用?

1.群组入场动画

2.精细动画版本

注意:

动画配置详解

动画分类

如何进行配置?

chart.aninmate()

geom.animate()

shape.animate()

总结


简介

F2是移动端的可视化解决方案,因为移动端的图表追求的是生动性且对大小有一定的要求,所以针对不同的应用场景,F2为用户提供了两种动画版本:

        1.群组入场动画

        2.精细动画

精细动画是以shape为单位的动画(shape类在此前的第二篇文章中分析过),包含了appear、enter两种入场动画、update更新动画以及leave销毁动画。

两种动画策略适用于不同的情形,当图表仅仅是用来展示的时候,为了减少代码量,我们可以选择第一种策略;如果我们需要更加丰富多彩党的动画时,可以选择第二种策略。

当然,F2也提供了自定义动画机制,这在此前的第二篇文章中提到过。

完整版的F2默认的是提供精细动画,在使用的时候,我们也可以按需求引用策略。

如何按需求引用?

1.群组入场动画

const F2 = require('@antv/f2/lib/core');
const GroupAnimation = require('@antv/f2/lib/animation/group');
F2.Chart.plugins.register(GroupAnimation); // 这里进行全局注册,也可以给 chart 的实例注册

2.精细动画版本

const F2 = require('@antv/f2/lib/core');
const Animation = require('@antv/f2/lib/animation/detail');
F2.Chart.plugins.register(Animation); // 这里进行全局注册,也可以给 chart 的实例注册

注意:

1)两个版本动画只需引用其一即可;

2)当我们应用require('@antv/f2')版本是,F2为我们提供的是精细动画。

动画配置详解

动画分类

在F2中,围绕图表数据的变化,我们将图形元素的动画划分为以下四种类型:

动画类型解释触发时机
appear图表第一次加载时的入场动画第一次chart.render()
enter图表绘制完成,数据发生变更后,产生的新图形的进场动画

chart.changeData(data)

update图表绘制完成,数据发生变更后,有状态变更的图形的更新动画chart.changeData(data)
leave图表绘制完成,数据发生变更后,被销毁图形的销毁动画chart.changeData(data)

图标来自F2官网

第一次 chart.render() 时会触发 appear 类型动画,当数据发生变更即 chart.changeData(data) 触发时会出发另外三种类型的动画。

在这里不难发现,如果我们使用的是群组入场动画策略,那么F2仅仅只为我们提供了 appear 类型的动画;而在精细动画策略中,F2为我们提供了完整的动画类型机制,即包含上述四种动画机制。

如何进行配置?

chart.aninmate()

图表动画的整体配置。

1.chart.animate(false)         关闭图表动画

2.chart.animate(cfg)            对 chart 上的图形元素进行具体的动画配置。

具体配置如下:

chart.animate({
  'axis-label': {
    appear: {
      animation: {String} || {Function}, // 定义动画执行函数
      easing: {String} || {Function}, // 动画缓动函数
      delay: {Number} || {Function}, // 动画延迟执行时间,单位 ms
      duration: {Number}  // 动画执行时间,单位 ms
    }, // 初始化入场动画配置
    update: {}, // 更新动画配置,配置属性同 appear
    enter: {}, // 数据变更后,新产生的图形的入场动画配置,配置属性同 appear
    leave: {} // 销毁动画配置,配置属性同 appear
  }, // 对坐标轴文本进行动画配置
  'axis-tick': {} // 对坐标轴刻度线进行动画配置,配置属性同 axis-label
  'axis-grid': {} // 对坐标轴网格线进行动画配置,配置属性同 axis-label
  'axis-line': {} // 对坐标轴线进行动画配置,配置属性同 axis-label
  line: {} // 对折线图进行动画配置,配置属性同 axis-label
  area: {} // 对面积图进行动画配置,配置属性同 axis-label
  interval: {} // 对柱状图进行动画配置,配置属性同 axis-label
  path: {} // 对路径图进行动画配置,配置属性同 axis-label
  point: {} // 对点图进行动画配置,配置属性同 axis-label
  polygon: {} // 对多边形进行动画配置,配置属性同 axis-label
  schema: {} // 对自定义图形进行动画配置,配置属性同 axis-label
});

关闭动画方式如下:

// 关闭图表所有动画
chart.animate(false);

// 关闭某种图形元素的动画,如线图 line
chart.animate({
  line: false // 关闭线图动画
});

// 关闭某种图形元素下某一类动画,如线图的出场动画
chart.animate({
  line: {
    appear: false
  }
});

可以从网络上找到F2目前对动画开放的图形元素,如下表:

图形元素名解释
axis-label坐标轴文件
axis-grid坐标轴网格线
axis-tick坐标轴刻度线
axis-line坐标轴线
line折线图
area面积图(饼图)
interval柱状图
path路径图
point点图
polygon多边形
schema自定义图形

图标信息来自F2官网

以上每一种图形元素均包含刚刚提到的四种动画类型(即appear、enter、update、leave),我们可以通过以下方式进行属性配置:

// 对首次出场动画的配置
appear: {
  animation: 'fadeIn', // 执行的具体动画
  easing: 'elasticIn', // 动画缓动函数
  delay: 1000, // 动画延迟执行时间,单位 ms
  duration: 600 // 动画执行时间,单位 ms
}

// 或者直接关闭 appear 类型动画
appear: false

        animation,类型:String/Function,用于定义动画的具体执行动作

这个属性可以用于定义动画执行函数,可以指定动画名称,这个我们所指定的动画名称既可以是F2中默认提供的动画(如下表中展示),也可以是我们自己通过 动画注册机制 进行注册之后的动画名称。

// 指定动画名称
animation: 'groupWaveIn'
/**
 * 定义动画执行函数
 * @param  {Shape} shape       指定动画的 shape
 * @param  {Object} animateCfg 动画的配置,包含 easing、duration 等
 * @param  {Coord} coord       当前的坐标系对象
 * @return {null}              不需要返回
 */
animation: (shape, animateCfg, coord) {

}

默认提供的几种动画:

动画名称描述效果展示
groupWaveIn整体动画,不同坐标系下效果不同

groupScaleInX

整体动画

groupScaleInY整体动画

groupScaleInXY整体动画

shapesScaleInX整体动画,不同于 groupScale,每一个 shape 都会参与

shapesScaleInY整体动画,不同于 groupScale,每一个 shape 都会参与

shapesScaleInXY整体动画,不同于 groupScale,每一个 shape 都会参与

fadeIn单个 shape 的动画

(图标内容来自F2官方网站)

        easing,类型:String/Function,定义动画的缓动函数

可以使用F2默认提供的缓动函数名,或者直接传入缓动函数:

// 方式一:指定缓动函数名称
easing: 'quadraticOut',

// 方式二:直接传入缓动函数
easing: (t) => {
  return Math.sqrt(1 - --t * t);
}

F2为我们提供了众多缓动函数,具体名称与作用可参考:Tween.js / graphs

        delay,类型:Number/Function,指定动画的延迟执行时间

这个属性支持回调函数,回调函数可以参考以下使用方法:

// 方式一,直接指定延迟时间,单位为 ms
delay: 1000,

// 方式二,使用回调函数
/**
 * 返回动画延迟执行时间
 * @param  {Number} index      当前 shape 的索引值(相对于数据集中的顺序)
 * @param  {String} id         当前 shape 的 id
 * @return {Number}            返回延迟执行时间,单位为 ms
 */
delay: (index, id) {

}

        duration,类型:Number,动画的执行时间,单位为ms

geom.animate()

这个接口可以为 geometry 图形元素进行具体的动画配置,默认F2已经针对各个 geometry 设定了动画类型以及配置,用户可以通过该接口进行动画的个性化配置。

注意:

1. 当用户调用 chart.animate(false) 关闭了图表动画之后, geom.animate() 方法上的配置将不会生效;

2. 当用户在 chart.animate() 和 geom.animate() 两个接口上均对该 geom 进行了动画配置时,F2会以 geom.animate() 的配置为准。

这里具体可以配置的属性包括: animation easing delay duration,具体的操作见上文:

geom.animate({
  appear: {
    animation: {String} || {Function}, // 定义动画执行函数
    easing: {String} || {Function}, // 动画缓动函数
    delay: {Number} || {Function}, // 动画延迟执行时间,单位 ms
    duration: {Number}  // 动画执行时间,单位 ms
  },
  enter: {
    animation: {String} || {Function}, // 定义动画执行函数
    easing: {String} || {Function}, // 动画缓动函数
    delay: {Number} || {Function}, // 动画延迟执行时间,单位 ms
    duration: {Number}  // 动画执行时间,单位 ms
  },
  update: {
    animation: {String} || {Function}, // 定义动画执行函数
    easing: {String} || {Function}, // 动画缓动函数
    delay: {Number} || {Function}, // 动画延迟执行时间,单位 ms
    duration: {Number}  // 动画执行时间,单位 ms
  },
  leave: {
    animation: {String} || {Function}, // 定义动画执行函数
    easing: {String} || {Function}, // 动画缓动函数
    delay: {Number} || {Function}, // 动画延迟执行时间,单位 ms
    duration: {Number}  // 动画执行时间,单位 ms
  },
});

shape.animate()

animate接口,用于执行动画的具体行为,使用方式如下:

shape.animate()
  .to({
    attrs: {Object}, // shape 最终的图形属性
    easing: {String} || {Function}, // 缓动函数
    duration: {Number}, // 动画持续时间,单位为 ms
    delay: {Number} // 动画延迟时间,单位为 ms
  }) // 定义动画行为
  .onStart(function() {
    // 动画开始的回调函数
  })
  .onUpdate(function() {
    // 动画进行时的回调函数
  })
  .onEnd(function() {
    // 动画结束时的回调函数
  })
  .onFrame(t => {
    // t 为 0 - 1 范围的数字,表示当前执行的进度
    // 用户自定义每一帧的动画操作
  });

总结

针对 animate 的进一步分析可以更加详细地了解到F2动画机制的运作,但其中仍有一些细节是模糊的,并且我们也进一步看到了F2动画机制与其他机制的融合交叉性,所以在接下来的研究分析中,我们将更加注意交叉方面代码的分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
F2,一个专注于移动,开箱即用的可视化解决方案,完美支持 H5 环境同时兼容多种环境(node, 小程序,weex)。完备的图形语法理论,满足你的各种可视化需求。专业的移动设计指引为你带来最佳的移动端图表体验。 特性: 1、专注移动,体验优雅 轻量化呈现,自然反馈:在设计上我们以人为本,追求自然简单易懂,有吸引力的表达效果,让用户在碎片化的时间里更快更高效得获取图表信息。同时在可视化的操作我们追求内容和操作有机融合,符合人的自然行为反应,让交互操作更自然。 轻巧流畅:F2 一直致力于追求极致的性能,针对移动设备做了大量的优化,在支持丰富(50+)图表的基础上同时保持代码量的小巧(不带交互版本 gzip 压缩后 44k,带所有交互版本 56k),同时提供模块化的设计以支持动态加载,提供更优的大小。 多端异构:在完美支持 H5 环境的同时,同时兼容 Node.js,支付宝小程序、微信小程序、React Native以及 Weex 端的渲染,一份代码,多设备多环境渲染。 2、图表丰富,组件完备 与传统的图表库不同,抛弃了特图特做的封装思路,基于强大的图形语法理论,以数据驱动,通过图形语法的组合灵活构建各类图表,目前可绘制 50+ 图表类型(当然,还可以更多),覆盖各类场景 在提供基础的图表可视化能力外,我们还提供了丰富图表功能组件,满足各种功能需求。 3、扩展灵活,创意无限 我们在提供最佳实践的同时,还为开发者提供了灵活的扩展机制,包括 Shape、动画以及交互的自定义能力,当然还有图表样式的个性化定制,满足各种个性化的图表要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值