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

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

前言

在纯血鸿蒙中最具有用户特色的效果就是自定义的动画效果。在纯血鸿蒙中有多种定义方式,但是今天介绍的是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}}}
}

相关文章:

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

前言 在纯血鸿蒙中最具有用户特色的效果就是自定义的动画效果。在纯血鸿蒙中有多种定义方式,但是今天介绍的是ApI中的自定义动画。 注意: 动画本身具有生命周期,但是不支持在UIAbility的文件使用,简单而言就是不允许在UIAbility生命周期中…...

PINN求解一维burgers方程

PINN求解一维burgers方程 模型搭建网络与训练结果可视化对比实际结果 完整代码下载链接 PINN求解一维burgers方程 模型 搭建网络与训练 #########-------------- python求解一维burgers方程-------------------################## # -*- coding: utf-8 -*- import os os.envi…...

Linux系统配置阿里云yum源,安装docker

配置阿里云yum源 需要保证能够访问阿里云网站 可以先ping一下看看(阿里云可能禁ping,只要能够解析为正常的ip地址即可) ping mirrors.aliyun.com脚本 #!/bin/bash mkdir /etc/yum.repos.d/bak mv /etc/yum.repos.d/*.repo /etc/yum.repos…...

Android 动态加入Activity 时 manifest 注册报错解决。使用manifestPlaceholders 占位

需求如下: 项目 测试demo 有多个渠道,部分渠道包含支付功能,在主测试代码外,需要一个单独 Activity 调用测试代码。 MainActivityPayActivity渠道A包含不包含渠道B包含包含 因为支付功能需要引入对应的 moudule,因此…...

【找工作】C++和算法复习(自用)

文章目录 C头文件自定义排序函数stl 算法树状数组 自用随便记录 C 排序 stl 头文件 全能头文件&#xff1a; #include<bits/stdc.h>自定义排序函数 bool compare(const int &odd1,const int &odd2) {return odd1>odd2; }stl 枚举map map<int, strin…...

【相聚青岛】人工智能与材料国际学术会议即将召开

一、大会简介 人工智能与材料国际会议&#xff08;ICAIM 2025&#xff09; 官方网站&#xff1a;www.ic-aim.net 官方邮箱&#xff1a;icaim2025163.com 会议时间&#xff1a;2025年3.21-24 会议地点&#xff1a;中国青岛 会议检索&#xff1a;EI检索 截稿时间&#xff1a;2月…...

BFS 解决 FloodFill 算法(典型算法思想)—— OJ例题算法解析思路

目录 一、733. 图像渲染 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 算法思路 基础参数 函数入口 检查条件 初始化 BFS BFS 填充过程 返回结果 复杂度分析 总结 二、200. 岛屿数量 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a;…...

纷析云开源版- Vue2-增加字典存储到localStorage

main.js //保存字典数据到LocalStorage Vue.prototype.$api.setting.SystemDictType.all().then(({data}) > {loadDictsToLocalStorage(data) })新增 dictionary.js 放在 Utils文件夹里面 // 获取字典数据 export function getDictByType(dictType) {const dicts JSON.par…...

Python 爬虫selenium

1.selenium自动化 selenium可以操作浏览器&#xff0c;在浏览器页面上实现&#xff1a;点击、输入、滑动 等操作。 不同于selenium自动化&#xff0c;逆向本质是&#xff1a; 分析请求&#xff0c;例如&#xff1a;请求方法、请求参数、加密方式等。用代码模拟请求去实现同等…...

前端导出word文件,并包含导出Echarts图表等

