详解微信小程序动画Animation执行过程

详解微信小程序动画Animation执行过程

微信小程序是一种轻量化的应用程序,常用于展示性质较强的场景,并且它内置了易用且功能强大的动画组件Animation,下面我们就来详解一下这个组件的执行过程。

Animation的基本结构

在使用Animation时,我们需要先创建一个Animation实例,其结构如下:

var animation = wx.createAnimation({
  duration: 1000,
  timingFunction: 'ease',
  delay: 0,
  transformOrigin: '50% 50% 0'
})

其中各个属性的含义如下:

  • duration:动画的运行时间,单位为毫秒,默认值为0。
  • timingFunction:动画的运动方式,默认为'linear',可以设置成'ease-in'、'ease-out'、'ease-in-out'、'step-start'或'step-end'等。
  • delay:动画的延迟时间,单位为毫秒,默认值为0。
  • transformOrigin:动画的操作中心,默认为'50% 50% 0'(即元素中心点)。

Animation的执行方式

在创建了Animation实例后,我们就可以通过调用Animation的方法,来执行动画,常用的有以下三种方式:

赋值给组件的animation属性

该方式适用于要对页面中某个组件进行动画效果的情况,在wxml文件中通过该组件的animation属性来绑定该组件的动画。示例如下:

<view animation="{{ animation }}"></view>

然后在js文件中,通过Animation实例的方法,对animation属性进行操作。示例如下:

animation.translate(100).step()
this.setData({
  animation: animation.export()
})

需要注意的是,当调用Animation实例的方法时,每次调用完毕后需要调用一次step()方法来动态更新当前的动画。

导出动画队列

该方式适用于多个组件需要同时进行动画效果的情况,可以通过调用Animation实例的export()方法,将动画队列导出为数组,然后在页面中通过animation属性进行绑定。示例如下:

animation.opacity(0.2).translateX(30).step()
animation.opacity(1).translateX(0).step()

this.setData({
  animationData: animation.export()
})

在wxml文件中,可以通过animation属性来绑定动画数组。示例如下:

<view animation="{{ animationData }}"></view>

需要注意的是,当通过导出动画队列方式执行动画时,如果每个动画的时间和延迟时间不一致,会存在动画跳跃的情况,可以在导出时设置动画队列的delay属性来解决。

使用回调函数

该方式适用于多个动画有先后顺序的情况,可以通过调用Animation实例的step()方法来将当前的动画添加到动画队列中,然后通过回调函数的方式,执行下一个动画。示例如下:

animation.translate(100, 50).step().rotate(45).step()

this.setData({
  animationData: animation.export()
})

setTimeout(function() {
  animation.translate(-100, 50).step().rotate(-45).step()

  this.setData({
    animationData: animation.export()
  })
}.bind(this), 1000)

在上述示例中,第一步先执行translate动画,成功后调用step()方法将其添加到队列中,然后接着执行rotate动画,并且同样将其添加到队列中。然后通过setData方法,将动画队列绑定到页面上。

接下来通过setTimeout延迟1秒执行下一步动画,即将元素移回原位置并且还原旋转角度,然后同样通过调用step()方法,将nextRotate动画添加到队列中,最后通过setData方法将动画队列绑定到页面上。

示例说明

下面通过两个示例,分别演示如何通过Animation实例执行动画。

示例1

在该示例中,我们控制了一个图片从左上角沿直线向右下角移动到中心点,并在到达中心点时进行旋转和缩小的动画效果。示例代码如下:

<!-- index.wxml -->

<view class="wrapper">
  <image 
    class="image"
    animation="{{ animation }}"
    src="../../images/logo.png"
    mode="aspectFit">
  </image>
</view>
// index.js

Page({
  data: {
    animation: null
  },

  onLoad: function() {
    var animation = wx.createAnimation({
      duration: 1000,
      timingFunction: 'ease',
      delay: 0,
      transformOrigin: '50% 50% 0'
    })

    animation
      .translateX(250).translateY(250)
      .rotate(360).scale(0.2).opacity(0.3)
      .step()

    this.setData({
      animation: animation.export()
    })
  }
})

在以上代码中,我们先通过createAnimation方法创建了一个Animation实例,然后通过调用它的translateX和translateY方法,实现了图片沿直线向右下角移动的效果。然后又分别调用了rotate、scale和opacity方法,实现了图片旋转、缩小和透明度变化的效果。最后通过调用step方法将所有动画添加到动画序列中,然后通过export方法将动画序列导出为一个数组,赋值给了页面的animation属性。

示例2

在该示例中,我们创建了一个不断上下跳动的图标效果,并且使用了连续动画和回调函数的方式实现。示例代码如下:

<!-- index.wxml -->

<view class="wrapper">
  <image 
    class="image"
    animation="{{ animation }}"
    src="../../images/logo.png"
    mode="aspectFit">
  </image>
</view>
// index.js

