微信小程序实现数字滚动动画

yizhihongxing

实现数字滚动动画需要用到小程序中的 animationsetData 方法,具体步骤如下:

1. 页面结构

在 wxml 文件中,需要准备一个数字占位符,以及一个用于显示数字的文本框。

<view class="number-placeholder">{{ number }}</view>
<view class="number-display">{{ displayNumber }}</view>

其中,.number-placeholder 类用于占位置,.number-display 类用于显示数字。为了让文本框看起来更美观,可以给它添加一些样式:

.number-display {
  font-size: 32px;
  color: #ff6886;
  font-weight: bold;
}

2. 动画实现

在 js 文件中,定义一个 animation 对象,并设置初始状态。同时,定义一个用于显示的数字和一个计时器,初始值都为 0。

Page({
  data: {
    number: 1234567890,
    displayNumber: 0,
    timer: null,
    animationData: null,
  },

  onLoad: function () {
    // 初始化 animation 对象
    let animation = wx.createAnimation({
      duration: 1000,
      timingFunction: "linear",
    });
    this.setData({
      animationData: animation.export(),
    });
  },
});

接下来,在 onShow 方法中启动计时器,每隔一段时间更新显示数字。

onShow: function () {
  this.startTimer();
},

startTimer: function () {
  let that = this;
  let step = 7890;
  let count = 0;

  that.setData({ displayNumber: 0 });

  let timer = setInterval(function () {
    count++;
    if (count > step) {
      clearInterval(that.data.timer);
      return;
    }
    let newNumber = Math.ceil(that.data.number * (count / step));
    that.setData({ displayNumber: newNumber });
  }, 10);

  that.setData({ timer: timer });
},

在计时器中,我们首先将显示数字 displayNumber 设为 0,然后每隔 10 毫秒更新一次数字,更新的值为原始数字乘以 0 到 1 之间的比例。这样,则会让显示数字从 0 逐渐增加到原始数字。

接下来,我们将动画与数字绑定,实现数字的滚动效果。在计时器中,添加如下代码:

  let animation = wx.createAnimation({
    duration: 1000,
    timingFunction: "linear",
  });
  animation
    .top("-60rpx")
    .step()
    .top("0")
    .step({ duration: 0 });
  that.setData({
    animationData: animation.export(),
  });

此段代码首先创建一个 animation 对象,并设置动画效果为线性。然后,我们在 1 秒钟内将文本框向上移动 60 像素,并将动画段的状态保存到 animationData 中。动画结束后,将文本框移回原位置,duration: 0 表示这是一个瞬间完成的动画。

3. 示例说明

示例一:带有参数的动画函数

在实际开发中,可以封装一个带有参数的动画函数,方便复用。下面是一个示例:

    function animateNumber(number, duration) {
      let that = this;
      let step = duration / 10;
      let count = 0;
      let animation = wx.createAnimation({
        duration: duration,
        timingFunction: "linear",
      });

      that.setData({ displayNumber: 0 });

      let timer = setInterval(function () {
        count++;
        if (count > step) {
          clearInterval(that.data.timer);
          return;
        }
        let newNumber = Math.ceil(number * (count / step));
        that.setData({ displayNumber: newNumber });
      }, 10);

      animation
        .top("-60rpx")
        .step()
        .top("0")
        .step({ duration: 0 });
      that.setData({
        animationData: animation.export(),
      });

      that.setData({ timer: timer });
    }

    // 调用 animateNumber 函数
    animateNumber.call(this, 9876543210, 2000);

可以看到,这个函数接收两个参数,分别是目标数字和动画时长。在函数体中,我们重复了之前计时器的逻辑部分,但是将初始数字和计时器清理都从数据里面移到了函数外部。在计时器结束后,执行和之前一样的动画效果,实现数字滚动效果。

示例二:使用插件实现滚动数字

如果你不想手写动画,也可以使用现成的数字滚动插件,并修改样式适应自己的需求。下面是一个示例:

<view class="number-display">
  <text class="number-text">{{ number }}</text>
  <number-scrolling duration="{{ duration }}" class="number-scrolling" wx:if="{{ useScrolling }}"></number-scrolling>
  <number-text duration="{{ duration }}" class="number-scrolling" wx:else></number-text>
</view>

在 wxml 文件中,我们引入了一个名叫 number-scrolling 的插件,然后根据需要选择是否使用。如果使用,则插件会产生滚动数字的效果;如果不使用,则直接显示目标数字。同时,我们将样式分离到 .number-text.number-scrolling 两个类中,以便样式调整。

