鸿蒙动画开发08——帧动画

news2024/11/24 2:36:04

1、概 述

帧动画通过应用onFrame逐帧回调的方式,让开发者在应用侧的每一帧都可以设置属性值,从而实现设置了该属性值对应组件的动画效果。

相比于属性动画,开发者可感知动画的过程,实时修改UI侧的值,具有事件可实时响应、可暂停的优点,但性能上不如属性动画。在属性动画符合要求时更推荐使用属性动画的接口实现。

在鸿蒙开发中,帧动画通过 @ohos.animator 来实现,API介绍如下。

2、核心API介绍

2.1、模块导入

// 模块导入import { Animator as animator, AnimatorOptions,AnimatorResult } from '@kit.ArkUI';

2.2、create 创建一个Animator类​​​​​​​

// 创建一个动画create(options: AnimatorOptions): AnimatorResult// 入参 AnimatorOptions结构定义如下:class AnimatorOptions {  duration: number // 动画播放的时长,单位毫秒。默认值:0。    /*动画插值曲线,仅支持以下可选值:  "linear":动画线性变化。  "ease":动画开始和结束时的速度较慢,cubic-bezier(0.25、0.1、0.25、1.0)。  "ease-in":动画播放速度先慢后快,cubic-bezier(0.42, 0.0, 1.0, 1.0)。  "ease-out":动画播放速度先快后慢,cubic-bezier(0.0, 0.0, 0.58, 1.0)。  "ease-in-out":动画播放速度先加速后减速,cubic-bezier(0.42, 0.0, 0.58, 1.0)。  "fast-out-slow-in":标准曲线,cubic-bezier(0.4,0.0,0.2,1.0)。  "linear-out-slow-in":减速曲线,cubic-bezier(0.0,0.0,0.2,1.0)。  "fast-out-linear-in":加速曲线,cubic-bezier(0.4, 0.0, 1.0, 1.0)。  "friction":阻尼曲线,cubic-bezier(0.2, 0.0, 0.2, 1.0)。  "extreme-deceleration":急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。  "rhythm":节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。  "sharp":锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。  "smooth":平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。  "cubic-bezier(x1,y1,x2,y2)":三次贝塞尔曲线,x1、x2的值必须处于0-1之间。例如"cubic-bezier(0.42,0.0,0.58,1.0)"。  "steps(number,step-position)":阶梯曲线,number必须设置,为正整数,step-position参数可选,支持设置start或end,默认值为end。例如"steps(3,start)"。  "interpolating-spring(velocity,mass,stiffness,damping)":插值弹簧曲线,从API version 11开始支持且仅在ArkTS中支持使用。velocity、mass、stiffness、damping都是数值类型,且mass、stiffness、damping参数均应该大于0,具体参数含义参考插值弹簧曲线。使用interpolating-spring时,duration不生效,由弹簧参数决定;fill、direction、iterations设置无效,fill固定设置为"forwards",direction固定设置为"normal",iterations固定设置为1,且对animator的reverse函数调用无效。即animator使用interpolating-spring时只能正向播放1次。  默认值:"ease"。   */  easing: string      // 动画延时播放时长,单位毫秒,设置为0时,表示不延时。设置为负数时动画提前播放,如果提前播放的时长大于动画总时长,动画直接过渡到终点。默认值:0。  delay: number     // 动画执行后是否恢复到初始状态,动画执行后,动画结束时的状态(在最后一个关键帧中定义)将保留。  fill: "none" | "forwards" | "backwards" | "both"    // 动画播放模式。  direction: "normal" | "reverse" | "alternate" | "alternate-reverse"  是      iterations: number // 动画播放次数。设置为0时不播放,设置为-1时无限次播放。    begin: number // 动画插值起点。默认值:0。    end: number // 动画插值终点。默认值:1。}

使用create接口创建一个帧动画实例,代码示例如下:​​​​​​​

import {Animator as animator, AnimatorOptions, AnimatorResult } from '@kit.ArkUI';import { BusinessError } from '@kit.BasicServicesKit';let options: AnimatorOptions = { duration: 1500, easing: "friction", delay: 0, fill: "forwards", direction: "normal", iterations: 3, begin: 200.0, end: 400.0};animator.create(options);// 建议使用 UIContext.creatAnimator()接口

