如何使用动画和日期差值来切换和展示任务-计划时钟(微信小程序)

ops/2025/2/21 15:58:32/

小程序>微信小程序-计划时钟已上线,欢迎各位小伙伴的测试和使用~(小程序>微信小程序搜计划时钟即可使用)

在这篇博客中,我们将介绍如何使用 JavaScript 和小程序>微信小程序wx.createAnimation API 来实现基于日期差值的切换动画。我们还会展示如何根据用户选择的日期,更新任务列表并展示任务详情。通过这种方式,你能够动态地展示与时间相关的内容,并且为用户提供更加生动和互动的体验。

一、根据日期差值进行动画切换

我们首先来看一下如何计算日期之间的差异,并使用这个差异来决定需要切换多少次动画。通过以下代码,我们能够根据用户选择的日期与当前日期之间的差异,来创建相应的切换效果。

// 根据日期差值来设置切换的次数
const switchTimes = Math.abs(dateDiff);  // 切换的次数,取差值的绝对值// 动画开始前清除当前动画
animation.translateX(0).step();// 按照日期差异的天数进行循环切换
for (let i = 0; i < switchTimes; i++) {// 判断切换的方向if (dateDiff > 0) {// 向右切换animation.translateX('100%').step();} else {// 向左切换animation.translateX('-100%').step();}// 动画返回animation.translateX(0).step();
}// 更新动画数据
this.setData({animationData_date: animation.export(),
});

代码解析

  1. 计算切换次数:首先,我们通过 Math.abs(dateDiff) 计算日期差值的绝对值,即切换的次数。dateDiff 变量是日期差异,以天为单位。
  2. 初始化动画:我们使用 wx.createAnimation 创建一个新的动画实例,并使用 animation.translateX(0).step() 清除之前的动画效果。
  3. 循环切换:通过循环 switchTimes 次,每次判断日期差异的方向。如果日期差值大于0,向右切换;否则,向左切换。每次切换后,动画都会恢复到初始位置(translateX(0))。
  4. 更新动画数据:最后,更新数据并将动画效果应用到页面。

二、处理日期格式与更新任务

在用户选择日期之后,我们需要解析日期,并格式化为“YYYY-MM-DD”的格式。之后,我们将根据该日期更新相关的任务列表。

console.log("this.data.selectedDate", this.data.selectedDate)
console.log(this.data.all_tasks[this.data.selectedDate])this.setData({selectedDate: `${this.data.currentMonth}${day}日`,dayInfo: `你选择的日期是:${day}号。`,tasks: this.data.all_tasks[this.data.selectedDate] || {}
});
console.log(this.data.selectedDate, this.data.tasks);// 使用正则表达式来提取年、月、日
let match = this.data.selectedDate.match(/^(\d{4})年(\d{1,2})月(\d{1,2})日$/);if (match) {// 通过正则匹配的结果来重构日期为 "YYYY-MM-DD" 格式let year = match[1];let month = match[2].padStart(2, '0'); // 确保月份是两位数let day = match[3].padStart(2, '0');   // 确保日期是两位数// 生成目标格式let formattedDate = `${year}-${month}-${day}`;this.setData({startDate: formattedDate,endDate: formattedDate,});
} else {console.log("日期格式不匹配");
}console.log("tasks", this.data.tasks)

代码解析

  1. 更新用户选择的日期:在 this.setData 中,我们首先更新了 selectedDate 和 dayInfo,将日期转换为用户可见的格式。
  2. 使用正则表达式提取日期:我们用正则表达式来匹配并提取年、月、日。如果日期格式匹配成功,我们将其格式化为标准的 “YYYY-MM-DD” 格式。
  3. 更新任务信息:最后,我们更新了与选定日期相关的任务列表。如果该日期没有任务数据,我们会默认设置为空对象。

三、计算日期差异

为了实现动画切换效果,我们还需要计算两个日期之间的差异。这是通过以下 calculateDateDifference 函数完成的:

// 计算日期差异(天数差)
calculateDateDifference: function(lastDate, newDate) {const lastDateObj = new Date(lastDate);const newDateObj = new Date(newDate);const timeDiff = newDateObj - lastDateObj;  // 时间差(毫秒)return timeDiff / (1000 * 3600 * 24);  // 转换为天数
}

代码解析

  • 日期转换:我们首先将日期字符串转换为 Date 对象。
  • 计算时间差:通过减去两个日期对象,我们得到它们之间的时间差(以毫秒为单位)。
  • 返回天数差:然后,我们将时间差除以 1000 * 3600 * 24,将其转换为天数。

四、弹窗动画效果

小程序中,我们还可以为弹窗添加一些动画效果。以下是一个简单的动画实现,当用户点击编辑计划时,弹窗会以缩放和位移的效果显示。

// 点击编辑计划时,弹出弹窗
onEditPlan(e) {// 创建一个动画实例const animation = wx.createAnimation({duration: 200, // 动画持续时间timingFunction: 'ease',});const section = e.currentTarget.dataset.section;if (section === 'task1') {animation.scale(0.95).translateY(5).step();  // task1 动画效果} else if (section === 'task2') {animation.rotate(45).scale(1.1).step();  // task2 动画效果} else if (section === 'task3') {animation.scale(1.1).translateX(5).step();  // task3 动画效果} else if (section === 'task4') {animation.scale(0.9).translateY(-5).step();  // task4 动画效果}this.setData({currentSection: section,isModalVisible: true,animationData: animation.export(),});
}

