鸿蒙开发:了解帧动画

前言

所谓帧动画,就是类似播放电影一样,一帧一帧的进行播放,相对于属性动画,其每一帧,我们都可以进行设置相关的属性值,并且具有暂停播放,继续播放的优点,而且还具备事件的实时响应,需要说明的是,在性能上是远远不如属性动画的,所以如果能用属性动画实现的场景,还是主推属性动画。

实现帧动画

实现一个组件逐帧移动,并且可以进行暂停操作。

首先,帧动画是通过getUIContext().createAnimator来创建一个帧动画,并通过onFrame方法来接收到帧时回调,并在此方法中进行相关执行动画操作。

简单举例

@Entry
@Component
struct Index {@State animatorOptions: AnimatorResult | undefined = undefinedanimatorOption: AnimatorOptions = {duration: 3000, //动画播放的时长delay: 0, //动画延时播放时长easing: 'linear', //动画插值曲线iterations: 1, //动画播放次数fill: "forwards", //动画执行后是否恢复到初始状态direction: 'normal', //动画播放模式begin: 0, //动画插值起点end: 100//动画插值终点}@State translateX: number = 0@State translateY: number = 0onPageShow(): void {this.animatorOptions = this.getUIContext().createAnimator(this.animatorOption)this.animatorOptions.onFrame = (progress: number) => {//接收到帧时回调this.translateX = progress}}onPageHide(): void {this.animatorOptions = undefined}build() {RelativeContainer() {Text("1").width(30).height(30).textAlign(TextAlign.Center).backgroundColor(Color.Red).margin({ top: 100 }).id("view1").alignRules({top: { anchor: "__container__", align: VerticalAlign.Top },middle: { anchor: "__container__", align: HorizontalAlign.Center }}).translate({ x: this.translateX, y: this.translateY })Row() {Button("播放").onClick(() => {this.animatorOptions?.play()})Button("暂停").margin({ left: 10 }).onClick(() => {this.animatorOptions?.pause()})Button("重置").margin({ left: 10 }).onClick(() => {this.translateX = 0this.translateY = 0})}.margin({ top: 10 }).alignRules({center: { anchor: "__container__", align: VerticalAlign.Center },middle: { anchor: "__container__", align: HorizontalAlign.Center }})}.height('100%').width('100%')}
}

实际效果查看:

createAnimator方法会创建一个帧动画,并且返回一个AnimatorResult对象,通过AnimatorResult,我们可以实现很多功能,比如播放,暂停,取消,监听状态等等。

播放

this.animatorOptions?.play()

暂停

this.animatorOptions?.pause()

取消

this.animatorOptions?.cancel()

反转

this.animatorOptions?.reverse()

完成

this.animatorOptions?.finish()

动画完成回调

