鸿蒙初学者学习手册(HarmonyOSNext_API14)_自定义动画API(@ohos.animator (动画) )
前言
在纯血鸿蒙中最具有用户特色的效果就是自定义的动画效果。在纯血鸿蒙中有多种定义方式,但是今天介绍的是ApI中的自定义动画。
注意:
动画本身具有生命周期,但是不支持在UIAbility的文件使用,简单而言就是不允许在UIAbility生命周期中调用
涉及到的API属性
Animator
| 属性 | 参数 | 功能 | 参数类型 | 返回类型 |
|---|---|---|---|---|
| create | create(options: AnimatorOptions): AnimatorResult | 创建动画 | AnimatorOptions (必填) | AnimatorResult |
AnimatorResult
| 属性 | 参数 | 功能 | 参数类型 | 返回类型 |
|---|---|---|---|---|
| reset | reset(options: AnimatorOptions): void | 更新当前动画器。 | AnimatorOptions(必填) | 无 |
| play | play(): void | 启动动画。动画会保留上一次的播放状态,比如播放状态设置reverse后,再次播放会保留reverse的播放状态。 | 无 | 无 |
| finish | finish(): void | 结束动画 | 无 | 无 |
| pause | pause(): void | 暂停动画。 | 无 | 无 |
| cancel | cancel(): void | 取消动画。 | 无 | 无 |
| reverse | reverse(): void | 以相反的顺序播放动画。使用interpolating-spring曲线时此接口无效。 | 无 | 无 |
回调函数(理解为生命周期)
| 属性 | 参数 | 功能 | 参数类型 | 返回类型 |
|---|---|---|---|---|
| onFrame | onFrame: (progress: number) => void | 接收到帧时回调。 | progress:number(必填) | 无 |
| onFinish | onFinish: () => void | 动画完成时回调。 | 无 | 无 |
| onCancel | onCancel: () => void | 动画被取消时回调。 | 无 | 无 |
| onRepeat | onRepeat: () => void | 动画重复时回调。 | 无 | 无 |
AnimatorOptions(定义动画选项。)
| 名称 | 类型 | 必填 | 功能 |
|---|---|---|---|
| duration | number | 是 | 动画持续时间 |
| easing | string | 是 | 动画插值曲线 |
| delay | number | 是 | 动画延时播放时长,单位毫秒,设置为0时,表示不延时。 |
| fill | ‘none’ ‘forwards’ ‘backwards’ ‘both’ | 是 | 动画执行后是否恢复到初始状态,动画执行后,动画结束时的状态(在最后一个关键帧中定义)将保留。 |
| direction | ‘normal’ ‘reverse’ ‘alternate’ ‘alternate-reverse’ | 是 | 动画播放模式正序,逆序,交替正序,交替逆序 |
| iterations | number | 是 | 动画播放次数 |
| begin | number | 是 | 动画插值起点。 |
| end | number | 是 | 动画插值终点。 |
注意:以上为涉及属性和参数一下为示例代码和详细注释
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 头文件 全能头文件: #include<bits/stdc.h>自定义排序函数 bool compare(const int &odd1,const int &odd2) {return odd1>odd2; }stl 枚举map map<int, strin…...
【相聚青岛】人工智能与材料国际学术会议即将召开
一、大会简介 人工智能与材料国际会议(ICAIM 2025) 官方网站:www.ic-aim.net 官方邮箱:icaim2025163.com 会议时间:2025年3.21-24 会议地点:中国青岛 会议检索:EI检索 截稿时间:2月…...
BFS 解决 FloodFill 算法(典型算法思想)—— OJ例题算法解析思路
目录 一、733. 图像渲染 - 力扣(LeetCode) 算法代码: 算法思路 基础参数 函数入口 检查条件 初始化 BFS BFS 填充过程 返回结果 复杂度分析 总结 二、200. 岛屿数量 - 力扣(LeetCode) 算法代码:…...
纷析云开源版- 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可以操作浏览器,在浏览器页面上实现:点击、输入、滑动 等操作。 不同于selenium自动化,逆向本质是: 分析请求,例如:请求方法、请求参数、加密方式等。用代码模拟请求去实现同等…...
前端导出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…...
从面试中的“漏掉步骤”谈自我表达与思维方式的转变
在今天的面试中,我遇到了一个让我深刻反思自己思维方式的问题。当面试官问到如何应对用户量和请求量逐渐增加时,我的回答遗漏了一些基础步骤,导致我给出了“我暂时想不出更好的反思”的回答。这一经历让我意识到,在面对问题时&…...
大模型面经:SFT和RL如何影响模型的泛化或记忆能力?
监督微调 (SFT) 和强化学习 (RL)都是目前大模型的基础模型后训练技术,像DeepSeek-R1、kimi等的训练方法都将两种技术应用到了极致。 如何去设计训练步骤(先SFT再RL,还是直接RL)都需要对SFT和RL的能力有较深刻的了解。 本篇就以面…...
力扣-回溯-17 电话号码的字母组合
思路 和之前的回溯不同的是,要遍历完所有的数字,并且在单层递归逻辑里需要遍历一整个字符串 代码 class Solution { public:vector<string> letters {"", "", "abc", "def", "ghi", "…...
大模型幻觉
1.什么是大模型幻觉? 在语言模型的背景下,幻觉指的是一本正经的胡说八道:看似流畅自然的表述,实则不符合事实或者是错误的。 幻觉现象的存在严重影响LLM应用的可靠性,本文将探讨大型语言模型(LLMs)的幻觉问题,以及解决幻觉现象的一些常见方法。 2.为什么需要解决LLM的…...
2025-02-20 学习记录--C/C++-PTA 7-27 冒泡法排序
一、题目描述 ⭐️ 二、代码(C语言)⭐️ /** * 冒泡法实现升序 */#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开发板有两个网口,一个无线网卡。我需要配置为家用路由器模…...
【数据挖掘】--算法
【数据挖掘】--算法 目录:1. 缺失值和数值属性处理1缺失值处理: 2. 用于文档分类的朴素贝叶斯3. 分治法:建立决策树4. 覆盖算法建立规则5. 挖掘关联规则6. 线性模型有效寻找最近邻暴力搜索(Brute-Force Search)kd树&am…...
Huatuo热更新--如何使用
在安装完huatuo热更新插件后就要开始学习如何使用了。 1.创建主框渐Main 新建文件夹Main(可自定义),然后按下图创建文件,注意名称与文件夹名称保持一致 然后新建场景(Init场景),添加3个空物体…...
基于Django快递物流管理可视化分析系统(完整系统源码+数据库+详细开发文档+万字详细论文+答辩PPT+详细部署教程等资料)
文章目录 基于Django快递物流管理可视化分析系统(完整系统源码数据库详细开发文档万字详细论文答辩PPT详细部署教程等资料)一、项目概述二、项目说明三、研究意义四、系统设计技术架构 五、功能实现六、完整系统源码数据库详细开发文档万字详细论文答辩P…...
基于射频开关选择的VNA校准设计
活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!…...
解决本地模拟IP的DHCP冲突问题
解决 DHCP 冲突导致的多 IP 绑定失效问题 前言 续接上一篇在本机上模拟IP地址。 在实际操作中,如果本机原有 IP(如 192.168.2.7)是通过 DHCP 自动获取的,直接添加新 IP(如 10.0.11.11)可能会导致 DHCP 服…...
ChromeDriver下载
平时为了下个驱动,到处找挺麻烦,收集了很多无偿分享给需要的人,仅供学习和交流。 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分页插件封装
封装插件: 可自定义返回的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证书密码,如果需要设置密码,需要再配置给elasticsearch 在之前的步骤中,如果我们对elastic-certificates.p12 文件配置了密码…...
让win11右键默认显示更多选项
cmd / powershell 右键默认显示更多选项 reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve 刷新,使配置生效(该命令需要cmd执行,powershell不行) …...
毕业项目推荐:基于yolov8/yolo11的100种中药材检测识别系统(python+卷积神经网络)
文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...
kill -9 结束某个用户所有进程的方式-linux019
1. 使用 pkill 命令 pkill 命令可以通过用户名直接终止该用户的所有进程。加上 -9 参数,表示强制结束进程。 pkill -9 -u XXXX 说明:这个命令会使用 SIGKILL 信号(即 kill -9)强制终止 ttlsa 用户的所有进程。 2. 使用 killal…...
自用题库---面试使用
1、css中如何实现水平垂直居中 方法一:flex: display: flex; justify-content: center; align-item: center;方法二:绝对定位margin:auto: position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin:auto;方法三:已…...
蓝桥杯好数
样例输入: 24 输出:7 输入:2024 输出: 150 思路:本题朴素方法的时间复杂度是O(n * log10(n)) ,不超时。主要考察能否逐位取数,注意细节pi,这样不会改变i,否则会导致循环错误。 #in…...
