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

鸿蒙NEXT开发动画(风格的弹性缩放加载动画组件)

1.创建空白项目


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

// ===== 接口定义(必须放在使用前)=====
/*** 关键帧动画整体配置参数*/
interface KeyframeAnimationConfig {iterations: number;delay: number;
}/*** 单个关键帧动画项*/
interface KeyframeItem {duration: number;curve: Curve;event: () => void;
}/*** 动画状态更新参数*/
interface AnimationUpdateParams {scale1?: number;scale2?: number;
}
// ===== 接口定义结束 =====/*** SpinKit 风格的弹性缩放加载动画组件。** @component* @param spinSize - 动画容器大小(必须为正数)* @param spinColor - 动画颜色(支持资源引用)** 示例:* ```ets* SpinTwo({*   spinSize: 60,*   spinColor: '#FF0000'* })* ```*/
@ComponentV2
export struct SpinTwo {// 参数定义(父组件必须传入)@Require @Param spinSize: number = 48;@Require @Param spinColor: ResourceColor = '#209ED8';// 局部状态@Local scale1: number = 0;@Local scale2: number = 1;// 常量定义private readonly ANIMATION_DURATION: number = 1000;build() {Stack() {Canvas().scale({ x: this.scale1, y: this.scale1 }).bounceStyle()Canvas().scale({ x: this.scale2, y: this.scale2 }).bounceStyle()}.width(this.spinSize).height(this.spinSize).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, { scale1: 1, scale2: 0 }),this.createKeyframe(this.ANIMATION_DURATION, { scale1: 0, scale2: 1 })]);}/*** 创建关键帧动画配置项* @param duration - 动画持续时间* @param update - 更新的状态对象*/private createKeyframe(duration: number,update: AnimationUpdateParams): KeyframeItem {return {duration,curve: Curve.EaseInOut,event: () => {if (update.scale1 !== undefined) this.scale1 = update.scale1;if (update.scale2 !== undefined) this.scale2 = update.scale2;}};}/*** 公共样式封装*/@StylesbounceStyle() {.width('100%').height('100%').opacity(0.6).borderRadius(this.spinSize / 2) // 圆形效果.backgroundColor(this.spinColor)}
}
代码如下:
// ===== 接口定义(必须放在使用前)=====
/*** 关键帧动画整体配置参数*/
interface KeyframeAnimationConfig {iterations: number;delay: number;
}/*** 单个关键帧动画项*/
interface KeyframeItem {duration: number;curve: Curve;event: () => void;
}/*** 动画状态更新参数*/
interface AnimationUpdateParams {scale1?: number;scale2?: number;
}
// ===== 接口定义结束 =====/*** SpinKit 风格的弹性缩放加载动画组件。** @component* @param spinSize - 动画容器大小(必须为正数)* @param spinColor - 动画颜色(支持资源引用)** 示例:* ```ets* SpinTwo({*   spinSize: 60,*   spinColor: '#FF0000'* })* ```*/
@ComponentV2
export struct SpinTwo {// 参数定义(父组件必须传入)@Require @Param spinSize: number = 48;@Require @Param spinColor: ResourceColor = '#209ED8';// 局部状态@Local scale1: number = 0;@Local scale2: number = 1;// 常量定义private readonly ANIMATION_DURATION: number = 1000;build() {Stack() {Canvas().scale({ x: this.scale1, y: this.scale1 }).bounceStyle()Canvas().scale({ x: this.scale2, y: this.scale2 }).bounceStyle()}.width(this.spinSize).height(this.spinSize).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, { scale1: 1, scale2: 0 }),this.createKeyframe(this.ANIMATION_DURATION, { scale1: 0, scale2: 1 })]);}/*** 创建关键帧动画配置项* @param duration - 动画持续时间* @param update - 更新的状态对象*/private createKeyframe(duration: number,update: AnimationUpdateParams): KeyframeItem {return {duration,curve: Curve.EaseInOut,event: () => {if (update.scale1 !== undefined) this.scale1 = update.scale1;if (update.scale2 !== undefined) this.scale2 = update.scale2;}};}/*** 公共样式封装*/@StylesbounceStyle() {.width('100%').height('100%').opacity(0.6).borderRadius(this.spinSize / 2) // 圆形效果.backgroundColor(this.spinColor)}
}

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

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


代码如下:

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

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

5.动画效果如下:

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

相关文章:

  • 长实公布新盘案名“花语海” 打造全新“维港都会公园圈”
  • Dubbo(99)如何在区块链系统中应用Dubbo?
  • RLOO:将多次其他回答的平均reward作为baseline
  • [250505] Arch Linux 正式登陆 Linux 的 Windows 子系统
  • 电动金属硬密封蝶阀泄露等级:水、蒸汽、油品介质的零泄漏守护方案-耀圣
  • Relay 算子调用流程
  • Java 函数式编程
  • 高斯计校准的重要性
  • 【C语言】推箱子小游戏
  • 初步认识java
  • 精益数据分析(42/126):移动应用商业模式的深度剖析与实战要点
  • 浏览器存储 Cookie,Local Storage和Session Storage
  • 在 Sheel 中运行 Spark:开启高效数据处理之旅
  • 公司项目架构搭建者
  • LXwhat-嘉立创
  • 5G+教育:如何重塑未来课堂?
  • 打造智慧养老实训室,构建科技赋能养老新生态
  • 精益数据分析(44/126):深度解析媒体网站商业模式的关键要点
  • 安装篇--CentOS 7 虚拟机安装
  • 【AI】用AI将文档、文字一键生成PPT的方法(百度的自由画布版)
  • OpenCV 图形API(79)图像与通道拼接函数-----将一个三通道的 GMat 图像拆分为三个单独的单通道 GMat函数split3()
  • Coding Practice,48天强训(29)
  • MySQL8查询某个JSON类型的字段中出现过的所有键名(json key name)并去重返回
  • CKESC ROCK 280A-M 电调专业测评:工业级性能与智能保护的深度平衡
  • 如何从服务器日志中分析是否被黑客攻击?
  • 多线程系列五:面试中常考的单例模式
  • 猿人学web端爬虫攻防大赛赛题第7题——动态字体,随风漂移
  • SecureCrt设置显示区域横列数
  • Vue Element UI 表单弹窗重置问题解决方案 —— 每次打开都初始化,告别残留提示!
  • DeepSeek智能时空数据分析(七):4326和3857两种坐标系有什么区别?各自用途是什么?