鸿蒙NEXT开发动画(方块动画旋转)

1.创建空白项目


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

/*** SpinKit 风格的旋转加载动画组件。** @component* @param spinSize - 动画容器大小(必须为正数)* @param spinColor - 动画颜色(支持资源引用)** 示例:* ```ets* SpinOne({*   spinSize: 60,*   spinColor: '#FF0000'* })* ```*/// 定义关键帧动画配置接口
interface KeyframeItem {duration: number;curve: Curve;event: () => void;
}// 动画整体配置接口(已存在)
interface KeyframeAnimationConfig {iterations: number;delay: number;
}// 更新动画状态的参数接口
interface AnimationUpdateParams {angle?: number;x?: number;y?: number;
}@ComponentV2
export struct SpinOne {@Require @Param spinSize: number = 48;       // 父组件必须传值,这里默认值不会实际生效@Require @Param spinColor: ResourceColor = '#209ED8';@Local angle: number = 0;@Local x: number = 0;@Local y: number = 0;private readonly ANIMATION_DURATION: number = 600;build() {Canvas().width(this.spinSize).height(this.spinSize).backgroundColor(this.spinColor).renderFit(RenderFit.CENTER).shadow(ShadowStyle.OUTER_DEFAULT_XS).rotate({perspective: this.spinSize,x: this.x,y: this.y,angle: this.angle}).onAppear(() => {this.startAnimation();});}private startAnimation(): void {const uiContext = this.getUIContext();if (!uiContext) return;const animationConfig: KeyframeAnimationConfig = {iterations: -1, // 无限循环delay: 0,};uiContext.keyframeAnimateTo(animationConfig, [this.createKeyframe(this.ANIMATION_DURATION, { angle: 180, x: this.spinSize / 2, y: 0 }),this.createKeyframe(0, { angle: 0 }),this.createKeyframe(this.ANIMATION_DURATION, { angle: 180, x: 0, y: this.spinSize / 2 })]);}/*** 创建关键帧动画配置项* @param duration 动画持续时间* @param update 动画更新参数*/private createKeyframe(duration: number,update: AnimationUpdateParams): KeyframeItem {return {duration,curve: Curve.EaseInOut,event: () => {if (update.angle !== undefined) this.angle = update.angle;if (update.x !== undefined) this.x = update.x;if (update.y !== undefined) this.y = update.y;}};}
}代码如下:
/*** SpinKit 风格的旋转加载动画组件。** @component* @param spinSize - 动画容器大小(必须为正数)* @param spinColor - 动画颜色(支持资源引用)** 示例:* ```ets* SpinOne({*   spinSize: 60,*   spinColor: '#FF0000'* })* ```*/// 定义关键帧动画配置接口
interface KeyframeItem {duration: number;curve: Curve;event: () => void;
}// 动画整体配置接口(已存在)
interface KeyframeAnimationConfig {iterations: number;delay: number;
}// 更新动画状态的参数接口
interface AnimationUpdateParams {angle?: number;x?: number;y?: number;
}@ComponentV2
export struct SpinOne {@Require @Param spinSize: number = 48;       // 父组件必须传值,这里默认值不会实际生效@Require @Param spinColor: ResourceColor = '#209ED8';@Local angle: number = 0;@Local x: number = 0;@Local y: number = 0;private readonly ANIMATION_DURATION: number = 600;build() {Canvas().width(this.spinSize).height(this.spinSize).backgroundColor(this.spinColor).renderFit(RenderFit.CENTER).shadow(ShadowStyle.OUTER_DEFAULT_XS).rotate({perspective: this.spinSize,x: this.x,y: this.y,angle: this.angle}).onAppear(() => {this.startAnimation();});}private startAnimation(): void {const uiContext = this.getUIContext();if (!uiContext) return;const animationConfig: KeyframeAnimationConfig = {iterations: -1, // 无限循环delay: 0,};uiContext.keyframeAnimateTo(animationConfig, [this.createKeyframe(this.ANIMATION_DURATION, { angle: 180, x: this.spinSize / 2, y: 0 }),this.createKeyframe(0, { angle: 0 }),this.createKeyframe(this.ANIMATION_DURATION, { angle: 180, x: 0, y: this.spinSize / 2 })]);}/*** 创建关键帧动画配置项* @param duration 动画持续时间* @param update 动画更新参数*/private createKeyframe(duration: number,update: AnimationUpdateParams): KeyframeItem {return {duration,curve: Curve.EaseInOut,event: () => {if (update.angle !== undefined) this.angle = update.angle;if (update.x !== undefined) this.x = update.x;if (update.y !== undefined) this.y = update.y;}};}
}

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

