当前位置: 首页 > article >正文

鸿蒙 使用动画 简单使用

鸿蒙 使用动画 简单使用

动画就两个,属性动画转场动画

属性动画只是组件的属性发生变化,而转场动画是指对将要出现消失的组件做动画,而文档的其他动画只是给这两个动画效果锦上添花罢了

这篇文章简单介绍这两个动画,其他的看文档去吧

属性动画

以下是三种 ArkUI 属性动画接口的对比表格,用通俗语言解释它们的核心差异:

对比维度animateToanimationkeyframeAnimateTo
功能定位打包式动画(集体行动)贴标签式动画(各自为战)里程碑式动画(分阶段闯关)
典型场景多个属性同步变化(如按钮点击缩放+变色)不同属性独立动画(如颜色渐变 1 秒,缩放 0.5 秒)复杂多阶段动画(如加载进度条分段变速)
代码结构包裹在闭包内的属性集合链式附加在属性后定义关键帧数组 + 全局参数
动画控制统一时长/曲线每个属性独立设置参数每个阶段独立设置时长/曲线
阶段数量单一阶段单一阶段多阶段(通过数组定义多个关键帧)
曲线独立性全局统一曲线属性独立曲线阶段独立曲线
延迟/循环控制仅支持全局延迟无内置延迟/循环支持全局延迟、循环次数(含无限循环)
嵌套能力支持多层嵌套动画不支持嵌套可与其他动画组合使用
性能优化建议优先用transform代替布局属性同左避免频繁改变布局属性
通俗类比交响乐团(统一指挥)独奏演员(各自演奏)电影分镜(按剧本分段表演)
一句话选择指南
  • 想让多个属性整齐划一变化 → animateTo
  • 想让不同属性各玩各的animation
  • 需要分步骤、变速的复杂动画 → keyframeAnimateTo
animateTo
animateTo(value: AnimateParam, event: () => void): void
  • value 指定 AnimateParam 对象(包括时长、Curve 等)
  • event 为动画的闭包函数

示例:点击后一个从左向右滚 90° 的方块且颜色变半透明

import { curves } from '@kit.ArkUI';@Entry
@Component
struct AnimateToDemo {@State animate: boolean = false;// 第一步: 声明相关状态变量@State rotateValue: number = 0; // 旋转角度@State translateX: number = 0; // 偏移量@State opacityValue: number = 1; // 透明度// 第二步:将状态变量设置到相关可动画属性接口build() {Row() {Column() {}.width(100).height(100).backgroundColor('#D94838').borderRadius(30).opacity(this.opacityValue).translate({ x: this.translateX }).rotate({ angle: this.rotateValue })}.onClick(() => {// 直接使用animateTo可能导致实例不明确的问题,建议使用getUIContext获取UIContext实例// 第三步:调用 keyframeAnimateTo 接口this.getUIContext()?.animateTo({ curve: curves.springMotion() }, () => {this.animate = !this.animate;// 旋转角度发生变化this.rotateValue = this.animate ? 90 : 0;// 透明度发生变化this.opacityValue = this.animate ? 0.6 : 1;// 位置属性发生变化this.translateX = this.animate ? 50 : 0;})})}
}
animation

把 animation 接口加在要做属性动画的可动画属性后即可

示例:点击后一个从左向右滚 90° 的方块且颜色变半透明

import { curves } from '@kit.ArkUI';@Entry
@Component
struct AnimationDemo {@State animate: boolean = false;// 第一步: 声明相关状态变量@State rotateValue: number = 0; // 旋转角度@State translateX: number = 0; // 偏移量@State opacityValue: number = 1; // 透明度// 第二步:将状态变量设置到相关可动画属性接口build() {Row() {Column() {}.width(100).height(100).backgroundColor('#D94838').borderRadius(30).opacity(this.opacityValue).translate({ x: this.translateX })// 第三步:通过属性动画接口开启属性动画.rotate({ angle: this.rotateValue }).animation({ curve: curves.springMotion() })// 这里和animateTo的不同,直接加.onClick(() => {this.animate = !this.animate;// 第四步:闭包内通过状态变量改变UI界面// 这里可以写任何能改变UI的逻辑比如数组添加,显隐控制,系统会检测改变后的UI界面与之前的UI界面的差异,对有差异的部分添加动画// 组件一的rotate属性发生变化,所以会给组件一添加rotate旋转动画this.rotateValue = this.animate ? 90 : 0;// 组件二的translate属性发生变化,所以会给组件二添加translate偏移动画this.translateX = this.animate ? 50 : 0;// 父组件column的opacity属性有变化,会导致其子节点的透明度也变化,所以这里会给column和其子节点的透明度属性都加动画this.opacityValue = this.animate ? 0.6 : 1;})}}
}
keyframeAnimateTo
keyframeAnimateTo(param: KeyframeAnimateParam, keyframes: Array<KeyframeState>): void