Page({
  data: {
    animation: null
  },

  onLoad: function() {
    var animation = wx.createAnimation({
      duration: 1000,
      timingFunction: 'ease',
      delay: 0,
      transformOrigin: '50% 50% 0'
    })

    this.animation = animation

    this.upAndDown()
  },

  upAndDown: function() {
    this.animation.translateY(-20).step()
    this.animation.translateY(20).step()

    this.setData({
      animation: this.animation.export()
    })

    setTimeout(this.upAndDown, 1000)
  }
})

在以上代码中,我们先通过createAnimation方法创建了一个Animation实例,并将它赋值给this.animation属性。在upAndDown方法中,我们通过调用动画的translateY方法,实现了图片的上下跳动效果,并且通过连续调用step方法,将其添加到动画队列中。然后通过setData方法将该动画队列绑定到了页面组件的animation属性上。最后通过setTimeout方法,循环调用upAndDown方法,使图片不断进行上下跳动的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解微信小程序动画Animation执行过程 - Python技术站

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

相关文章

  • 最流行的Node.js精简型和全栈型开发框架介绍

    介绍 Node.js 是一个非常流行的 Javascript 运行环境,可以用于编写服务器端的 Javascript 应用程序。Node.js 技术生态圈非常活跃,有大量的优秀开发框架,方便开发人员快速构建 Web 应用程序。 在 Node.js 的开发框架领域,有两种常见的类型:精简型和全栈型。精简型框架提供了基础的功能,开发者可以根据实际需求自行扩展。全…

    JavaScript 2023年5月19日
    00
  • JavaScript 正则表达式(笔记)

    JavaScript 正则表达式(笔记) 什么是正则表达式? 正则表达式是一种用于匹配文本规律的表达式。 在 JavaScript 中,由 RegExp 对象来支持正则表达式的相关操作。 正则表达式语法 在 JavaScript 中,我们可以使用特殊字符来创建正则表达式模式。下面介绍一些基本语法。 字符组 [] 字符组用于匹配多个字符中的任意一个。 示例: …

    JavaScript 2023年5月19日
    00
  • Fuse.js模糊查询算法学习指南

    Fuse.js模糊查询算法学习指南 算法简介 Fuse.js是一款用于快速模糊搜索的JavaScript库。它使用了一种称为模糊查询算法的算法,能够在无需进行复杂的文件预处理或搜索索引的情况下,在大量数据中高效地进行模糊搜索。 Fuse.js算法的流程如下: 初始化:将查询的关键字转化为需要搜索的模式。 评估:根据搜索模式计算每个文本的匹配程度。 排序:将文…

    JavaScript 2023年6月11日
    00
  • 原生js实现获取form表单数据代码实例

    获取 form 表单数据是 Web 开发中常见的需求,可以使用 JavaScript 代码来实现这一功能。本文将介绍如何使用原生 JavaScript 获取表单数据。 获取表单元素 要获取表单数据,首先需要获取表单元素。可以使用以下代码来获取表单元素: const formElement = document.getElementById(‘form’); …

    JavaScript 2023年6月10日
    00
  • JavaScript分步实现一个出生日期的正则表达式

    JavaScript分步实现一个出生日期的正则表达式攻略包括以下步骤: 1. 确定正则表达式的格式 根据出生日期的格式,确定正则表达式的格式,例如中国大陆的格式通常为YYYY-MM-DD,美国通常为MM/DD/YYYY或者DD/MM/YYYY,可以针对不同的格式进行相应的正则表达式编写。例如,针对中国大陆的格式,我们可以编写如下正则表达式: ^\d{4}-(…

    JavaScript 2023年6月10日
    00
  • JS跨域总结

    JS跨域总结攻略 什么是跨域 在浏览器中,一个Web页面从一个服务器的域名、端口或协议请求资源时,如果该请求目标与该Web页面的域名、端口或协议不一致,就会发生跨域。 JS跨域的原因 跨域问题的出现是因为浏览器的同源策略。同源策略是浏览器对JavaScript代码的安全限制,同源是指协议,域名,端口号均相同。浏览器阻止页面中的JavaScript程序去访问不…

    JavaScript 2023年6月11日
    00
  • 解析JavaScript中的不可见数据类型

    首先我们需要了解JavaScript中的不可见数据类型。 JavaScript中有七种数据类型:Undefined、Null、Boolean、Number、String、Object和Symbol(ES6新增)。其中Undefined和Null可以称为“空数据类型”,因为它们只有一个值:undefined和null。但是这两个值在JavaScript的底层实…

    JavaScript 2023年6月10日
    00
  • js 函数调用模式小结

    JS 函数调用模式小结 函数是 JavaScript 中的重要部分,函数可以通过多种方式调用。在本文中,我们将总结函数的几种调用模式,以及它们的区别和应用场景。 函数调用模式 1. 函数调用模式 这是最基本的一种调用模式。直接使用函数名并传递参数进行调用即可。 function printHello(name){ console.log(`Hello, ${…

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