鸿蒙Harmony开发:onFrame逐帧回调规范

news2024/11/24 2:59:52

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

使用animator实现动画效果

使用如下步骤可以创建一个简单的animator,并且在每个帧回调中打印当前插值。

  1. 引入相关依赖。

    import {Animator as animator, AnimatorOptions, AnimatorResult  } from '@kit.ArkUI';
  2. 创建执行动画的对象。

    // 创建动画的初始参数
    let options: AnimatorOptions = {                        
       duration: 1500,                               
       easing: "friction",                        
       delay: 0,                           
       fill: "forwards",                                  
       direction: "normal",                                  
       iterations: 2,                                        
       // 动画onFrame 插值首帧值                                    
       begin: 200.0,                                         
       // 动画onFrame 插值尾帧值                                    
       end: 400.0                                            
    }; 
    let result: AnimatorResult = animator.create(options);
       // 设置接收到帧时回调,动画播放过程中每帧会调用onFrame回调
        result.onFrame = (value: number) => {
        console.log("current value is :" + value);
    }
  3. 播放动画。

    // 播放动画
    result.play();
  4. 动画执行完成后手动释放AnimatorResult对象。

    // 播放动画
    result = undefined;

使用animator实现小球抛物运动

  1. 引入相关依赖
    import {Animator as animator, AnimatorOptions, AnimatorResult  } from '@kit.ArkUI';
  2. 定义要做动画的组件

    Button()
      .width(60)
      .height(60)
      .translate({ x: this.translateX, y: this.translateY })
  3. 在onPageShow中创建AnimatorResult对象。

    onPageShow(): void {
        //创建animatorResult对象
        this.animatorOptions = animator.create(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("动画重复播放");
     }
    }
  4. 定义动画播放,重置,暂停的按钮。

    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)

  5. 在页面结束生命周期回调中销毁动画。
    onPageHide(): void {
      this.animatorOptions = undefined;
    }

完整示例如下。

   import { Animator as animator, AnimatorOptions, AnimatorResult } from '@kit.ArkUI';

   @Entry
   @Component
   struct 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 = animator.create(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%')
    }
}

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

点击→【纯血版鸿蒙全套最新学习资料】希望这一份鸿蒙学习资料能够给大家带来帮助!~


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

点击→纯血版全套鸿蒙HarmonyOS学习资料

2.视频学习资料+学习PDF文档

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、(南向驱动、嵌入式等)鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS Next 最新全套视频教程

​​

 

 大厂面试必问面试题

​​

鸿蒙南向开发技术

​​

鸿蒙APP开发必备

​​

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

​​

《鸿蒙开发基础》

​​

《鸿蒙开发进阶》

《鸿蒙进阶实战》

​​


点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,才能在这个变革的时代中立于不败之地。 

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

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

相关文章

萌新的Java入门日记18

一、mybatis范围筛选 1.第一种表示方法 <!--resultType 查出来的结果自贡每一行都要映射到该类型的对象--><select id"getStaff" resultType"com.easy.bean.Staff">select * from staff<!--根据参数不同组合出不同的SQL语句 动态SQL语句…

java之IO篇——工具包Commons-io和Hutool

前言 结束了IO篇的File、基本流和高级流。还要认识IO流的一些工具包Commons-io和hutool&#xff0c;不算是框架&#xff0c;但是非常实用。 目录 前言 一、Commons-io 1.来历及作用 2.使用 二、Hutool 1.简介 2.使用 一、Commons-io 1.来历及作用 Commons-io是apache…

C++第七篇 模板初阶和STL简介

目录 一&#xff0c;模板初阶 1.泛型编程 2.函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3.类模板(模板类&#xff0c;模板函数) 3.1 类模板定义格式 二&#xff0c;STL简介 1. 什么是STL 2. ST…

【JUC】并发编程与源码分析 1-7章

1 线程基础知识复习 1把锁&#xff1a;synchronized&#xff08;后面细讲&#xff09; 2个并&#xff1a; 并发&#xff08;concurrent&#xff09;&#xff1a;是在同一实体上的多个事件&#xff0c;是在一台机器上“同时”处理多个任务&#xff0c;同一时刻&#xff0c;其…

【学习笔记】A2X通信的协议(三)- A2X PC5通信(一)

目录 6. A2X通信 6.1 A2X PC5通信 6.1.1 一般说明 6.1.2 通过NR-PC5的单播模式A2X通信 6.1.2.1 概述 6.1.2.2 A2X PC5单播链路建立程序 6.1.2.2.1 一般说明 6.1.2.2.2 发起UE启动A2X PC5单播链路建立程序 6.1.2.2.3 目标UE接受的A2X PC5单播链路建立程序 6.1.2.2.5 目…

学单片机怎么在3-5个月内找到工作?

每个初学者&#xff0c;都如履薄冰&#xff0c;10几年前&#xff0c;我自学单片机时&#xff0c;也一样。 想通过学习&#xff0c;找一份体面点的工作&#xff0c;又害怕辛辛苦苦学出来&#xff0c;找不到工作。 好在&#xff0c;当初执行力&#xff0c;还算可以&#xff0c;自…

WebLogic

二、WebLogic 2.1 后台弱口令GetShell 漏洞描述 通过弱口令进入后台界面&#xff0c;上传部署war包&#xff0c;getshell 影响范围 全版本(前提后台存在弱口令) 漏洞复现 默认账号密码:weblogic/Oracle123weblogic常用弱口令: Default Passwords | CIRT.net这里注意&am…