keyframeAnimateTo 接口参数中,第一个参数 KeyframeAnimateParam 为关键帧动画的整体参数(包括延时、播放次数、结束回调、期望帧率),第二个参数是一个数组,每一项表示一个关键帧内的动画行为;每一段动画可单独控制动画参数(包括时长、Curve 等)。

示例:点击后一个从左向右滚 90° 的方块且颜色变半透明,又滚回去且无限循环

@Entry
@Component
struct KeyframeAnimateToDemo {// 第一步: 声明相关状态变量@State rotateValue: number = 0; // 逆时针旋转90度恢复至0度@State translateX: number = 0; // 偏移量@State opacityValue: number = 1; // 透明度// 第二步:将状态变量设置到相关可动画属性接口build() {Row() {Column() {}.width(100).height(100).backgroundColor('#D94838').borderRadius(30).opacity(this.opacityValue).translate({ x: this.translateX }).rotate({ angle: this.rotateValue }).onClick(() => {this.getUIContext()?.keyframeAnimateTo({iterations: -1, // 无限循环}, [{// 第一段关键帧动画时长为800ms,顺时针旋转90度,透明度变从1变为0.6,translate从0位移到50duration: 800,event: () => {this.rotateValue = 90;this.opacityValue = 0.6;this.translateX = 50;}},{// 第二段关键帧动画时长为500ms,逆时针旋转90度恢复至0度,透明度变从0.6变为1,translate从50位移到0duration: 500,event: () => {this.rotateValue = 0;this.opacityValue = 1;this.translateX = 0;}}]);})}}
}

转场动画

文档太他妈多了,我就说下面这个吧

出现/消失转场:对新增、消失的控件实现动画效果
  • transition 是基础的组件转场接口,用于实现一个组件出现或者消失时的动画效果
  • 可以通过 TransitionEffect 对象的组合使用,定义出各式效果。

分三步写:

  1. 创建 TransitionEffect
  2. 将转场效果通过 transition 接口设置到组件
  3. 新增或者删除组件触发转场

示例:点击边框后组件跑了,组件跑的姿势很多

import { curves } from '@kit.ArkUI';@Entry
@Component
struct TransitionEffectDemo {@State isPresent: boolean = false;// 第一步,创建 TransitionEffectprivate effect: TransitionEffect =// 创建默认透明度转场效果,并指定了springMotion(0.6, 0.8)曲线TransitionEffect.OPACITY.animation({curve: curves.springMotion(0.6, 0.8)})// 通过combine方法,这里的动画参数会跟随上面的TransitionEffect,也就是springMotion(0.6, 0.8).combine(TransitionEffect.scale({x: 0,y: 0}))// 添加旋转转场效果,这里的动画参数会跟随上面带animation的TransitionEffect,也就是springMotion(0.6, 0.8).combine(TransitionEffect.rotate({ angle: 90 }))// 添加平移转场效果,这里的动画参数使用指定的springMotion().combine(TransitionEffect.translate({ y: 150 }).animation({ curve: curves.springMotion() }))// 添加move转场效果,这里的动画参数会跟随上面的TransitionEffect,也就是springMotion().combine(TransitionEffect.move(TransitionEdge.END));build() {Stack() {if (this.isPresent) {Column() {Text('ArkUI').fontWeight(FontWeight.Bold).fontSize(20).fontColor(Color.White)}.justifyContent(FlexAlign.Center).width(150).height(150).borderRadius(10).backgroundColor(0xf56c6c)// 第二步:将转场效果通过transition接口设置到组件.transition(this.effect)}// 边框Column().width(155).height(155).border({width: 5,radius: 10,color: Color.Black})}// 第三步:新增或者删除组件触发转场,控制新增或者删除组件.onClick(() => {this.isPresent = !this.isPresent;})}
}

写个第二象限的抛物线球形运动轨迹