帧动画创建成功后,后续对动画所有的操作都在AnimatorResult对象上完成。

2.3、AnimatorResult

AnimatorResult定义如下(请注意最后一个方法,可以设置帧率范围):​​​​​​​

class AnimatorResult {//更新当前动画器。reset(options: AnimatorOptions): void// 启动动画。动画会保留上一次的播放状态,比如播放状态设置reverse后,再次播放会保留reverse的播放状态。play(): void// 结束动画finish(): void// 暂停动画pause(): void// 取消动画cancel(): void// 以相反的顺序播放动画。使用interpolating-spring曲线时此接口无效。reverse(): void// 接收到帧时回调。progress为动画当前的值onFrame: (progress: number) => void// 动画完成时的回调onFinish: () => void// 动画被取消时的回调onCancel: () => void// 动画重复时回调onRepeat: () => void//设置期望的帧率范围。setExpectedFrameRateRange(rateRange: ExpectedFrameRateRange): void}

3、案 例

我们使用Animator实现小球抛物运动为例,效果如下:

图片

开发步骤如下:

👉🏻 step1 :引入依赖与定义需要动画的组件​​​​​​​

import { AnimatorOptions, AnimatorResult } from '@kit.ArkUI';// ...Button()  .width(60)  .height(60)  .translate({ x: this.translateX, y: this.translateY })

👉🏻 step2 :在onPageShow中创建AnimatorResult对象。​​​​​​​

onPageShow(): void {    //创建animatorResult对象    this.animatorOptions = this.getUIContext().createAnimator(options);    this.animatorOptions.onFrame = (progress: number) => {    this.translateX = progress;    if (progress > this.topWidth && this.translateY < this.bottomHeight) {       this.translateY = Math.pow(progress - this.topWidth, 2) * this.g;    } } //动画取消时执行方法 this.animatorOptions.onCancel = () => {    this.animatorStatus = '取消'; } //动画完成时执行方法 this.animatorOptions.onFinish = () => {    this.animatorStatus = '完成'; } //动画重复播放时执行动画 this.animatorOptions.onRepeat = () => {    console.log("动画重复播放"); }}

👉🏻 step3 :定义动画播放,重置,暂停的按钮。​​​​​​​

Button('播放').onClick(() => {  this.animatorOptions?.play();  this.animatorStatus = '播放中'}).width(80).height(35)Button("重置").onClick(() => {  this.translateX = 0;  this.translateY = 0;}).width(80).height(35)Button("暂停").onClick(() => {  this.animatorOptions?.pause();  this.animatorStatus = '暂停'}).width(80).height(35)

👉🏻 step4 :在页面结束生命周期回调中销毁动画。​​​​​​​

onPageHide(): void {  this.animatorOptions = undefined;}

完整的代码如下:​​​​​​​

import { AnimatorOptions, AnimatorResult } from '@kit.ArkUI';@Entry@Componentstruct Index {  @State animatorOptions: AnimatorResult | undefined = undefined;  @State animatorStatus: string = '创建';  begin: number = 0;  end: number = 300  topWidth: number = 150;  bottomHeight: number = 100;  g: number = 0.18  animatorOption: AnimatorOptions = {    duration: 4000,    delay: 0,    easing: 'linear',    iterations: 1,    fill: "forwards",    direction: 'normal',    begin: this.begin,    end: this.end  };  @State translateX: number = 0;  @State translateY: number = 0;  onPageShow(): void {    this.animatorOptions = this.getUIContext().createAnimator(this.animatorOption)    this.animatorOptions.onFrame = (progress: number) => {      this.translateX = progress;      if (progress > this.topWidth && this.translateY < this.bottomHeight) {        this.translateY = Math.pow(progress - this.topWidth, 2) * this.g;      }    }    this.animatorOptions.onCancel = () => {      this.animatorStatus = '取消';    }    this.animatorOptions.onFinish = () => {      this.animatorStatus = '完成';    }    this.animatorOptions.onRepeat = () => {      console.log("动画重复播放");    }  }  onPageHide(): void {    this.animatorOptions = undefined;  }  build() {    Column() {      Column({ space: 30 }) {        Button('播放').onClick(() => {          this.animatorOptions?.play();          this.animatorStatus = '播放中';        }).width(80).height(35)        Button("重置").onClick(() => {          this.translateX = 0;          this.translateY = 0;        }).width(80).height(35)        Button("暂停").onClick(() => {          this.animatorOptions?.pause();          this.animatorStatus = '暂停';        }).width(80).height(35)      }.width("100%").height('25%')      Stack() {        Button()          .width(60)          .height(60)          .translate({ x: this.translateX, y: this.translateY })      }      .width("100%")      .height('45%')      .align(Alignment.Start)      Text("当前动画状态为:" + this.animatorStatus)    }.width("100%").height('100%')  }}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Python基础》之字符串格式化输出

目录 方式一 1、带索引 {0} 2、不带索引 { } 3、{自定义变量} 方式二 方式三 控制浮点数精度 方式一 使用.format( )进行格式化 1、带索引 {0} name boy age 18 high 183.55555 gender man print(姓名是&#xff1a;{0},年龄是:{1},身高是:{2},性别是:{3},身高是…

OpenCV相机标定与3D重建(3)校正鱼眼镜头畸变的函数calibrate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::fisheye::calibrate 函数是 OpenCV 中用于校正鱼眼镜头畸变的一个重要函数。该函数通过一系列棋盘格标定板的图像来计算相机的内参矩阵和畸变…

Redis五大基本类型——Set集合命令详解(命令用法详解+思维导图详解)

目录 一、Set集合类型介绍 二、常见命令 1、SADD 2、SMEMBERS 3、SISMEMBER 4、SCARD 5、SRANDMEMBER 6、SPOP 7、SMOVE 8、SREM ​编辑 9、集合间操作 &#xff08;1&#xff09;SINTER &#xff08;2&#xff09;SINTERSTORE &#xff08;3&#xff09;SUNION…

CCE-基础

背景&#xff1a; 虚拟化产生解决物理机资源浪费问题&#xff0c;云计算出现实现虚拟化资源调度和管理&#xff0c;容器出现继续压榨虚拟化技术产生的资源浪费&#xff0c;用命名空间隔离&#xff08;namespace&#xff09; 灰度升级&#xff08;升级中不影响业务&#xff09…

Chrome离线安装包下载

1、问Chrome的官网&#xff1a;https://www.google.cn/chrome/ 直接下载的是在线安装包&#xff0c;安装需要联网。 2、如果需要在无法联网的设备上安装Chrome&#xff0c;需要在上面的地址后面加上?standalone1。 Chrome离线安装包下载地址&#xff1a;https://www.google.c…

二进制 分析工具:Radare2、r2frida、Binutils、file、string、as、nm、ldd、objdump、readelf、strip

1、二进制 分析工具 工欲善其事&#xff0c;必先利其器&#xff0c;在二进制安全的学习中&#xff0c;​使用工具尤为重要。遇到一个不熟悉的文件时&#xff0c; 首先要确定 "这是什么类型的文件"&#xff0c;回答这个问题的首要原则是&#xff0c;绝不要根据文件的扩…

快速图像识别:落叶植物叶片分类

1.背景意义 研究背景与意义 随着全球生态环境的变化&#xff0c;植物的多样性及其在生态系统中的重要性日益受到关注。植物叶片的分类不仅是植物学研究的基础&#xff0c;也是生态监测、农业管理和生物多样性保护的重要环节。传统的植物分类方法依赖于人工观察和专家知识&…

Chrome 浏览器 131 版本新特性

Chrome 浏览器 131 版本新特性 一、Chrome 浏览器 131 版本更新 1. 在 iOS 上使用 Google Lens 搜索 自 Chrome 126 版本以来&#xff0c;用户可以通过 Google Lens 搜索屏幕上看到的任何图片或文字。 要使用此功能&#xff0c;请访问网站&#xff0c;并点击聚焦时出现在地…

Windows系统编程 - 注册表

文章目录 前言注册表介绍打开和关闭注册表RegOpenKeyExRegCloseKey测试案例 创建删除子键RegCreateKeyEx创建子键RegDeleteKey删除子键 写入删除键值RegQueryValueExRegSetValueExRegDeleteValue测试案例 子键和项的枚举RegEnumKeyExRegEnumValueRegQueryInfoKey测试案例 总结 …

Jenkins + gitee 自动触发项目拉取部署(Webhook配置)

目录 前言 Generic Webhook Trigger 插件 下载插件 ​编辑 配置WebHook 生成tocken 总结 前言 前文简单介绍了Jenkins环境搭建&#xff0c;本文主要来介绍一下如何使用 WebHook 触发自动拉取构建项目&#xff1b; Generic Webhook Trigger 插件 实现代码推送后&#xff0c;触…

Failed to start Docker Application Container Engine

说明&#xff1a; 1&#xff09;访问应用业务&#xff0c;读取不到数据&#xff0c;show databases;查看数据库报错 2&#xff09;重启docker服务&#xff0c;服务启动失败&#xff0c;查看日志报错如下图所示 3&#xff09;报错信息&#xff1a;chmod /data/docker: read-only…

1、HCIP之RSTP协议与STP相关安全配置

目录 RSTP—快速生成树协议 STP STP的缺点&#xff1a; STP的选举&#xff08;Listening状态中&#xff09;&#xff1a; RSTP P/A&#xff08;提议/同意&#xff09;机制 同步机制&#xff1a; 边缘端口的配置&#xff1a; RSTP的端口角色划分&#xff1a; ensp模拟…

Kafka 生产者优化与数据处理经验

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

Hello-Go

Hello-Go 环境变量 GOPATH 和 GOROOT &#xff1a;不同于其他语言&#xff0c;go中没有项目的说法&#xff0c;只有包&#xff0c;其中有两个重要的路径&#xff0c;GOROOT 和 GOPATH Go开发相关的环境变量如下&#xff1a; GOROOT&#xff1a;GOROOT就是Go的安装目录&…

android 实现答题功能

一、效果 二、实现思路 1、界面实现 实现起来其实不难&#xff0c;首先我们可以看到&#xff0c;界面是由答题进度、题目、选项ABCD组成&#xff0c;现在就是要考虑实现方式&#xff0c;答题进度可以使用Textviewprogressbar实现&#xff0c;题目直接使用Textview&#xff0c;…

基于Java Springboot高校工作室管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

React(二)

文章目录 项目地址七、数据流7.1 子组件传递数据给父组件7.1.1 方式一:給父设置回调函数,传递给子7.1.2 方式二:直接将父的setState传递给子7.2 给props传递jsx7.2.1 方式一:直接传递组件给子类7.2.2 方式二:传递函数给子组件7.3 props类型验证7.4 props的多层传递7.5 cla…

浅谈丨功能安全测试,汽车的守护者

随着新能源汽车迅猛的发展&#xff0c;各类车型频频面世&#xff0c;同时辅助驾驶/自动驾驶等智驾功能也在不断迭代&#xff0c;使得整个汽车系统的复杂性越来越高&#xff0c;最终导致消费者不得不对如今的汽车质量和安全性提出质疑。 如何打破质疑&#xff1f; 那就不得不搬…

bridge-multicast-igmpsnooping

# 1.topo # 2.创建命名空间 ip netns add ns0 ip netns add ns1 ip netns add ns2 ip netns add ns3 # 3.创建veth设备 ip link add ns0-veth0 type veth peer name hn0-veth0 ip link add ns1-veth0 type veth peer name hn1-veth0 ip link add ns2-veth0 type veth pe…

密码学11

概论 计算机安全的最核心三个关键目标&#xff08;指标&#xff09;/为&#xff1a;保密性 Confidentiality、完整性 Integrity、可用性 Availability &#xff0c;三者称为 CIA三元组 数据保密性&#xff1a;确保隐私或是秘密信息不向非授权者泄漏&#xff0c;也不被非授权者使…