代码解析

  1. 创建动画实例:我们使用 wx.createAnimation 创建了一个新的动画实例,并设置了动画的持续时间和缓动效果。
  2. 根据任务类型应用不同动画:根据不同的任务类型(如 task1task2 等),我们给动画添加不同的效果,如缩放、旋转和位移。
  3. 显示弹窗:通过 this.setData 方法,设置动画数据,并显示弹窗。

五、关闭弹窗动画

为了让用户体验更流畅,我们可以为弹窗的关闭添加动画效果:

// 关闭弹窗
closeModal() {// 创建动画实例const animation = wx.createAnimation({duration: 300,  // 动画持续时间timingFunction: 'ease-in-out',  // 动画的缓动效果});// 设置动画效果:缩小并透明animation.scale(0.5).opacity(0).step();this.setData({animationData_close: animation.export(),});// 动画结束后可进行其他操作(如关闭弹窗等)setTimeout(() => {// 创建一个还原动画实例const restoreAnimation = wx.createAnimation({duration: 300,  // 恢复动画的持续时间timingFunction: 'ease-in-out',  // 恢复动画的缓动效果});// 还原到原来的大小和不透明restoreAnimation.scale(1).opacity(1).step();// 在这里处理动画结束后的逻辑,例如关闭模态框等this.setData({animationData_close: restoreAnimation.export(),isModalVisible: false})}, 300); // 300ms后执行
}

实现效果

总结

通过结合日期差异计算、动画效果和弹窗交互,您可以在小程序>微信小程序中实现更加动态和互动的用户体验。无论是根据日期差异来切换内容,还是通过动画效果来增加弹窗的交互性,这些技术都能够有效提升用户体验。希望这篇博客能帮助您更好地掌握这些技能,创建更加有趣的应用功能!


http://www.ppmy.cn/ops/160278.html

相关文章

物联网简介集合

物联网&#xff08;IoT&#xff09;指的是物理设备&#xff08;如电器和车辆&#xff09;之间的互联互通。这些设备嵌入了软件、传感器和连接功能&#xff0c;使其能够相互连接并交换数据。这项技术实现了从庞大的设备网络中收集和共享数据&#xff0c;为打造更高效、自动化的系…

5.【线性代数】—— 转置,置换和向量空间

五 转置&#xff0c;置换和向量空间 1. 置换矩阵2. 转置矩阵3. 对称矩阵4. 向量空间4.1 向量空间4.2 子空间 1. 置换矩阵 定义&#xff1a; 用于行互换的矩阵P。 之前进行ALU分解时&#xff0c;可能存在该行主元为0&#xff0c;要进行行互换&#xff0c;即PALU 性质&#xff1…

什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用

什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用 目录 什么是Embedding、RAG、Function calling、Prompt engineering、Langchain、向量数据库? 怎么使用Embedding(嵌入)RAG(检索增强生成)Function calling(函数调用)Pr…

Vue3 定义全局变量

main.js中定义app.config.globalProperties.$test 我是全局变量组件中使用<script setup>import { getCurrentInstance } from vueconst globalProperties getCurrentInstance().appContext.config.globalPropertiesconsole.log(globalProperties.$test) </script&g…

华为动态路由-OSPF-骨干区

华为动态路由-OSPF-骨干区 一、OSPF简介 1、OSPF概述 OSPF是一种开放式的、基于链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在自治系统内部进行路由选择和通信。 OSPF是互联网工程任务组&#xff08;IETF&#xff09;定义的标准之一&#xff0c;被广…

深入解析DeepSeek推理模型:混合专家架构与稀疏注意力机制的融合

摘要 DeepSeek推理模型凭借其独特的混合专家&#xff08;MoE&#xff09;架构和优化的Transformer架构&#xff0c;结合稀疏注意力机制&#xff0c;实现了资源高效分配与推理成本的降低。在训练过程中&#xff0c;DeepSeek采用蒸馏技术&#xff0c;不仅提升了数据质量&#xff…

【Python】如何在 Linux/Windows 系统中设置 PYTHONPATH 环境变量

什么是 PYTHONPATH&#xff1f; PYTHONPATH 是一个环境变量&#xff0c;它告诉 Python 解释器在哪些目录中查找要导入的模块。这对于包含不在标准目录中的自定义模块非常有用。 Linux 系统中设置 PYTHONPATH 环境变量 在 Python 开发环境中&#xff0c;正确设置 PYTHONPATH …

DeepSeek预测25考研分数线

25考研分数马上要出了。 目前&#xff0c;多所大学已经陆续给出了分数查分时间&#xff0c;综合往年情况来看&#xff0c;每年的查分时间一般集中在2月底。 等待出成绩的日子&#xff0c;学子们的心情是万分焦急&#xff0c;小编用最近爆火的“活人感”十足的DeepSeek帮大家预…