@Entry
@Component
struct Index {@State x: number = 0ani() {this.x -= 5if (this.x <= -200) {this.x = 0}}build() {Row().width(50).height(50).borderRadius(25).margin({ top: 300, left: 200 }).backgroundColor('#AAA').translate({ x: this.x, y: -0.005 * this.x * this.x }).animation({duration: 10, curve: 'linear', onFinish: () => {this.ani()}}).onClick(_ => {this.x = -1})}
}

轨迹类似这种:从原点向上走
在这里插入图片描述

说明: translate 的值涉及到抛物线函数,y=ax^2+bx+c,就是抛物线函数
当b和c都为零时,就是从原点开始,y=a*x^2
在屏幕坐标系中,y 轴的正方向是向下的(与数学坐标系相反)
所以,x取负值this.x -= 5,y也要取负值y: -0.005 * this.x * this.x,才会保持曲线在坐标的第二象限

相关文章:

鸿蒙 使用动画 简单使用

鸿蒙 使用动画 简单使用 动画就两个&#xff0c;属性动画和转场动画 属性动画只是组件的属性发生变化&#xff0c;而转场动画是指对将要出现或消失的组件做动画&#xff0c;而文档的其他动画只是给这两个动画效果锦上添花罢了 这篇文章简单介绍这两个动画&#xff0c;其他的…...

MySQL数据库迁移SQL语句指南

MySQL数据库迁移SQL语句指南 一、基础迁移方法 1. 使用mysqldump进行全量迁移 -- 导出源数据库&#xff08;在命令行执行&#xff09; mysqldump -u [源用户名] -p[源密码] --single-transaction --routines --triggers --events --master-data2 [数据库名] > migration…...

arcgis和ENVI中如何将数据输出为tif

一、arcgis中转换为tif 右键图层&#xff1a; Data -> Export Data, 按照图示进行选择&#xff0c;选择tiff格式导出即可&#xff0c;还可以选择其他类型的格式&#xff0c;比如envi。 二、 ENVI中转换为tif File -> Save As -> Save As (ENVI, NITF, TIFF, DTED) …...

RagFlow 完全指南(一):从零搭建开源大模型应用平台(Ollama、VLLM本地模型接入实战)

文章目录 1. 相关资源2. 核心特性3. 安装与部署3.1 环境准备3.2 部署RagFlow3.3 更新RagFlow3.4 系统配置 4. 接入本地模型4.1 接入 Ollama 本地模型4.1.1 步骤4.1.2 常见问题 4.2 接入 VLLM 模型 5. 应用场景6. 总结 1. 相关资源 官网GitHub文档中心 2. 核心特性 &#x1f…...

计算机网络 4-2-1 网络层(IPv4)

2 IPv4分组 各协议之间的关系 IP协议(Internet Protocol, 网际协议)是互联网的核心&#xff01; ARP协议用于查询同一网络中的<主机IP地址&#xff0c;MAC地址>之间的映射关系 ICMP协议用于网络层实体之间相互通知“异常事件” IGMP协议用于实现IP组播 2.1 结构<首…...

Python赋能自动驾驶:如何打造高效的环境感知系统

Python赋能自动驾驶:如何打造高效的环境感知系统 大家好,我是 Echo_Wish,今天我们来聊聊自动驾驶里的“眼睛”——环境感知系统,以及如何用 Python 实现它。 自动驾驶的核心目标是让车辆在没有人工干预的情况下安全行驶,而要做到这一点,环境感知系统必须实时获取并理解…...

ST表(稀疏表)

对ST表进行一个简单的总结&#xff0c;它可以实现O(1)的静态区间查询&#xff0c;可以适用于查询操作频繁但数据不修改的场景 题目来源 https://www.luogu.com.cn/problem/P3865 题目介绍 给定一个长度为 N 的数列&#xff0c;和 M 次询问&#xff0c;求出每一次询问的区间…...

Java常用类-比较器

目录 一、为什么需要比较器&#xff1f;二、核心差异速记表三、Comparable&#xff1a;对象自带的 “默认规则”1. 核心作用2. 源码定义3. 实战&#xff1a;给Student类加默认规则4. 源码验证&#xff08;以Integer为例&#xff09; 四、Comparator&#xff1a;临时的 “外部规…...

Python----机器学习(模型评估:准确率、损失函数值、精确度、召回率、F1分数、混淆矩阵、ROC曲线和AUC值、Top-k精度)