基础导出模板 const html <html><head><style>body {font-family: Times New Roman;}h1 {text-align: center;}table {border-collapse: collapse;width: 100%;color: #1118FF;font-weight: 600;}th,td {border: 1px solid black;padding: 8px;text-align: …...

【复现DeepSeek-R1之Open R1实战】系列8:混合精度训练、DeepSpeed、vLLM和LightEval介绍

这里写目录标题 1 混合精度训练1.1 FP16和FP321.2 优点1.3 存在的问题1.4 解决办法 2 DeepSpeed3 vLLM3.1 存在的问题3.2 解决方法3.2.1 PagedAttention3.2.2 KV Cache Manager3.2.3 其他解码场景 3.3 结论 4 LightEval4.1 主要功能4.2 使用方法4.3 应用场景 本文继续深入了解O…...

从面试中的“漏掉步骤”谈自我表达与思维方式的转变

在今天的面试中&#xff0c;我遇到了一个让我深刻反思自己思维方式的问题。当面试官问到如何应对用户量和请求量逐渐增加时&#xff0c;我的回答遗漏了一些基础步骤&#xff0c;导致我给出了“我暂时想不出更好的反思”的回答。这一经历让我意识到&#xff0c;在面对问题时&…...

大模型面经:SFT和RL如何影响模型的泛化或记忆能力?

监督微调 (SFT) 和强化学习 (RL)都是目前大模型的基础模型后训练技术&#xff0c;像DeepSeek-R1、kimi等的训练方法都将两种技术应用到了极致。 如何去设计训练步骤&#xff08;先SFT再RL&#xff0c;还是直接RL&#xff09;都需要对SFT和RL的能力有较深刻的了解。 本篇就以面…...

力扣-回溯-17 电话号码的字母组合

思路 和之前的回溯不同的是&#xff0c;要遍历完所有的数字&#xff0c;并且在单层递归逻辑里需要遍历一整个字符串 代码 class Solution { public:vector<string> letters {"", "", "abc", "def", "ghi", "…...

大模型幻觉

1.什么是大模型幻觉? 在语言模型的背景下,幻觉指的是一本正经的胡说八道:看似流畅自然的表述,实则不符合事实或者是错误的。 幻觉现象的存在严重影响LLM应用的可靠性,本文将探讨大型语言模型(LLMs)的幻觉问题,以及解决幻觉现象的一些常见方法。 2.为什么需要解决LLM的…...

2025-02-20 学习记录--C/C++-PTA 7-27 冒泡法排序

一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ /** * 冒泡法实现升序 */#include <stdio.h>int main() {int N, // 整数个数 6K, // 扫描遍数 2num, // 待排序的整数 2 3 5 1 6 4numArr[100], // 待排序的整数合集 2 3 5 1…...

RK3588配置成为路由器

文章目录 前言一、配置netplan二、安装hostapd1.创建hostapd.conf文件2.安装软件3.修改启动文件4.修改/etc/default/hostapd 文件 三、安装dnsmasq服务四、配置NET及重启验证五、常见问题总结 前言 RK3588开发板有两个网口&#xff0c;一个无线网卡。我需要配置为家用路由器模…...

【数据挖掘】--算法

【数据挖掘】--算法 目录&#xff1a;1. 缺失值和数值属性处理1缺失值处理&#xff1a; 2. 用于文档分类的朴素贝叶斯3. 分治法&#xff1a;建立决策树4. 覆盖算法建立规则5. 挖掘关联规则6. 线性模型有效寻找最近邻暴力搜索&#xff08;Brute-Force Search&#xff09;kd树&am…...

Huatuo热更新--如何使用

在安装完huatuo热更新插件后就要开始学习如何使用了。 1.创建主框渐Main 新建文件夹Main&#xff08;可自定义&#xff09;&#xff0c;然后按下图创建文件&#xff0c;注意名称与文件夹名称保持一致 然后新建场景&#xff08;Init场景&#xff09;&#xff0c;添加3个空物体…...

基于Django快递物流管理可视化分析系统(完整系统源码+数据库+详细开发文档+万字详细论文+答辩PPT+详细部署教程等资料)

文章目录 基于Django快递物流管理可视化分析系统&#xff08;完整系统源码数据库详细开发文档万字详细论文答辩PPT详细部署教程等资料&#xff09;一、项目概述二、项目说明三、研究意义四、系统设计技术架构 五、功能实现六、完整系统源码数据库详细开发文档万字详细论文答辩P…...

基于射频开关选择的VNA校准设计

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…...

解决本地模拟IP的DHCP冲突问题

解决 DHCP 冲突导致的多 IP 绑定失效问题 前言 续接上一篇在本机上模拟IP地址。 在实际操作中&#xff0c;如果本机原有 IP&#xff08;如 192.168.2.7&#xff09;是通过 DHCP 自动获取的&#xff0c;直接添加新 IP&#xff08;如 10.0.11.11&#xff09;可能会导致 DHCP 服…...

ChromeDriver下载

平时为了下个驱动&#xff0c;到处找挺麻烦&#xff0c;收集了很多无偿分享给需要的人&#xff0c;仅供学习和交流。 ChromeDriver 102.0.5005.61 ChromeDriver 105.0.5195.102 ChromeDriver 108.0.5359.71 ChromeDriver 111.0.5563.64 ChromeDriver 116.0.5845.97 Chrom…...

springboot pagehelper分页插件封装

封装插件&#xff1a; 可自定义返回的Pages实体类参数 package com.wm.common;import com.github.pagehelper.ISelect; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import lombok.Data; import java.util.List;/*** 分页封装* param <…...

Elasticsearch7.1.1 配置密码和SSL证书

生成SSL证书 ./elasticsearch-certutil ca -out config/certs/elastic-certificates.p12 -pass 我这里没有设置ssl证书密码&#xff0c;如果需要设置密码&#xff0c;需要再配置给elasticsearch 在之前的步骤中&#xff0c;如果我们对elastic-certificates.p12 文件配置了密码…...

让win11右键默认显示更多选项

cmd / powershell 右键默认显示更多选项 reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve 刷新&#xff0c;使配置生效&#xff08;该命令需要cmd执行&#xff0c;powershell不行&#xff09; …...

毕业项目推荐:基于yolov8/yolo11的100种中药材检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...

kill -9 结束某个用户所有进程的方式-linux019

1. 使用 pkill 命令 pkill 命令可以通过用户名直接终止该用户的所有进程。加上 -9 参数&#xff0c;表示强制结束进程。 pkill -9 -u XXXX 说明&#xff1a;这个命令会使用 SIGKILL 信号&#xff08;即 kill -9&#xff09;强制终止 ttlsa 用户的所有进程。 2. 使用 killal…...

自用题库---面试使用

1、css中如何实现水平垂直居中 方法一&#xff1a;flex&#xff1a; display: flex; justify-content: center; align-item: center;方法二&#xff1a;绝对定位margin:auto: position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin:auto;方法三&#xff1a;已…...

蓝桥杯好数

样例输入&#xff1a; 24 输出&#xff1a;7 输入&#xff1a;2024 输出&#xff1a; 150 思路&#xff1a;本题朴素方法的时间复杂度是O(n * log10(n)) &#xff0c;不超时。主要考察能否逐位取数&#xff0c;注意细节pi&#xff0c;这样不会改变i,否则会导致循环错误。 #in…...