鸿蒙NEXT开发动画案例4

 1.创建空白项目


2.Page文件夹下面新建Spin.ets文件,代码如下:

/*** TODO SpinKit动画组件 - 双粒子旋转缩放动画* author: CSDN-鸿蒙布道师* since: 2025/05/08*/
@ComponentV2
export struct SpinFour {// 参数定义@Require @Param spinSize: number = 36;@Require @Param spinColor: ResourceColor = '#209ED8';// 局部状态@Local x1: number = 0;@Local y1: number = 0;@Local scale1: number = 1;@Local angle1: number = 0;@Local x2: number = this.spinSize * 0.65;@Local y2: number = this.spinSize * 0.65;@Local scale2: number = 1;@Local angle2: number = 0;aboutToAppear(): void {this.x2 = this.spinSize * 0.65;this.y2 = this.spinSize * 0.65;}build() {RelativeContainer() {Canvas().chunkStyle().translate({ x: this.x1, y: this.y1 }).scale({ x: this.scale1, y: this.scale1 }).rotate({ angle: this.angle1 })Canvas().chunkStyle().translate({ x: this.x2, y: this.y2 }).scale({ x: this.scale2, y: this.scale2 }).rotate({ angle: this.angle2 })}.width(this.spinSize).height(this.spinSize).onAppear(() => {this.startAnimation();});}/*** 启动无限循环的关键帧动画*/private startAnimation(): void {const uiContext = this.getUIContext();if (!uiContext) return;const keyframes1 = this.createKeyframes(1);const keyframes2 = this.createKeyframes(2);uiContext.keyframeAnimateTo({ iterations: -1, delay: 0 }, keyframes1);uiContext.keyframeAnimateTo({ iterations: -1, delay: 0 }, keyframes2);}/*** 根据粒子编号创建对应的关键帧动画* @param particleIndex 粒子索引(1 或 2)*/private createKeyframes(particleIndex: 1 | 2): Array<KeyframeState> {const updatePositionAndScale = (step: number): void => {if (particleIndex === 1) {switch (step) {case 1:this.scale1 = 0.5;this.angle1 = -90;this.x1 = this.spinSize * 0.65;break;case 2:this.scale1 = 1;this.angle1 = -180;this.x1 = this.spinSize * 0.65;this.y1 = this.spinSize * 0.65;break;case 3:this.scale1 = 0.5;this.angle1 = -270;this.x1 = 0;this.y1 = this.spinSize * 0.65;break;case 4:this.scale1 = 1;this.angle1 = -360;this.x1 = 0;this.y1 = 0;break;}} else {switch (step) {case 1:this.scale2 = 0.5;this.angle2 = -90;this.x2 = 0;this.y2 = this.spinSize * 0.65;break;case 2:this.scale2 = 1;this.angle2 = -180;this.x2 = 0;this.y2 = 0;break;case 3:this.scale2 = 0.5;this.angle2 = -270;this.x2 = this.spinSize * 0.65;break;case 4:this.scale2 = 1;this.angle2 = -360;this.x2 = this.spinSize * 0.65;this.y2 = this.spinSize * 0.65;break;}}};return [{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(1),},{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(2),},{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(3),},{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(4),},];}@StyleschunkStyle() {.height(this.spinSize * 0.35).width(this.spinSize * 0.35).backgroundColor(this.spinColor).shadow(ShadowStyle.OUTER_DEFAULT_XS)}
}
代码如下:
/*** TODO SpinKit动画组件 - 双粒子旋转缩放动画* author: CSDN-鸿蒙布道师* since: 2025/05/08*/
@ComponentV2
export struct SpinFour {// 参数定义@Require @Param spinSize: number = 36;@Require @Param spinColor: ResourceColor = '#209ED8';// 局部状态@Local x1: number = 0;@Local y1: number = 0;@Local scale1: number = 1;@Local angle1: number = 0;@Local x2: number = this.spinSize * 0.65;@Local y2: number = this.spinSize * 0.65;@Local scale2: number = 1;@Local angle2: number = 0;aboutToAppear(): void {this.x2 = this.spinSize * 0.65;this.y2 = this.spinSize * 0.65;}build() {RelativeContainer() {Canvas().chunkStyle().translate({ x: this.x1, y: this.y1 }).scale({ x: this.scale1, y: this.scale1 }).rotate({ angle: this.angle1 })Canvas().chunkStyle().translate({ x: this.x2, y: this.y2 }).scale({ x: this.scale2, y: this.scale2 }).rotate({ angle: this.angle2 })}.width(this.spinSize).height(this.spinSize).onAppear(() => {this.startAnimation();});}/*** 启动无限循环的关键帧动画*/private startAnimation(): void {const uiContext = this.getUIContext();if (!uiContext) return;const keyframes1 = this.createKeyframes(1);const keyframes2 = this.createKeyframes(2);uiContext.keyframeAnimateTo({ iterations: -1, delay: 0 }, keyframes1);uiContext.keyframeAnimateTo({ iterations: -1, delay: 0 }, keyframes2);}/*** 根据粒子编号创建对应的关键帧动画* @param particleIndex 粒子索引(1 或 2)*/private createKeyframes(particleIndex: 1 | 2): Array<KeyframeState> {const updatePositionAndScale = (step: number): void => {if (particleIndex === 1) {switch (step) {case 1:this.scale1 = 0.5;this.angle1 = -90;this.x1 = this.spinSize * 0.65;break;case 2:this.scale1 = 1;this.angle1 = -180;this.x1 = this.spinSize * 0.65;this.y1 = this.spinSize * 0.65;break;case 3:this.scale1 = 0.5;this.angle1 = -270;this.x1 = 0;this.y1 = this.spinSize * 0.65;break;case 4:this.scale1 = 1;this.angle1 = -360;this.x1 = 0;this.y1 = 0;break;}} else {switch (step) {case 1:this.scale2 = 0.5;this.angle2 = -90;this.x2 = 0;this.y2 = this.spinSize * 0.65;break;case 2:this.scale2 = 1;this.angle2 = -180;this.x2 = 0;this.y2 = 0;break;case 3:this.scale2 = 0.5;this.angle2 = -270;this.x2 = this.spinSize * 0.65;break;case 4:this.scale2 = 1;this.angle2 = -360;this.x2 = this.spinSize * 0.65;this.y2 = this.spinSize * 0.65;break;}}};return [{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(1),},{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(2),},{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(3),},{duration: 500,curve: Curve.EaseInOut,event: (): void => updatePositionAndScale(4),},];}@StyleschunkStyle() {.height(this.spinSize * 0.35).width(this.spinSize * 0.35).backgroundColor(this.spinColor).shadow(ShadowStyle.OUTER_DEFAULT_XS)}
}