一、模型评估 1. 准确率&#xff08;Accuracy&#xff09;&#xff1a;这是最基本的评估指标之一&#xff0c;表示模型在测试集上正确 分类样本的比例。对于分类任务而言&#xff0c;准确率是衡量模型性能的直观标准。 2. 损失函数值&#xff08;Loss&#xff09;&#xff1…...

Linux工作台文件操作命令全流程解析(高级篇之vim和nano精讲)

全文目录 1 简单易用的 Nano (入门之选)1.1 适用场景1.2 安装命令1.3 基础操作1.4 优点 2 功能强大的 Vim2.1 适用场景2.2 安装命令2.3 模式说明‌2.4 常用命令2.4.1 普通模式2.4.2 编辑模式2.4.3 可视模式2.4.4 命令行模式 3 参考文献 写在前面 作为运维或者研发&#xff0c;日…...

大数据产品销售数据分析:基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现

文章目录 大数据产品销售数据分析&#xff1a;基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现一、项目概述二、项目说明三、研究意义四、系统总体架构设计总体框架技术架构数据可视化模块设计图后台管理模块设计数据库设计 五、开发技术介绍Flask框架Python爬…...

VS2022 Qt配置Qxlsx

目录 1、下载QXlsx&#xff0c;并解压文件夹 ​编辑2、打开VS2022配置QXlsx 3、VS配置Qxslx库 方法一&#xff1a;常规方法 方法二&#xff1a;直接使用源码 方法三&#xff1a;将QXlsx添加到Qt安装目录&#xff08;暂时尝试未成功&#xff09; 1、下载QXlsx&#xff0c;…...

OSPF案例

拓扑图&#xff1a; 要求&#xff1a; 1&#xff0c;R5为ISP&#xff0c;其上只能配置IP地址&#xff1b;R4作为企业边界路由器&#xff0c; 出口公网地址需要通过PPP协议获取&#xff0c;并进行chap认证 2&#xff0c;整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;…...

1.1.2 简化迭代器 yield return的使用

yield return 是一个用于简化迭代器(Iterator)实现的关键字组合。它的核心作用是让开发者能够以更简洁的方式定义一个按需生成序列的方法(生成器方法),而无需显式实现 IEnumerable 或 IEnumerator 接口。yield return 方法会在每次迭代时按需生成下一个值,而不是一次性生…...

《用MATLAB玩转游戏开发》贪吃蛇的百变玩法:从命令行到AI对战

《用MATLAB玩转游戏开发&#xff1a;从零开始打造你的数字乐园》基础篇&#xff08;2D图形交互&#xff09;-&#x1f40d; 贪吃蛇的百变玩法&#xff1a;从命令行到AI对战 &#x1f3ae; 欢迎来到这篇MATLAB贪吃蛇编程全攻略&#xff01;本文将带你从零开始&#xff0c;一步步…...

【数据结构与算法】图的基本概念与遍历

目录 一、图的基本概念 1.1 图的基本组成 1.2 图的分类 1.3 顶点的度数 1.4 路径与回路 1.5 子图与特殊图 二. 图的存储结构 2.1 邻接矩阵 2.2 邻接表 三、深度优先遍历 3.1 原理 3.2 实现步骤 3.3 代码实现 四、广度优先遍历 4.1 原理 4.2 实现步骤 4.3 代码…...

MAE自监督大模型在医学报告生成中的应用

MAE自监督大模型在医学报告生成中的应用详解 一、核心技术原理与医学适配 MAE&#xff08;Masked Autoencoder&#xff09;通过掩膜重建策略&#xff0c;在医学影像领域展现出独特优势&#xff1a; 解剖结构理解&#xff1a;通过随机掩盖图像区域&#xff08;如75%的MRI切片&…...

Linux云服务器配置git开发环境

文章目录 1. 安装 git2. git clone3. git add .4. git commit -m 提交记录5. git push&#x1f351; 异常原因&#x1f351; 解决办法 6. git pull7. git log8. git rm9. git mv10. git status 1. 安装 git sudo yum install git -y2. git clone 此命令的作用是从远程仓库把代…...

Vue v-model 深度解析:实现原理与高级用法