设计模式--结构型

类适配器 #include <queue> #include <iostream> #include <algorithm> #include <iterator>using namespace std;// 目标接口 class Target {public:virtual ~Target() {}virtual void method() 0; };// 适配者类 class Adaptee {public:void spec_…

CHIESI凯西医药:外企入职测评综合能力及性格测试SHL题库测评真题解析

CHIESI凯西医药是一家意大利国际制药集团&#xff0c;以研发为核心&#xff0c;专注于呼吸道健康、罕见疾病和专科治疗的创新治疗方案。集团总部位于意大利帕尔马市&#xff0c;拥有超过85年的历史&#xff0c;业务遍及全球31个国家和地区&#xff0c;拥有7,000多名员工。2023年…

day22(mysql数据库主从搭建)

上午&#xff1a; 1、为mysql添加开机启动chkconfig 2、编辑配置文件my.cnf 3、修改环境变量 4、mysql角色授权 角色不生效 在配置文件中不添加activate_all_roles_on_loginon glibc安装&#xff0c;my.cnf在项目目录之下 rpm安装&#xff0c;my.cnf文件在/etc/my.cnf 5、自…

函数实例讲解(五)

文章目录 提取字符串必学的函数&#xff08;LEFT、MID、RIGHT、LEN、LENB&#xff09;1、LEFT2、RIGHT3、MID4、LEN5、LENB 提取实战套路知多少1、FIND2、ISNUMBER 利用随机函数来抽奖&#xff08;RAND、RANDBETWEEN&#xff09;1、RAND2、RANDBETWEEN 排名的几种套路&#xff…

解决nacos疯狂报错“user nacos not found”

nacos疯狂报错“user nacos not found” 参考博客&#xff1a;https://blog.csdn.net/cnskylee/article/details/137640113 背景&#xff1a;项目启动后一直刷“user nacos not found”报错信息&#xff0c;但是不影响接口调用 解决&#xff1a; 1、将nacos版本切换为2.2.2&am…

ET实现游戏中聊天系统逻辑思路(服务端)

目录 一、准备工作 1.1 前言 1.2 完善聊天服务器 1.3 自定义聊天服消息 二、玩家登录聊天服 2.1 Gate网关与聊天服通讯 2.2 保存玩家实体映射实例ID 三、处理聊天逻辑 3.1 发送聊天消息的定义 3.2 定义聊天记录组件 3.3 编写发送聊天消息处理类 ET是一个游戏框架&…

Linux--shell脚本语言—/—终章

一、shell函数 1、shell函数定义格式 参数说明&#xff1a; 1、可以带function fun() 定义&#xff0c;也可以直接fun() 定义,不带任何参数。 2、参数返回&#xff0c;可以显示加&#xff1a;return 返回&#xff0c;如果不加&#xff0c;将以最后一条命令运行结果&#xff…

(20)SSM-MyBatis关系映射

MyBatis关联映射 概述 在实际开发的工程中&#xff0c;经常对出现多表操作&#xff0c;如果常见的根据某条数据的ID去检索数据&#xff08;根据用户查询订单信息&#xff09;&#xff0c;这个时候我们数据库设计的时候就需要使用外键进行关联&#xff0c;那么mybatis在操作这…

推荐4款2024年热门的win10 录屏软件。

如果只是偶尔需要简单地录制一下电脑屏幕&#xff0c;一般大家都会选免费且操作简单的软件&#xff1b;但如果是专业的视频制作&#xff0c;就需要功能强大、支持后期编辑的软件。而下面的这4款软件却能满足以上两种需求&#xff0c;并且能够兼容的系统也很多。 1、福昕专业录屏…

如何提升你的广告创意?

当你有一个好的产品时&#xff0c;你一定会想到用广告投放来推广它。但简单的广告投放是不足以帮助你建立起品牌知名度的。要从众多产品中脱颖而出&#xff0c;还需要独特又有效的广告创意。以下是尤里改为你总结的提升广告创意的办法&#xff0c;电子商务品牌可以着重了解下~ …

没有软件测试经验的计算机毕业生如何准备面试测试工程师这一职位?

古语云&#xff1a;“知己知彼&#xff0c;百战不殆”。 想应聘测试工程师&#xff0c;首先要知道企业需要什么样的测试工程师&#xff0c;需要具备哪些技术。想知道这点并不难&#xff0c;并且有捷径可走&#xff0c;直接去招聘网站中找答案&#xff0c;看各公司的招聘简章即…

opencascade TopoDS、TopoDS_Vertex、TopoDS_Edge、TopoDS_Wire、源码学习

前言 opencascade TopoDS转TopoDS_Vertex opencascade TopoDS转TopoDS_Edge opencascade TopoDS转TopoDS_Wire opencascade TopoDS转TopoDS_Face opencascade TopoDS转TopoDS_Shell opencascade TopoDS转TopoDS_Solid opencascade TopoDS转TopoDS_Compound 提供方法将 TopoDS_…

Pytorch损失函数-torch.nn.NLLLoss()

一、简介 1.1 nn.CrossEntropyLoss 交叉熵损失函数的定义如下&#xff1a; 就是我们预测的概率的对数与标签的乘积&#xff0c;当qk->1的时候&#xff0c;它的损失接近零。 1.2 nn.NLLLoss 官方文档中介绍称&#xff1a; nn.NLLLoss输入是一个对数概率向量和一个目标标…