3.修改Index.ets文件,代码如下:
 

import { SpinFour } from './Spin';@Entry
@Component
struct Index {@State message: string = 'Hello World';build() {Column() {SpinFour({spinSize: 60,spinColor: '#FF0000'})}.alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.Center).height('100%').width('100%')}
}代码如下:
import { SpinFour } from './Spin';@Entry
@Component
struct Index {@State message: string = 'Hello World';build() {Column() {SpinFour({spinSize: 60,spinColor: '#FF0000'})}.alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.Center).height('100%').width('100%')}
}

4.运行项目,登录华为账号,需进行签名

5.动画效果如下:
 

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

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

相关文章

基于STM32、HAL库的CP2102-GMR USB转UART收发器 驱动程序设计

一、简介: CP2102-GMR是Silicon Labs公司生产的一款USB转UART桥接芯片,主要特点包括: 集成USB 2.0全速功能控制器 内置USB收发器,无需外部电阻 工作电压:3.0V至3.6V 支持的数据格式:数据位8,停止位1,无校验 最高支持1Mbps的波特率 内置512字节接收缓冲区和512字节发送…

Ubuntu 22虚拟机【网络故障】快速解决指南

Ubuntu22虚拟机突然无法连接网络了&#xff0c;以下是故障排除步骤记录。 Ubuntu 22虚拟机网络故障快速解决指南 当在虚拟机中安装的 Ubuntu 22 系统出现 ping: connect: 网络不可达 和 ping: www.baidu.com: 域名解析出现暂时性错误的报错时&#xff0c;通常意味着虚拟机无法…

实战springcloud alibaba

实战springcloud alibaba 前言 如何搭建一套最新的springcloud alibaba&#xff0c;以适配项目升级需求&#xff1f; 1.版本的选择 2.各组件的适配 3.新技术的敏感性 4.前瞻性&#xff0c;几年内不会被淘汰 参考资料&#xff1a;Spring Cloud Alibaba 参考文档 https://spring…

泰迪杯特等奖案例学习资料:基于卷积神经网络与集成学习的网络问政平台留言文本挖掘与分析

(第八届“泰迪杯”数据挖掘挑战赛A题特等奖案例深度解析) 一、案例背景与核心挑战 1.1 应用场景与行业痛点 随着“互联网+政务”的推进,网络问政平台成为政府与民众沟通的重要渠道。某市问政平台日均接收留言超5000条,涉及民生、环保、交通等20余类诉求。然而,传统人工…

DVWA靶场保姆级通关教程--06不安全验证机制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 原理详解 1. 前后端验证逻辑不一致 2. 验证码值保存在客户端 3. 验证码可预测或重复 4. 验证码验证与逻辑解耦 一、处理关卡报错 二、low级别源…

【LeetCode Hot100 | 每日刷题】排序数组

912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 示例 1&…

Windows系统下使用Kafka和Zookeeper,Python运行kafka(二)

1.配置 Zookeeper 进入解压后的 Zookeeper 目录&#xff08;例如 F:\zookeeper\conf&#xff09;&#xff0c;复制 zoo_sample.cfg 文件并命名为 zoo.cfg&#xff08;如果 zoo.cfg 已经存在&#xff0c;则直接编辑该文件&#xff09;。 打开 zoo.cfg 文件&#xff0c;配置相关…