.number-text {
  font-size: 32px;
  color: #ff6886;
  font-weight: bold;
  text-align: center;
}

.number-scrolling {
  height: 40px;
  overflow: hidden;
  position: relative;
}

.number-scrolling .number-scrolling-item {
  position: absolute;
  top: 0px;
}

js 文件中,我们需要导入插件,并设置插件参数:

const numberScrollingBehaviors = require('../../behaviors/number-scrolling');

Page({
  behaviors: [numberScrollingBehaviors],

  data: {
    number: 1234567890,
    duration: 2000,
    useScrolling: true,
  },
});

注意,在 js 文件中,我们需要导入 number-scrolling 插件的行为,以便使用插件提供的方法和属性。

完整代码及效果请参考示例

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序实现数字滚动动画 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • javascript里模拟sleep(两种实现方式)

    下面是JavaScript模拟sleep的两种实现方式的详细攻略。 方式一:使用Promise对象 定义async函数: async function sleep(duration) { return new Promise(resolve => setTimeout(resolve, duration)) } 将需要延迟执行的代码放在async函数中…

    JavaScript 2023年6月11日
    00
  • 简单了解JavaScript中的new Function

    下面是有关JavaScript中的new Function的详细解释和示例: 什么是new Function? new Function是JavaScript语言中的一种特殊语法,它可以使用字符串的形式来动态创建一个函数。 语法格式如下: new Function([param1, param2, …paramN], functionBody) 其中,p…

    JavaScript 2023年5月27日
    00
  • JavaScript使用yield模拟多线程的方法

    下面是我准备的详细攻略。 前言 JavaScript本身是单线程的,即一次只能执行一个任务。这限制了JavaScript在一些需要同时执行多个任务的场景下的表现。 为了解决这个问题,JavaScript社区为我们提供了多线程的方案:使用Web Worker。Web Worker让我们能够在JS中使用多线程在后台运行JS程序。 然而,在某些更简单的情况下,我们…

    JavaScript 2023年5月28日
    00
  • JavaScript 获取当前时间戳的代码

    获取当前时间戳是指获取当前时间与某一特定时间(一般为1970年1月1日00:00:00 UTC)之间的毫秒数。JavaScript提供了多种方法来获取当前时间戳。 Date对象的getTime()方法 在JavaScript中,Date对象提供了getTime()方法来获取当前时间戳。该方法返回自1970年1月1日00:00:00 UTC以来的毫秒数。以下是…

    JavaScript 2023年5月27日
    00
  • 上周日为开始日,本周六为结束日,这一周在一年中的所在周数

    function getWeekNumber(date) { // 创建表示周日的新 Date 对象并获取其时间戳 const sunday = new Date(date.getFullYear(), date.getMonth(), date.getDate() – date.getDay()); const sundayTimestamp = sund…

    JavaScript 2023年4月24日
    00
  • java NIO 详解

    Java NIO 详解 Java NIO(New IO)是一种基于缓冲区、非阻塞IO的API集,主要用于替代传统的Java IO API。它可以更高效地处理IO数据,具有更好的扩展性和灵活性,尤其适用于处理大量连接和请求的场景。 在本文中,我们将从以下几个方面对Java NIO进行详细讲解: 缓冲区(Buffer)及其操作 通道(Channel)及其操作 选…

    JavaScript 2023年5月28日
    00
  • 老生常谈JavaScript面向对象基础与this指向问题

    你好,关于“老生常谈JavaScript面向对象基础与this指向问题”的攻略如下: JavaScript对象基础 1.对象 对象是JavaScript中最重要的数据类型之一。对象可以拥有属性和方法,属性是对象的特征,属性的值可以是基本类型、对象类型或函数类型。方法是一种可以访问对象中属性的函数。 JavaScript对象可以使用对象字面量、构造函数和Obj…

    JavaScript 2023年6月10日
    00
  • JavaScript针对网页节点的增删改查用法实例

    当我们开发一个网页时,我们经常需要对页面节点进行操作。例如,添加一个新的节点,删除一个旧的节点,修改一个已有节点,或查找某个特定的节点。JavaScript提供了强大的功能来完成这些任务。在这里,我将为你讲解如何使用JavaScript来增删改查网页节点。 增加节点 在JavaScript中,我们可以通过创建一个新的节点并将其附加到现有的节点上来添加新的内容…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部