手搓WxCountUp源码


简单介绍就是:WxCountUp参照CountUp.js封装的,为微信小程序提供数据滚动的酷炫特效,以更为有趣的形式显示数值数据

一、WxCountUp实现

CountUp.js源代码使用document浏览器提供的DOM操作接口,在微信小程序中并不支持,于是WxCountUp就要求传入一个this,上下文对象来实时 **setData**改变数据。

真机调试不支持 requestAnimationFrame方法。该方法只在window 对象上实现,小程序官方并没有实现该方法,但canvas是有这个方法的,由于我们不涉猎canvas,纯setData实现数字滚动,所以就通过新的idea模拟**requestAnimationFrame**效果。

二、如何模拟requestAnimationFrame帧动画?

在web端,绘制canvas动画的时候经常使用 **window.requestAnimationFrame**这个API来回调循环帧渲染。

使用**requestAnimationFrame**将会把动画渲染周期交给浏览器统一调度,便实现更好的性能优化,但!微信小程序并不支持该Api,所以通过定时器模拟以达到同样效果。

**requestAnimationFrame**能够将原本零散的帧渲染序列进行梳理,使得页面所有动画帧都在同一周期进行渲染,以最大化利用系统资源。

一般浏览器渲染周期为60次每秒,即每次间隔大约16毫秒,因此写一个方法将渲染周期控制在16毫秒,就能够模拟出**requestAnimationFrame**的效果。

var lastFrameTime = 0;
// 模拟 requestAnimationFrame
var doAnimationFrame = function (callback) {
	var currTime = new Date().getTime();
	var timeToCall = Math.max(0, 16 - (currTime - lastFrameTime));
	var id = setTimeout(function () { callback(currTime + timeToCall); }, timeToCall);
	lastFrameTime = currTime + timeToCall;
	return id;
};
// 模拟 cancelAnimationFrame
var abortAnimationFrame = function (id) {
	clearTimeout(id)
}

现在就可以像使用 requestAnimationFramecancelAnimationFrame 一样使用 doAnimationFrameabortAnimationFrame 了。

三、简单使用

import WxCountUp from '../../plugins/wx-countup/WxCountUp.js'

Page({
  data: {
    number: 0
  },
  onLoad: function () {
    // 最后一个参数必填
    this.countUp = new WxCountUp('number', 5234, {}, this);
  },

  start() {   
    this.countUp = new WxCountUp('number', 5234, {}, this); 
    // 开始动画
    this.countUp.start();
    // this.countUp.start(() => console.log('Complete!'));
  },

  pauseResume() {
    // 暂停/重新开始
    this.countUp.pauseResume();
  },

  reset() {
    // 重置
    this.countUp.reset();
  },

  update() {
    // 更新为新值
    this.countUp.update(1000);
  },
})

参数说明:

  • target是滚动对象,一般是要操作绑定的data对象名称,传string
  • endVal 滚动结束时的数字
  • options 为配置对象,后面会详细介绍
  • context 是微信小程序当前的this对象,必填参数

Options (非必填项)

  • startVal 滚动开始的数字,默认0
  • decimalPlaces 数据位数,默认0
  • duration 动画间隔时间,默认2秒
  • useGrouping 是否按组间隔,默认true 例如1,000 false则1000
  • useEasing 是否使用缓动效果,默认为true,就是从快到慢的变化,该效果可定制
  • smartEasingThreshold 如果使用缓动,则对大于此值的大数值平滑缓动,默认为999
  • smartEasingAmount 超过阈值的数字将被放宽,默认为333
  • separator 按组间隔标识,默认为’,
  • decimal 小数点标识,默认为’.
  • easingFn 例如 (t: number, b: number, c: number, d: number) => number;
  • formattingFn 例如 (n: number) => string;
  • prefix 以结果为前缀的文本,默认为空
  • suffix 以结果为后缀的文本,默认为空
  • numerals 数字符号替换

参考

CountUp.js

requestAnimationFrame帧渲染-微信小程序 canvas 动画踩坑


文章作者: feico
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 feico !
评论
  目录