94.HarmonyOS NEXT动画系统实现教程:深入理解FuncUtils

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!

HarmonyOS NEXT动画系统实现教程:深入理解FuncUtils

文章目录

  • HarmonyOS NEXT动画系统实现教程:深入理解FuncUtils
    • 1. 动画系统基础
      • 1.1 核心概念
      • 1.2 动画执行函数解析
    • 2. 动画实现详解
      • 2.1 参数说明
      • 2.2 动画曲线类型
    • 3. 角度计算功能
      • 3.1 角度标准化函数
      • 3.2 角度计算原理
    • 4. 实践应用
      • 4.1 基本动画示例
      • 4.2 复杂动画组合
    • 5. 最佳实践
      • 5.1 动画性能优化
      • 5.2 错误处理
    • 6. 调试与优化
      • 6.1 动画调试
      • 6.2 常见问题解决

1. 动画系统基础

1.1 核心概念

概念说明应用场景
动画持续时间动画执行的时长控制动画速度
动画曲线动画的变化规律定义动画效果
动画回调动画执行的具体内容实现状态变化

1.2 动画执行函数解析

export function runWithAnimation(fn: Function,duration: number = ImageViewerConstants.ANIMATE_DURATION,curve: Curve = Curve.Smooth): void {animateTo({ duration: duration, curve: curve }, () => {fn();})
}

2. 动画实现详解

2.1 参数说明

参数类型默认值说明
fnFunction-动画执行的回调函数
durationnumberANIMATE_DURATION动画持续时间
curveCurveCurve.Smooth动画曲线类型

2.2 动画曲线类型

// 常用动画曲线
const curves = {Smooth: Curve.Smooth,    // 平滑过渡Linear: Curve.Linear,    // 线性变化EaseIn: Curve.EaseIn,   // 渐入EaseOut: Curve.EaseOut  // 渐出
};

3. 角度计算功能

3.1 角度标准化函数

export function simplestRotationQuarter(angle: number): number {const FULL_CIRCLE = 360;const QUADRANT_DEGREES = 90;const BOUNDARY_OFFSET = 44.5;// 标准化角度let normalizedAngle = angle % FULL_CIRCLE;// 计算象限const QUADRANT = Math.floor((Math.abs(normalizedAngle) + BOUNDARY_OFFSET) / QUADRANT_DEGREES) % 4;// 获取标准角度const standardRotations = [0, 90, 180, 270];let rotation = standardRotations[QUADRANT];// 保持方向let finalRotation = rotation * (angle >= 0 ? 1 : -1);return finalRotation || 0;
}

3.2 角度计算原理

  1. 角度标准化

    • 使用取模运算限制在360度内
    • 处理负角度情况
    • 保持旋转方向
  2. 象限确定

    • 使用偏移量处理边界情况
    • 计算所在象限
    • 映射到标准角度

4. 实践应用

4.1 基本动画示例

// 简单的淡入动画
runWithAnimation(() => {this.opacity = 1;
}, 300, Curve.EaseIn);// 旋转动画
runWithAnimation(() => {this.rotation = simplestRotationQuarter(this.currentAngle);
});

4.2 复杂动画组合