 //动画完成时执行方法this.animatorOptions!.onFinish = () => {}

动画取消回调

//动画取消时执行方法
this.animatorOptions!.onCancel = () => {}

动画重复回调

this.animatorOptions!.onRepeat = () => {
}

设置期望的帧率范围

通过setExpectedFrameRateRange方法进行设置,Api必须在12及以上。

let expectedFrameRate: ExpectedFrameRateRange = {min: 0,max: 60,expected: 30
}
animatorResult.setExpectedFrameRateRange(expectedFrameRate)

图片帧动画

帧动画,运用最多的地方就是图片了,比如loading提示,一段简单的小动画等等,使用频率还是蛮高的,系统提供了ImageAnimator组件,方便我们进行实现。

简单举例

@Entry
@Component
struct Index {@State state: AnimationStatus = AnimationStatus.Runningprivate images: Array<ImageFrameInfo> = [{ src: $r("app.media.loading001") },{ src: $r("app.media.loading002") },{ src: $r("app.media.loading003") },{ src: $r("app.media.loading004") },{ src: $r("app.media.loading005") },{ src: $r("app.media.loading006") },{ src: $r("app.media.loading007") },{ src: $r("app.media.loading008") },{ src: $r("app.media.loading009") },{ src: $r("app.media.loading010") },{ src: $r("app.media.loading011") },{ src: $r("app.media.loading012") }]build() {RelativeContainer() {Column() {ImageAnimator().images(this.images).fixedSize(true).fillMode(FillMode.None).iterations(-1).state(this.state).width(40).height(40)}.id("view1").width(120).height(120).borderRadius(10).backgroundColor("#80000000").justifyContent(FlexAlign.Center).alignRules({top: { anchor: "__container__", align: VerticalAlign.Top },middle: { anchor: "__container__", align: HorizontalAlign.Center }}).margin({ top: 50 })Row() {Button("播放").onClick(() => {this.state = AnimationStatus.Running})Button("暂停").margin({ left: 10 }).onClick(() => {this.state = AnimationStatus.Paused})Button("停止").margin({ left: 10 }).onClick(() => {this.state = AnimationStatus.Stopped})}.margin({ top: 10 }).alignRules({center: { anchor: "__container__", align: VerticalAlign.Center },middle: { anchor: "__container__", align: HorizontalAlign.Center }})}.height('100%').width('100%')}
}

效果查看:

除了正常的Resource资源播放,也支持播放PixelMap动画,唯一区别就是在设置数据的时候。

imagePixelMap: Array<PixelMap> = []@State images:Array<ImageFrameInfo> = []async aboutToAppear() {this.imagePixelMap.push(await this.getPixmapFromMedia($r('app.media.icon')))this.images.push({src:this.imagePixelMap[0]})}private async getPixmapFromMedia(resource: Resource) {let unit8Array = await getContext(this)?.resourceManager?.getMediaContent({bundleName: resource.bundleName,moduleName: resource.moduleName,id: resource.id})let imageSource = image.createImageSource(unit8Array.buffer.slice(0, unit8Array.buffer.byteLength))let createPixelMap: image.PixelMap = await imageSource.createPixelMap({desiredPixelFormat: image.PixelMapFormat.RGBA_8888})await imageSource.release()return createPixelMap}

ImageAnimator常用属性

属性

类型

概述

images

Array<ImageFrameInfo>

设置图片帧信息集合。不支持动态更新。

state

AnimationStatus

控制播放状态

duration

number

设置播放时长

reverse

boolean

设置播放方向

fixedSize

boolean

设置图片大小是否固定为组件大小

fillMode

FillMode

设置当前播放方向下,动画开始前和结束后的状态

iterations

number

设置播放次数

相关总结

在设置图片帧信息集合的时候,是不支持动态更新的,这一点大家需要知道,还有最重要的一点就是,在性能上是不如属性动画的,也就是说能用属性动画实现的,尽量使用属性动画。

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

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

相关文章

发际线不断后移,生发液排行榜第一名,让绒毛碎发爆出来

脱发真的很困扰人&#xff0c;不疼不痒&#xff0c;但看着就老了几岁&#xff0c;形象也大打折扣&#xff0c;男性脱发就更直观了&#xff01;同学严重时&#xff0c;后脑勺几块拳头大的脱发区域&#xff0c;还有的呈“m”型脱发&#xff0c;脑门看着都大了。脱发除了遗传因素以…

Y3地图制作1:水果缤纷乐、密室逃脱

文章目录 一、水果缤纷乐1.1 游戏设计1.1.1 项目解析1.1.2 项目优化1.1.3 功能拆分 1.2 场景制作1.2.1 场景需求1.2.2 创建主镜头、绘制草稿&#xff0c;构思文案和情景1.2.3 构建场景地图1.2.4 光源与氛围设置 1.3 游戏初始化1.3.1 物编、UI预设置1.3.2 游戏初始化1.3.2 玩家初…

48页PPT|2024智慧仓储解决方案解读

本文概述了智慧物流仓储建设方案的行业洞察、业务蓝图及建设方案。首先&#xff0c;从政策层面分析了2012年至2020年间国家发布的促进仓储业、物流业转型升级的政策&#xff0c;这些政策强调了自动化、标准化、信息化水平的提升&#xff0c;以及智能化立体仓库的建设&#xff0…

【Linux】ChatGLM-4-9B模型之All Tools

一、摘要 最近在研究GLM4模型&#xff0c;发现自带的All Tools比较感兴趣&#xff0c;它具有完整工具调用能力的对话模式&#xff0c;原生支持网页浏览、代码执行、图表生成、图片生成&#xff0c;并支持自定义工具。它能够满足大模型私有化部署的个性定制&#xff0c;因此记录…

Vue零基础必学教程(16) 计算属性

往期内容&#xff1a; Vue零基础必学教程&#xff08;5&#xff09;挂载 Vue零基础必学教程&#xff08;6&#xff09;基本选项 Vue零基础必学教程&#xff08;7&#xff09;模板 Vue零基础必学教程&#xff08;8&#xff09;模板语法 Vue零基础必学教程&#xff08;9&…

14:30面试,14:08就出来了,面试问的有点变态呀。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,这…

【Leetcode】1705. 吃苹果的最大数目

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 有一棵特殊的苹果树&#xff0c;一连 n n n 天&#xff0c;每天都可以长出若干个苹果。在第 i i i 天&#xff0c;树上会长出 a p p l e s [ i ] apples[i] apples[i] 个苹果&a…

kimi搜索AI多线程批量生成txt原创文章软件-不需要账号及key

kimi搜索AI多线程批量生成txt原创文章软件介绍&#xff1a; 软件可以设置三种模型写文章&#xff1a;kimi&#xff1a;默认AI模型&#xff0c;kimi-search&#xff1a;联网检索模型 &#xff0c;kimi-research&#xff1a;探索版搜索聚合模型 1、可以设置写联网搜索文章&#…

游戏引擎学习第58天

发现一个vscode Log 断点的用法 回顾 我们正在继续推进工作&#xff0c;之前做了一些测试和清理工作&#xff0c;但还有一件事没有完成&#xff0c;因此我们还没有完全回到功能平衡的状态。昨天我们已经为实体做了空间划分&#xff0c;所以接下来的目标是继续完成这部分工作&a…

day14-16系统服务管理和ntp和防火墙

一、自有服务概述 服务是一些特定的进程&#xff0c;自有服务就是系统开机后就自动运行的一些进程&#xff0c;一旦客户发出请求&#xff0c;这些进程就自动为他们提供服务&#xff0c;windows系统中&#xff0c;把这些自动运行的进程&#xff0c;称为"服务" window…

Idea导入Springboot项目,无法正确加载yml文件,且不为绿色图标的解决办法

一、出现问题的环境 将项目复制新的环境后&#xff0c;.yml 文件不能显示为绿色&#xff0c;导致无法配置数据库。 二、解决办法。 在网上找了多种办法&#xff0c;并不适用&#xff0c;发现resources的显示也有问题&#xff0c;右击resources->Mark->Directory as -&g…

以太网通信--读取物理层PHY芯片的状态

PHY芯片通过MDIO接口进行读写&#xff0c;框图如下所示&#xff1a; 原理很简单&#xff0c;就是按照时序将PHY芯片的指定寄存器信息读出或者写入。 MDC时钟需要输出到PHY芯片&#xff0c;一般不低于80MHz。 MDIO是双向接口&#xff0c;FPGA读出状态信息时为输入&#xff0c;FP…

Doris Tablet 损坏如何应对?能恢复数据吗?

开门见山&#xff0c;能不能修&#xff1f; Doris 的 Tablet 损坏了&#xff0c;到底能不能修呢&#xff1f;数据会不会丢&#xff1f; 这玩意还真不好说&#xff1f; 哎&#xff0c;怎么又不好说了呢&#xff1f; 这个主要是因为下面的原因&#xff1a; Doris 数据的高可…

【Linux】查询磁盘空间被谁占用了

查询磁盘空间被谁占用了 先说下常见的几种原因&#xff1a; 1、删除的文件未释放空间 2、日志或过期文件未及时清理 3、inode导致 4、隐藏文件夹或者目录 6、磁盘碎片 最后一种单独介绍。 环境&#xff1a;情况是根分区&#xff08;/&#xff09;的总容量为44GB&#xf…

Scala课堂小结

(一)数组&#xff1a; 1.不可变数组 2创建数组

GitPuk安装配置指南

GitPuk是一款开源免费的代码管理工具&#xff0c;上篇文章已经介绍了Gitpuk的功能与优势&#xff0c;这篇文章将为大家讲解如何快速安装和配置GitPuk&#xff0c;助力你快速的启动GitPuk管理代码 1. 安装 支持 Windows、Mac、Linux、docker 等操作系统。 1.1 Windows安装 下载…

大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发&#xff08;2&#xff09;—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序&#xff0c;用于从大恒相机采集图像&#xff0c;通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码&#xff1a; # version:…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——12使用YOLO-Bin

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——12使用YOLO-Bin ​ 根据前面内容&#xff0c;所有的子任务已经基本结束&#xff0c;接下来就是调用转化的bin模型进行最后的逻辑控制了 1 .YOLO的bin使用 ​ 对于yolo其实有个简单的办法&#xff0c;也…

Golang的容器化技术实践总结

Golang的容器化技术实践总结 一、容器化技术概述 什么是容器化技术 容器化技术是一种轻量级、可移植的虚拟化解决方案&#xff0c;它将应用程序、运行环境和依赖项打包到一个被称为容器的独立单元中。容器可以在不同的操作系统中运行&#xff0c;具有更高的资源利用率和更快的部…

修改el-select下拉框高度;更新:支持动态修改

文章目录 效果动态修改&#xff1a;效果代码固定高度版本动态修改高度版本&#xff08;2024-12-25 更新&#xff1a; 支持动态修改下拉框高度&#xff09; 效果 动态修改&#xff1a;效果 代码 固定高度版本 注意点&#xff1a; popper-class 尽量独一无二&#xff0c;防止影…