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

鸿蒙NEXT开发动画案例12

 1.创建空白项目


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

/*** TODO SpinKit - 十二点扩散动画组件* author: CSDN-鸿蒙布道师* since: 2025/05/20*/
@ComponentV2
export struct SpinTwelve {@Require @Param spinSize: number = 36;          // 整体尺寸@Require @Param spinColor: ResourceColor;       // 圆点颜色@Require @Param dotCount: number = 12;          // 圆点数量,默认为12// 每个圆点大小@Local roundSize: number = this.spinSize * 0.14;// 每个圆点透明度数组@Local opacities: number[] = Array(this.dotCount).fill(0.3);aboutToAppear(): void {this.roundSize = this.spinSize * 0.14;}build() {Stack() {ForEach(range(0, this.dotCount), (index: number) => {Column() {Canvas().width(this.roundSize / 2).height(this.roundSize * 1.51).borderRadius(10).backgroundColor(this.spinColor).shadow(ShadowStyle.OUTER_DEFAULT_XS).opacity(this.opacities[index])}.width(this.roundSize).height('100%').rotate({ angle: index * (360 / this.dotCount) })});}.renderFit(RenderFit.CENTER).width(this.spinSize).height(this.spinSize).onAppear(() => {this.startAnimations();});}private startAnimations() {const totalDuration = 1200; // 总动画周期时间const delayStep = Math.floor(totalDuration / this.dotCount); // 自动计算延迟步长for (let i = 0; i < this.dotCount; i++) {const delay = -(i * delayStep); // 使用负数延迟制造交错效果const keyframes: KeyframeState[] = [{duration: 480,curve: Curve.Linear,event: () => {this.opacities[i] = 1;}},{duration: 720,curve: Curve.Linear,event: () => {this.opacities[i] = 0.3;}}];this.getUIContext().keyframeAnimateTo({ iterations: -1, delay: delay }, // -1 表示无限循环keyframes);}}
}function range(start: number, end: number): number[] {const result: number[] = [];for (let i = start; i < end; i++) {result.push(i);}return result;
}
代码如下:
/*** TODO SpinKit - 十二点扩散动画组件* author: CSDN-鸿蒙布道师* since: 2025/05/20*/
@ComponentV2
export struct SpinTwelve {@Require @Param spinSize: number = 36;          // 整体尺寸@Require @Param spinColor: ResourceColor;       // 圆点颜色@Require @Param dotCount: number = 12;          // 圆点数量,默认为12// 每个圆点大小@Local roundSize: number = this.spinSize * 0.14;// 每个圆点透明度数组@Local opacities: number[] = Array(this.dotCount).fill(0.3);aboutToAppear(): void {this.roundSize = this.spinSize * 0.14;}build() {Stack() {ForEach(range(0, this.dotCount), (index: number) => {Column() {Canvas().width(this.roundSize / 2).height(this.roundSize * 1.51).borderRadius(10).backgroundColor(this.spinColor).shadow(ShadowStyle.OUTER_DEFAULT_XS).opacity(this.opacities[index])}.width(this.roundSize).height('100%').rotate({ angle: index * (360 / this.dotCount) })});}.renderFit(RenderFit.CENTER).width(this.spinSize).height(this.spinSize).onAppear(() => {this.startAnimations();});}private startAnimations() {const totalDuration = 1200; // 总动画周期时间const delayStep = Math.floor(totalDuration / this.dotCount); // 自动计算延迟步长for (let i = 0; i < this.dotCount; i++) {const delay = -(i * delayStep); // 使用负数延迟制造交错效果const keyframes: KeyframeState[] = [{duration: 480,curve: Curve.Linear,event: () => {this.opacities[i] = 1;}},{duration: 720,curve: Curve.Linear,event: () => {this.opacities[i] = 0.3;}}];this.getUIContext().keyframeAnimateTo({ iterations: -1, delay: delay }, // -1 表示无限循环keyframes);}}
}function range(start: number, end: number): number[] {const result: number[] = [];for (let i = start; i < end; i++) {result.push(i);}return result;
}

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

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

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

5.动画效果如下:

http://www.xdnf.cn/news/7715.html

相关文章:

  • AI作曲革新:ACE-Step如何推动音乐创作走向大众
  • UE(虚幻)学习(六)插件打包在UE5.3.2下Value cannot be null的错误
  • Ubuntu 安装 Node.js 指定版本指南
  • 01-通过纯js理解数据驱动图表概念
  • window 显示驱动开发-GDI 硬件加速
  • 活到老学到老-Spring参数校验注解Validated /Valid
  • 实战:基于Pangolin Scrape API,如何高效稳定采集亚马逊BSR数据并破解反爬虫?
  • Nuxt.js一个基于 Vue.js 的通用应用框架
  • 使用引用的原因 和 运算符重载的必要性
  • Ubuntu20.04安装ROS Neotic
  • AI应用交付厂商F5打造六大解决方案,助用户应对复杂挑战
  • NX750HSA20美光固态闪存HSA36NC027
  • LLM驱动的未来软件工程范式与架构策略
  • 鸿蒙开发——7.ArkUI进阶:@BuilderParam装饰器的核心用法与实战解析
  • 算法题(151):保卫花园
  • Vue video播放视频流
  • Vue 3 响应式 Ref 全解析:从基础到高阶应用
  • 监控易一体化运维:采集集群管理,构建稳健运维基石
  • Linux | 开机自启动设置多场景实现
  • 在QT中栅格布局里套非栅格布局的布局会出现父布局缩放子布局不跟随的问题
  • 深入解析FramePack:高效视频帧打包技术原理与实践
  • 前端单点登录
  • DNA与蛋白相互作用检测技术ChIP-qPCR
  • 系统思考:团队策略辅导
  • 软考软件评测师——基于风险的测试技术
  • 破解 PCB 制造四大痛点:MOM 系统构建智能工厂新范式
  • 【Java微服务组件】异步通信P1—消息队列基本概念
  • RocketMQ 顺序消息实现原理详解
  • 小米便签源码部署流程
  • 前端mjs和js文件区别,mjs和cjs区别---.es.js和.mjs的区别