一、v-model 的本质 v-model 是 Vue 中最常用的指令之一&#xff0c;它本质上是一个语法糖&#xff0c;用于在表单元素和自定义组件上实现双向数据绑定。在 Vue 2.x 和 Vue 3.x 中&#xff0c;v-model 的实现机制有所不同&#xff0c;但核心思想都是简化数据绑定的过程。 1.1…...

STM32F103单片机在不需要使用 JTAG 调试接口的情况下,释放引脚给其他功能使用。

最近调试STM32F103的时候&#xff0c;由于引脚比较紧张就用了PB3(SYS_JTDO-TRACESWO)引脚&#xff0c;带电下载完程序后&#xff0c;功能都是正常运行&#xff0c;但是断电再上电&#xff0c;PB3引脚就不受控制了&#xff0c;后来查了一下发现PB3不是普通的IO&#xff0c;需要关…...

手机浏览器IP归属地查询全指南:方法与常见问题解答

在当今数字化时代&#xff0c;手机浏览器已成为人们日常生活中不可或缺的工具之一。然而&#xff0c;在使用手机浏览器的过程中&#xff0c;有时我们需要了解当前网络连接的IP归属地信息&#xff0c;那么&#xff0c;手机浏览器IP归属地怎么查看呢&#xff1f;本文将详细介绍几…...

Microsoft Azure DevOps针对Angular项目创建build版本的yaml

Azure DevOps针对Angular项目创建build版本的yaml&#xff0c;并通过变量控制相应job的执行与否。 注意事项&#xff1a;代码前面的空格是通过Tab控制的而不是通过Space控制的。 yaml文件中包含一下内容&#xff1a; 1. 自动触发build 通过指定code branch使提交到此代码库的…...

Web 架构之负载均衡全解析

文章目录 一、引言二、思维导图三、负载均衡的定义与作用定义作用1. 提高可用性2. 增强性能3. 实现扩展性 四、负载均衡类型硬件负载均衡代表设备优缺点 软件负载均衡应用层负载均衡代表软件优缺点 网络层负载均衡代表软件优缺点 五、负载均衡算法轮询算法&#xff08;Round Ro…...

Linux系统管理与编程16:PXE自动化安装部署centos7.9操作系统

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 0.准备 1&#xff09;防火墙和SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config (很不好的…...

金丝雀/灰度/蓝绿发布的详解

以下是 金丝雀发布、灰度发布 和 蓝绿发布 的详细解析&#xff0c;涵盖核心原理、技术实现、适用场景及实际案例&#xff1a; 1. 金丝雀发布 (Canary Release) 核心原理 渐进式流量切换&#xff1a;将新版本部署到生产环境后&#xff0c;逐步将用户流量从旧版本迁移到新版本&…...

如何通过ABAP获取SAP生产订单的目标成本

SAP存储生产订单成本的主要底表包括&#xff1a; COBK: CO凭证表头COEP: CO凭证行项目COSS: 来自CO内部的汇总数据COSP: 来自CO外部部的汇总数据 先说结论&#xff1a;SAP 对生产订单的目标成本是没有保存到底表的。那么如何通过代码的方式获取呢&#xff1f; K_KKB_KKBCS_O…...

git 多个提交记录合并为一个

1.场景 有时候用devops等平台测试问题&#xff0c;需要多次修改小的记录提交&#xff0c;但是最终我们在合并主干的时候不想留那么多乱七八糟的记录&#xff0c;就需要在此分支合并这些提交记录&#xff0c;再合并到主干。 2.交互式变基 2.1 确定要合并的提交范围 # 查看最近…...

深入理解栈数据结构(Java实现):从原理到实战应用

在计算机科学的世界里&#xff0c;数据结构是构建高效程序的基石&#xff0c;而栈作为其中最基础且应用广泛的一种数据结构&#xff0c;其独特的 “后进先出&#xff08;LIFO&#xff09;” 特性&#xff0c;使其在众多领域发挥着关键作用。从算法设计到编译器实现&#xff0c;…...

支付宝 SEO 优化:提升小程序曝光与流量的完整指南

在拥有庞大用户基数的支付宝平台上&#xff0c;小程序已成为商家触达用户、提供服务的重要渠道。然而&#xff0c;随着平台上小程序数量的快速增长&#xff0c;如何在激烈的竞争中脱颖而出&#xff0c;获得更多的曝光和流量&#xff0c;成为每个开发者和运营者必须面对的关键挑…...

【leetcode100】最长重复子数组

1、题目描述 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,2,1] 。示例 2&…...