Web 自动化之 HTML JavaScript 详解

文章目录 一、HTML 常用标签二、javascript 脚本1、什么是 javascript(js)2、 js变量和函数3、js 弹窗处理4、js 流程控制语句和 switch 结构语句应用 一、HTML 常用标签 HTML&#xff1a;超文本标记语言 超文本&#xff1a;不仅只包含文字&#xff0c;还有超链接、视频…这些…

el-date-picker的type为daterange时仅对开始日期做限制

文章目录 前言绣球html代码一、正确代码二、错误代码 前言绣球 需求是这样的&#xff0c;开始日期需要限制只能选择今天的日期&#xff0c;结束日期只能选择今天之后的日期。结束日期很常见&#xff0c;但是单纯限制开始日期&#xff0c;还是蛮少见的&#xff0c;尤其是datera…

观测云:安全、可信赖的监控观测云服务

引言 近日&#xff0c;“TikTok 遭欧盟隐私监管机构调查并处以 5.3 亿欧元”一案&#xff0c;再次引发行业内对数据合规等话题的热议。据了解&#xff0c;仅 2023 年一年就产生了超过 20 亿美元的 GDPR 罚单。这凸显了在全球化背景下&#xff0c;企业在数据隐私保护方面所面临…

认识中间件-以及两个简单的示例

认识中间件-以及两个简单的示例 什么是中间件一个响应处理中间件老朋友 nest g如何使用为某个module引入全局引入编写逻辑一个日志中间件nest g mi 生成引入思考代码进度什么是中间件 官方文档 中间件是在路由处理程序之前调用的函数。中间件函数可以访问请求和响应对象,以及…

基于Flask、Bootstrap及深度学习的水库智能监测分析平台

基于Flask、Bootstrap及深度学习的水库智能监测分析平台 项目介绍 本项目是基于Flask框架构建的水库智能监测分析平台&#xff0c;集水库数据管理、实时监测预警、可视化分析和智能预测功能于一体。 预测水位的预警级别&#xff1a;蓝色预警没有超过正常水位且接近正常水位1米…

springboot生成二维码到海报模板上

springboot生成二维码到海报模板上 QRCodeController package com.ruoyi.web.controller.app;import com.google.zxing.WriterException; import com.ruoyi.app.domain.Opportunity; import com.ruoyi.app.tool.QRCodeGenerator; import com.ruoyi.common.core.page.TableDat…

如何使用极狐GitLab 软件包仓库功能托管 maven?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 软件包库中的 Maven 包 (BASIC ALL) 在项目的软件包库中发布 Maven 产物。然后&#xff0c;在需要将它们用作依赖项时安装它…

企业如何将钉钉付款单高效集成到金蝶云星空?

钉钉数据集成到金蝶云星空&#xff1a;修改下推的付款单③ 在企业信息化系统中&#xff0c;数据的高效流转和准确对接是实现业务流程自动化的关键。本文将分享一个实际案例&#xff0c;展示如何通过轻易云数据集成平台&#xff0c;将钉钉中的付款单数据无缝集成到金蝶云星空系…

python 实现文件批量重命名

以下是使用Python实现文件批量重命名的示例代码。该代码可以将指定目录下的文件按照一定规则进行重命名,这里以将文件重命名为带有编号的文件名为例: import osdef batch_rename(directory):if not os.path.isdir(directory):print(

Pandas学习笔记(四)

DataFrame对象 文章目录 DataFrame对象导入本文需要的包DataFrame与Series的相似之处使用read_csv函数导入DataFrameSeries和DataFrame的共享与专有属性Series和DataFrame的共有方法 对DataFrame进行排序按照单列进行排序按照多列进行排序按照索引进行排序对列索引进行排序 设置…

DA14585墨水屏学习(2)

一、user_svc2_wr_ind_handler函数 void user_svc2_wr_ind_handler(ke_msg_id_t const msgid,struct custs1_val_write_ind const *param,ke_task_id_t const dest_id,ke_task_id_t const src_id) {// sprintf(buf2,"HEX %d :",param->length);arch_printf("…

树莓派5+Ubuntu24.04 LTS串口通信 保姆级教程

【背景】 各位&#xff0c;除了树莓派4B之外&#xff0c;我又搞了个树莓派5, 装的也是Ubuntu24.04 LTS服务器版。装系统的方法跟树莓派4B一样&#xff0c;没什么好说的。装完了系统之后&#xff0c;我就想装个wiringPi来试试串口&#xff0c;却发现这个树莓派5的串口和树莓派4…

【QT】UDP通讯本地调试

qt已经写好了udp通讯代码&#xff0c;现在要进行测试。 1、终端输入ipconfig查看本机网卡的ipv4地址 2、 用udpBind函数&#xff0c;绑定到此ip和自定义的端口号。 3、 打开网络调试助手&#xff0c;自动检测到本机的ip地址&#xff0c;输入任意一个和程序里不一样的端口号。 …