// 组合多个动画效果
function complexAnimation() {runWithAnimation(() => {// 同时改变多个属性this.scale = 1.2;this.opacity = 0.8;this.rotation = 45;}, 500, Curve.Smooth);
}

5. 最佳实践

5.1 动画性能优化

  1. 合理使用动画
// 避免频繁触发
let isAnimating = false;
function safeAnimation() {if (isAnimating) return;isAnimating = true;runWithAnimation(() => {// 动画内容}, 300, Curve.Smooth);setTimeout(() => {isAnimating = false;}, 300);
}
  1. 动画时长控制
// 根据设备性能调整动画时长
const duration = performanceMode ? 200 : 300;
runWithAnimation(fn, duration);

5.2 错误处理

function safeRunAnimation(fn: Function) {try {runWithAnimation(() => {fn();});} catch (error) {console.error('Animation failed:', error);// 直接执行,不使用动画fn();}
}

6. 调试与优化

6.1 动画调试

  1. 状态监控
runWithAnimation(() => {this.value = newValue;console.log('Animation value:', this.value);
});
  1. 性能分析
const startTime = Date.now();
runWithAnimation(() => {// 动画内容
}, 300, Curve.Smooth);
console.log('Animation duration:', Date.now() - startTime);

6.2 常见问题解决

问题原因解决方案
动画卡顿执行时间过长减少动画时长,简化动画内容
动画不流畅帧率过低使用简单的动画曲线,减少同时动画数量
动画不生效参数错误检查参数类型和值范围

通过合理使用动画系统,可以为应用添加流畅的交互效果。在实际开发中,要注意性能优化和错误处理,确保动画效果既美观又流畅。同时,合理使用角度计算功能,可以实现准确的旋转效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI日报 - 2025年3月17日

🌟 今日概览(60秒速览) ▎🤖 AGI突破 | GPT-o1在卡内基梅隆大学数学考试中获满分,展示AI数学能力新高度 成本仅5美分/题,推理速度不到1分钟 ▎💼 商业动向 | Figure推出BotQ机器人制造设施&…

Tauri + Vite + SvelteKit + TailwindCSS + DaisyUI 跨平台开发详细配置指南(Windows)

Tauri Vite SvelteKit TailwindCSS DaisyUI 跨平台开发详细配置指南(Windows) 本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议。转载请注明出处及本声明 原文链接:[你的文章链接] 🛠️ 环境准备 1. 安装核心工具…

在 macOS 上优化 Vim 用于开发

简介 这篇指南将带你通过一系列步骤,如何在 macOS 上优化 Vim,使其具备 代码补全、语法高亮、代码格式化、代码片段管理、目录树等功能。此外,我们还会解决在安装过程中可能遇到的常见错误。 1. 安装必备工具 在开始 Vim 配置之前&#xff…

golang开发支持onlyoffice的token功能

一直都没去弄token这块,想着反正docker run的时候将jwt置为false即可。 看了好多文章,感觉可以试试,但是所有文件几乎都没说思路。 根据我的理解和成功的调试,思路是: 我们先定义2个概念,一个是文档下载…

Android wifi的开关Settings值异常分析

Android wifi的开关Settings值异常分析 文章目录 Android wifi的开关Settings值异常分析一、前言二、异常分析1、adb或者串口获取Settings的wifi开关值2、代码获取wifi开关值3、根据日志分析代码(1)logcat 对应的wifi开启日志的代码①WifiServiceImpl.java② WifiSettingsStore…

C#的委托Action

在 C# 中,Action 是一个预定义的委托类型,它位于 System 命名空间下。下面详细介绍它的作用和使用方法。 作用 Action 委托的主要作用是封装一个方法,这个方法没有返回值(即返回类型为 void)。它提供了一种简洁的方式…

Qt MainWindow简单例子(文本编辑)

使用Qt控件练习文本编辑窗口的创建。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QLabel> #include <QProgressBar>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public Q…

DeepSeek-prompt指令-当DeepSeek答非所问,应该如何准确的表达我们的诉求?

当DeepSeek答非所问&#xff0c;应该如何准确的表达我们的诉求&#xff1f;不同使用场景如何向DeepSeek发问&#xff1f;是否有指令公式&#xff1f; 目录 1、 扮演专家型指令2、 知识蒸馏型指令3、 颗粒度调节型指令4、 时间轴推演型指令5、 极端测试型6、 逆向思维型指令7、…

Mac中nvm切换node版本失败,关闭终端再次打开还是之前的node

Mac中使用 nvm 管理 node 版本&#xff0c;在使用指令&#xff1a;nvm use XXX 切换版本之后。 关闭终端&#xff0c;再次打开&#xff0c;输入 node -v 还是得到之前的 node 版本。 原因&#xff1a; 在这里这个 default 中有个 node 的版本号&#xff0c;使用 nvm use 时&a…

织梦dedecmsV5.7提示信息提示框美化(带安装教程和效果展示)

一、效果展示 1、安装前效果 2、安装后效果 二、安装说明 1、安装测试版本&#xff1a;DedeCMS-V5.7.117-UTF8&#xff1b; 2、必须在修改代码之前请做好文件备份&#xff0c;以免误操无法恢复&#xff1b; 3、为了兼容其他版本&#xff0c;请在安装时&#xff0c;最好将替…

Science Advances 视触觉传感机制的交互装置,可以实时测量来自手不同部位的分布力

近日&#xff0c;由香港科技大学&#xff08;HKUST&#xff09;电子与计算机工程学系申亚京教授领导的研究团队&#xff0c;提出了一种基于数字通道的触觉交互系统&#xff0c;可以实时测量来自手不同部位的分布力&#xff0c;有望在医学评估、体育训练、机器人和虚拟现实&…

MySQL单表查询大全【SELECT】

山再高&#xff0c;往上攀&#xff0c;总能登顶&#xff1b;路再长&#xff0c;走下去&#xff0c;定能到达。 Mysql中Select 的用法 ------前言------【SELECT】0.【准备工作】0.1 创建一个库0.2 库中创建表0.3 表中加入一些数据 1.【查询全部】2.【查询指定列】2.1查询指定列…

Vue调用子组件init方法时报错Cannot read properties of undefined (reading ‘init‘)解决方法

调用init方法语句写在this.$nextTick(() > {});方法里&#xff0c;因为nextTick方法在页面元素加载完之后调用 this.$nextTick(() > {this.$refs.chartComponent.init();});如果还报错&#xff1a;Error in nextTick: "TypeError: Cannot read properties of undef…

怎么解决在Mac上每次打开文件夹都会弹出一个新窗口的问题

在Mac上每次打开文件夹都会弹出一个新窗口的问题&#xff0c;可以通过以下方法解决‌ ‌调整Finder设置‌&#xff1a; 打开Finder&#xff0c;点击“Finder”菜单&#xff0c;选择“偏好设置”。在偏好设置中&#xff0c;选择“通用”标签。取消勾选“在标签页中打开文件夹”或…

从 Prop Drilling 到 Context:React 状态管理的演进与抉择

Context的出现解决了什么问题&#xff1f; Vue中的provide/inject和React中的Context非常相似&#xff0c;具体区别如下&#xff1a; 可以看到实际上最大的区别在于Vue是响应式&#xff0c;React是非响应式 那么context具体解决了什么问题&#xff1f;我们先看下面这个例子&a…

考研408-数据结构完整代码 线性表的顺序存储结构 - 顺序表

线性表的顺序存储结构 - 顺序表 1. 顺序表的定义 ​ 用一组地址连续的存储单元依次存储线性表的数据元素&#xff0c;从而使逻辑上相邻的两个元素在物理位置上也相邻 2. 顺序表的特点 随机访问&#xff1a; 即通过首地址和元素序号可以在O(1) 时间内找到指定元素&#xff0…

【经验分享】SpringBoot集成WebSocket开发02 之 实现一个基本示例并Spring Bean注入的方式来组织代码

结合Spring Boot和WebSocket实现一个基本示例&#xff0c;并且使用Spring Bean注入的方式来组织代码。 1. 创建Spring Boot项目 首先&#xff0c;确保你有一个Spring Boot项目&#xff0c;并在pom.xml文件中引入了WebSocket相关的依赖。 <dependencies><!-- Spring…

DeepSeek-R1大模型微调技术深度解析:架构、方法与应用全解析

1. DeepSeek-R1大模型架构设计与技术特性 1.1 架构设计 DeepSeek-R1作为超大规模语言模型,其核心架构设计包含以下创新: 专家混合架构(MoE) 采用6710亿参数的混合专家架构(MoE),每个推理过程仅激活370亿参数,实现计算效率与资源利用率的突破性提升。 Transformer框架…

本地部署Hive集群

规划 服务机器Hive本体部署在Node1元数据服务所需的关系型数据库(MYSQL)部署在Node1 安装MYSQL数据库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql yum库 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.…

缓存之美:Guava Cache 相比于 Caffeine 差在哪里?

大家好&#xff0c;我是 方圆。本文将结合 Guava Cache 的源码来分析它的实现原理&#xff0c;并阐述它相比于 Caffeine Cache 在性能上的劣势。为了让大家对 Guava Cache 理解起来更容易&#xff0c;我们还是在开篇介绍它的原理&#xff1a; Guava Cache 通过分段&#xff08;…