鸿蒙初学者学习手册(HarmonyOSNext_API14)_自定义动画API(@ohos.animator (动画) )

devtools/2025/2/22 18:10:58/

前言

在纯血鸿蒙中最具有用户特色的效果就是自定义的动画效果。在纯血鸿蒙中有多种定义方式,但是今天介绍的是ApI中的自定义动画

注意:

动画本身具有生命周期,但是不支持在UIAbility的文件使用,简单而言就是不允许在UIAbility生命周期中调用

涉及到的API属性

Animator

属性参数功能参数类型返回类型
createcreate(options: AnimatorOptions): AnimatorResult创建动画AnimatorOptions (必填)AnimatorResult

AnimatorResult

属性参数功能参数类型返回类型
resetreset(options: AnimatorOptions): void更新当前动画器。AnimatorOptions(必填)
playplay(): void启动动画动画会保留上一次的播放状态,比如播放状态设置reverse后,再次播放会保留reverse的播放状态。
finishfinish(): void结束动画
pausepause(): void暂停动画
cancelcancel(): void取消动画
reversereverse(): void以相反的顺序播放动画。使用interpolating-spring曲线时此接口无效。

回调函数(理解为生命周期)

属性参数功能参数类型返回类型
onFrameonFrame: (progress: number) => void接收到帧时回调。progress:number(必填)
onFinishonFinish: () => void动画完成时回调。
onCancelonCancel: () => void动画被取消时回调。
onRepeatonRepeat: () => void动画重复时回调。

AnimatorOptions(定义动画选项。)

名称类型必填功能
durationnumber动画持续时间
easingstring动画插值曲线
delaynumber动画延时播放时长,单位毫秒,设置为0时,表示不延时。
fill‘none’ ‘forwards’ ‘backwards’ ‘both’动画执行后是否恢复到初始状态,动画执行后,动画结束时的状态(在最后一个关键帧中定义)将保留。
direction‘normal’ ‘reverse’ ‘alternate’ ‘alternate-reverse’动画播放模式正序,逆序,交替正序,交替逆序
iterationsnumber动画播放次数
beginnumber动画插值起点。
endnumber动画插值终点。

注意:以上为涉及属性和参数一下为示例代码和详细注释

import { Animator as animator, AnimatorResult } from '@kit.ArkUI'; // 导入动画模块/*** 动画测试组件,用于演示和测试动画功能。*/
@Entry
@Component
struct AnimatorTest {/*** 日志标签,用于标识日志输出的来源。*/private TAG: string = '[AnimatorTest]' // 定义日志标签/*** 动画实例,用于控制动画的播放、暂停等操作。*/private backAnimator: AnimatorResult | undefined = undefined // 初始化动画实例为 undefined/*** 标记动画是否结束的标志位。*/private flag: boolean = false // 初始化标志位为 false/*** 宽度状态变量,用于动态更新动画元素的宽度。*/@State wid: number = 100 // 初始化宽度为 100/*** 高度状态变量,用于动态更新动画元素的高度。*/@State hei: number = 100 // 初始化高度为 100/*** 创建并初始化动画实例。* 设置动画的各种参数,并定义动画结束、重复、取消和每一帧的回调函数。*/create() {this.backAnimator = animator.create({ // 创建动画实例duration: 2000,     // 设置动画持续时间为 2000 毫秒easing: "ease",     // 设置动画曲线类型为 easedelay: 0,           // 设置动画延迟时间为 0 毫秒fill: "forwards",   // 设置动画结束后保持最后一帧的状态direction: "normal",// 设置动画播放方向为 normaliterations: 1,      // 设置动画循环次数为 1begin: 100,         // 设置动画起始值为 100end: 200            // 设置动画结束值为 200})/*** 动画结束时的回调函数。* 将 `flag` 置为 `true` 并输出日志。*/this.backAnimator.onFinish = () => { // 定义动画结束时的回调函数this.flag = true // 将标志位置为 trueconsole.info(this.TAG, 'backAnimator onfinish') // 输出日志信息}/*** 动画重复时的回调函数。* 输出日志信息。*/this.backAnimator.onRepeat = () => { // 定义动画重复时的回调函数console.info(this.TAG, 'backAnimator repeat') // 输出日志信息}/*** 动画取消时的回调函数。* 输出日志信息。*/this.backAnimator.onCancel = () => { // 定义动画取消时的回调函数console.info(this.TAG, 'backAnimator cancel') // 输出日志信息}/*** 动画每一帧的回调函数。* 更新 `wid` 和 `hei` 的值以实现动画效果。*/this.backAnimator.onFrame = (value: number) => { // 定义动画每一帧的回调函数this.wid = value // 更新宽度this.hei = value // 更新高度}}/*** 在组件即将消失时调用。* 将 `backAnimator` 置空,避免内存泄漏。*/aboutToDisappear() {// 由于backAnimator在onframe中引用了this, this中保存了backAnimator,// 在自定义组件消失时应该将保存在组件中的backAnimator置空,避免内存泄漏this.backAnimator = undefined; // 将动画实例置空}/*** 构建页面布局。* 包含一个红色的矩形和多个按钮,用于控制动画的创建、播放、暂停、完成、反转、取消和重置。*/build() {Column() { // 创建最外层的 Column 布局Column() { // 创建第二层 Column 布局Column() // 创建第三层 Column 布局.width(this.wid) // 设置宽度为当前宽度状态变量.height(this.hei) // 设置高度为当前高度状态变量.backgroundColor(Color.Red) // 设置背景颜色为红色}.width('100%') // 设置宽度为 100%.height(300) // 设置高度为 300Column() { // 创建包含按钮的 Column 布局Row() { // 创建包含“create”按钮的 Row 布局Button('create') // 创建“create”按钮.fontSize(30) // 设置字体大小为 30.fontColor(Color.Black) // 设置字体颜色为黑色.onClick(() => { // 设置点击事件this.create() // 调用 create 方法创建动画})}.padding(10) // 设置内边距为 10Row() { // 创建包含“play”按钮的 Row 布局Button('play') // 创建“play”按钮.fontSize(30) // 设置字体大小为 30.fontColor(Color.Black) // 设置字体颜色为黑色.onClick(() => { // 设置点击事件this.flag = false // 将标志位置为 falseif (this.backAnimator) { // 如果动画实例存在this.backAnimator.play() // 播放动画}})}.padding(10) // 设置内边距为 10Row() { // 创建包含“pause”按钮的 Row 布局Button('pause') // 创建“pause”按钮.fontSize(30) // 设置字体大小为 30.fontColor(Color.Black) // 设置字体颜色为黑色.onClick(() => { // 设置点击事件if (this.backAnimator) { // 如果动画实例存在this.backAnimator.pause() // 暂停动画}})}.padding(10) // 设置内边距为 10Row() { // 创建包含“finish”按钮的 Row 布局Button('finish') // 创建“finish”按钮.fontSize(30) // 设置字体大小为 30.fontColor(Color.Black) // 设置字体颜色为黑色.onClick(() => { // 设置点击事件this.flag = true // 将标志位置为 trueif (this.backAnimator) { // 如果动画实例存在this.backAnimator.finish() // 结束动画}})}.padding(10) // 设置内边距为 10Row() { // 创建包含“reverse”按钮的 Row 布局Button('reverse') // 创建“reverse”按钮.fontSize(30) // 设置字体大小为 30.fontColor(Color.Black) // 设置字体颜色为黑色.onClick(() => { // 设置点击事件this.flag = false // 将标志位置为 falseif (this.backAnimator) { // 如果动画实例存在this.backAnimator.reverse() // 反转动画}})}.padding(10) // 设置内边距为 10Row() { // 创建包含“cancel”按钮的 Row 布局Button('cancel') // 创建“cancel”按钮.fontSize(30) // 设置字体大小为 30.fontColor(Color.Black) // 设置字体颜色为黑色.onClick(() => { // 设置点击事件if (this.backAnimator) { // 如果动画实例存在this.backAnimator.cancel() // 取消动画}})}.padding(10) // 设置内边距为 10Row() { // 创建包含“reset”按钮的 Row 布局Button('reset') // 创建“reset”按钮.fontSize(30) // 设置字体大小为 30.fontColor(Color.Black) // 设置字体颜色为黑色.onClick(() => { // 设置点击事件if (this.flag) { // 如果动画已结束this.flag = false // 将标志位置为 falseif (this.backAnimator) { // 如果动画实例存在this.backAnimator.reset({ // 重置动画参数duration: 3000, // 设置新的持续时间为 3000 毫秒easing: "ease-in", // 设置新的动画曲线类型为 ease-indelay: 0, // 设置新的延迟时间为 0 毫秒fill: "forwards", // 设置新的动画结束后保持最后一帧的状态direction: "alternate", // 设置新的动画播放方向为 alternateiterations: 3, // 设置新的动画循环次数为 3begin: 100, // 设置新的动画起始值为 100end: 300 // 设置新的动画结束值为 300})}} else { // 如果动画未结束console.info(this.TAG, 'Animation not ended') // 输出日志信息}})}.padding(10) // 设置内边距为 10}}}
}