import { SpinOne } from './Spin';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  build() {
    Column() {
      SpinOne({
        spinSize: 60,
        spinColor: '#FF0000'
      })
    }
    .alignItems(HorizontalAlign.Center)
    .justifyContent(FlexAlign.Center)
    .height('100%')
    .width('100%')
  }
}
代码如下:

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

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

5.动画效果如下:

 

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

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

相关文章

深入解析Java架构师面试:从核心技术到AI应用

深入解析Java架构师面试:从核心技术到AI应用 在互联网大厂的Java求职者面试中,技术深度和项目经验是成功的关键。本文以严肃的面试官与资深Java架构师马架构(拥有十年研发及架构设计经验)之间的对话为背景,详细展示了…

Qt窗口关闭特效:自底而上逐渐消失

废话不多说,直接上代码: 构造函数: MyWidget(QWidget *parent nullptr) {// 设置窗口属性:支持透明背景setAttribute(Qt::WA_TranslucentBackground);// 移除窗口边框setWindowFlags(Qt::FramelessWindowHint);} closeEvent函数…

AI对IT行业的重塑:挑战与机遇并存的技术革命

一、必要性:AI成为IT行业的基础设施 在云计算、大数据和物联网构成的数字生态中,AI技术已成为IT行业的"水电煤"。以微软Azure为例,其AI云服务支撑着全球超过85%的《财富》500强企业,通过机器学习模型自动优化服务器集群…

[论文梳理] 足式机器人规划控制流程 - 接触碰撞的控制 - 模型误差 - 自动驾驶车的安全合规(4个课堂讨论问题)

目录 问题 1:足式机器人运动规划 & 控制的典型流程 (pipline) 1.1 问题 1.2 目标 1.3 典型流程(Pipeline) 1.3.1 环境感知(Perception) 1.3.2 高层规划(High-Level Planning) 1.3.3 …

阿里云短信接入实现示例

1&#xff09;构建Springboot项目 2) 添加依赖 <!--阿里云短信--> <dependency><groupId>com.aliyun</groupId><artifactId>alibabacloud-dysmsapi20170525</artifactId><version>3.0.0</version> </dependency><…

逻辑回归之参数选择:从理论到实践

一、逻辑回归概述 逻辑回归虽然名字中带有“回归”&#xff0c;但它是一种用于处理二分类或多分类问题的算法。其核心思想是通过构建一个线性模型&#xff0c;将输入特征进行线性组合&#xff0c;再利用逻辑函数&#xff08;如Sigmoid函数&#xff09;将线性组合的结果映射到0…

综合案例建模(1)

文章目录 滚花手扭螺丝机箱封盖螺丝螺丝孔锥形垫片 滚花手扭螺丝 前视基准面画草图&#xff0c;旋转生成主体 倒角0.5 顶面&#xff0c;草图转换实体引用&#xff0c;去复制边线 生成螺旋线路径 顶面绘制草图 上一步画的草图沿螺旋线扫描切除 镜像扫描特征 阵列镜像扫描特征 创…

SQL语句练习 自学SQL网 多表查询

目录 Day 6 用JOINs进行多表联合查询 Day 7 外连接 OUTER JOINs Day 8 外连接 特殊关键字 NULLs Day 6 用JOINs进行多表联合查询 SELECT * FROM Boxoffice INNER JOIN movies ON movies.idboxoffice.Movie_id;SELECT * FROM Boxoffice INNER JOIN moviesON movies.idboxoffi…

游戏引擎学习第247天:简化DEBUG_VALUE

欢迎。关于纹理传输的详细情况。 上周我们刚刚完成了纹理下载的相关工作&#xff0c;但实际上并没有完全解决这个问题。问题的核心是&#xff0c;当前关于纹理下载的正确方式仍然存在较大的不确定性。尽管我们在进行纹理下载的工作时已有一定进展&#xff0c;但依旧有不少模糊…

python将字符串转成二进制数组

python将字符串转成二进制数组 功能概述&#xff1a; save_binary_to_json() 函数&#xff1a;将字符串转换为二进制数据&#xff08;字节的整数表示&#xff09;&#xff0c;并保存到JSON文件中。 load_binary_from_json() 函数&#xff1a;从JSON文件中读取二进制数据并还原…

【springboot知识】配置方式实现SpringCloudGateway相关功能

配置方式实现SpringCloudGateway相关功能 Spring Cloud Gateway 核心功能与实战实现指南一、核心功能架构二、六大核心功能实现1. 动态路由配置2. 断言(Predicate)配置3. 过滤器(Filter)配置4. 负载均衡配置5. 熔断降级配置6. 限流配置 三、高级配置技巧1. 跨域配置2. 重试机制…

Windows 10 环境二进制方式安装 MySQL 8.0.41

文章目录 初始化数据库配置文件注册成服务启停服务链接服务器登录之后重置密码卸载 初始化数据库 D:\MySQL\MySQL8.0.41\mysql-8.0.41-winx64\mysql-8.0.41-winx64\bin\mysqld -I --console --basedirD:\MySQL\MySQL8.0.41\mysql-8.0.41-winx64\mysql-8.0.41-winx64 --datadi…

流式通信技术对比:SSE vs WebSocket 应用场景与最佳实践

在构建动态、实时交互的现代 Web 应用时&#xff0c;实时通信能力至关重要。Server-Sent Events&#xff08;SSE&#xff09; 和 WebSocket 是当前最主流的两种技术方案&#xff0c;它们都支持服务器主动向客户端推送数据&#xff0c;但在通信模式、应用场景和实现复杂度上存在…

复杂度和顺序表(双指针方法)

目录 目录 目录 前言&#xff1a; 一、时间复杂度和空间复杂度 1.1概念 1.2规则 二、顺序表 2.1静态顺序表 2.2动态顺序表 三、双指针法 四、总结 前言&#xff1a; 时间复杂度和空间复杂度是用于判断算法好坏的指标&#xff0c;程序性能的核心指标。时间复杂度主要衡…

flutter 专题 六十四 在原生项目中集成Flutter

概述 使用Flutter从零开始开发App是一件轻松惬意的事情&#xff0c;但对于一些成熟的产品来说&#xff0c;完全摒弃原有App的历史沉淀&#xff0c;全面转向Flutter是不现实的。因此使用Flutter去统一Android、iOS技术栈&#xff0c;把它作为已有原生App的扩展能力&#xff0c;…

Java高阶程序员学习计划(详细到天,需有一定Java基础)

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息文章目录 Java高阶程序员学习计划(详细到天,需有一定Java基础)第一阶段(30天)Java基础:Java生态工具链:设计模式与编码规范:第二阶段(15天…

JS自动化获取网站信息开发说明

一、自动获取信息的必要性 1. 提高效率与节省时间 批量处理&#xff1a;自动化可以快速抓取大量数据&#xff0c;比人工手动操作快得多。 24/7 运行&#xff1a;自动化工具可以全天候工作&#xff0c;不受时间限制。 减少重复劳动&#xff1a;避免人工反复执行相同的任务&am…

Android Kotlin 依赖注入全解:Koin appModule 配置与多 ViewModel 数据共享实战指南

一、基础配置与概念 1. 什么是 appModule appModule 是 Koin 依赖注入框架中的核心配置模块&#xff0c;用于集中管理应用中的所有依赖项。它本质上是一个 Koin 模块&#xff08;org.koin.core.module.Module&#xff09;&#xff0c;通过 DSL 方式声明各种组件的创建方式和依…

学习记录:DAY21

我的开发日志&#xff1a;类路径扫描、DI 容器与动态代理 前言 我失忆了&#xff0c;完全不记得自己早上干了什么。 日程 早上 10 点左右开始&#xff0c;学了一早上&#xff0c;主要是类路径扫描相关的调试。 晚上 8 点了&#xff0c;真不能再摸&#x1f41f;了。 学习记录 计…

【Agent】MCP协议 | 用高德MCP Server制作旅游攻略

note MCP (Model Context Protocol) 代表了 AI 与外部工具和数据交互的标准建立。MCP 的本质&#xff1a;它是一个统一的协议标准&#xff0c;使 AI 模型能够以一致的方式连接各种数据源和工具&#xff0c;类似于 AI 世界的"USB-C"接口。 它能够在 LLM/AI Agent 与外…