http://www.ppmy.cn/devtools/160993.html

相关文章

上证50ETF期权交割日是每月几号?

财顺小编上证50ETF期权的交割日固定为每月第四个星期三,若遇法定节假日则顺延至下一交易日。例如,2023年1月因春节假期,原定1月25日的交割日顺延至1月30日。 上证50ETF期权交割日是每月几号? 交割日与行权日: 交割日…

模拟实现分布式文件存储

Q1:如何解决海量数据存的下的问题 传统做法是在单机存储。但是随着数据变多,会遇到存储瓶颈。 单机纵向扩展:内存不够加内存,磁盘不够加磁盘。有上限限制,不能无限制加下去。 多机横向扩展:采用多台机器存储&#x…

matlab计算傅立叶光学的实现

计算傅立叶光学的实现,可以用于GS算法(需要改造),角谱算法的参考,基础算法本人已经验证,可实现衍射的计算,经开发可以用于DOE(衍射光学元件)的设计 文件列表 fourier-p…

【Python爬虫(12)】正则表达式:Python爬虫的进阶利刃

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…

Spring中Aware的用法以及实现

Aware 在Spring当中有一些内置的对象是未开放给我们使用的,例如Spring的上下文ApplicationContext、环境属性Environment,BeanFactory等等其他的一些内置对象,而在我们可以通过实现对应的Aware接口去拿到我们想要的一些属性,一般…

贪心算法

int a[1000], b5, c8; swap(b, c); // 交换操作 memset(a, 0, sizeof(a)); // 初始化为0或-1 引导问题 为一个小老鼠准备了M磅的猫粮,准备去和看守仓库的猫做交易,因为仓库里有小老鼠喜欢吃的五香豆,第i个房间有J[i] 磅的五香豆&#xf…

学习量化交易的环境安装记录

1、安装anaconda 因为使用python,需要安装anaconda,具体是下面的官方地址,根据自己需要下载相应的版本 https://www.anaconda.com/download 运行上面下载的文件,安装anaconda 可以根据自己需要安装到相应的盘上面 同时环境变量…

什么是手机的boot分区

什么是手机的 Boot 分区? Boot 分区(Boot Partition)是 Android 设备启动时最关键的分区,它包含了 引导系统所需的核心文件,包括 Linux 内核(Kernel) 和 启动镜像(Ramdisk&#xff…