HarmonyOS开发实战( Beta5版)合理使用动画丢帧规范实践

news2024/9/21 10:46:24

本文列举了部分用于优化动画时延的正反案例,帮助开发者在遇到相似场景时进行优化,解决构建页面动画时遇到动画时延较长的问题。

减少动画丢帧

在播放动画或者生成动画时,画面产生停滞而导致帧率过低的现象,称为动画丢帧。

播放动画时,系统需要在一个刷新周期内完成动画变化曲线的计算,完成组件布局绘制等操作。建议使用系统提供的动画接口,只需设置曲线类型、终点位置、时长等信息,就能够满足常用的动画功能,减少UI主线程的负载。

反例:应用使用了自定义动画,动画曲线计算过程很容易引起UI线程高负载,易导致丢帧。

@Entry
@Component
struct AttrAnimationExample0 {
  @State widthSize: number = 200
  @State heightSize: number = 100
  @State flag: boolean = true

  computeSize() {
    let duration = 2000
    let period = 16
    let widthSizeEnd = 0
    let heightSizeEnd = 0
    if (this.flag) {
      widthSizeEnd = 100
      heightSizeEnd = 50
    } else {
      widthSizeEnd = 200
      heightSizeEnd = 100
    }
    let doTimes = duration / period
    let deltaHeight = (heightSizeEnd - this.heightSize) / doTimes
    let deltaWeight = (widthSizeEnd - this.widthSize) / doTimes
    for (let i = 1; i <= doTimes; i++) {
      let t = period * (i);
      setTimeout(() => {
        this.heightSize = this.heightSize + deltaHeight
        this.widthSize = this.widthSize + deltaWeight
      }, t)
    }
    this.flag = !this.flag
  }

  build() {
    Column() {
      Button('click me')
        .onClick(() => {
          let delay = 500
          setTimeout(() => { this.computeSize() }, delay)
        })
        .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff)
    }.width('100%').margin({ top: 5 })
  }
}

img

使用系统提供的属性动效API

建议:通过系统提供的属性动效API实现上述动效功能。

@Entry
@Component
struct AttrAnimationExample1 {
  @State widthSize: number = 200
  @State heightSize: number = 100
  @State flag: boolean = true

  build() {
    Column() {
      Button('click me')
        .onClick((event?: ClickEvent | undefined) => {
          if (this.flag) {
            this.widthSize = 100
            this.heightSize = 50
          } else {
            this.widthSize = 200
            this.heightSize = 100
          }
          this.flag = !this.flag
        })
        .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff)
        .animation({
          duration: 2000, // 动画时长
          curve: Curve.Linear, // 动画曲线
          delay: 500, // 动画延迟
          iterations: 1, // 播放次数
          playMode: PlayMode.Normal // 动画模式
        }) // 对Button组件的宽高属性进行动画配置
    }.width('100%').margin({ top: 5 })
  }
}

img

更详细的API文档请参考:属性动画。

使用系统提供的显式动效API

建议:通过系统提供的显式动效API实现上述动效功能。

@Entry
@Component
struct AnimateToExample2 {
  @State widthSize: number = 200;
  @State heightSize: number = 100;
  @State flag: boolean = true;

  build() {
    Column() {
      Button('click me')
        .onClick((event?: ClickEvent | undefined) => {
          if (this.flag) {
            animateTo({
              duration: 2000, // 动画时长
              curve: Curve.Linear, // 动画曲线
              delay: 500, // 动画延迟
              iterations: 1, // 播放次数
              playMode: PlayMode.Normal // 动画模式
            }, () => {
              this.widthSize = 100;
              this.heightSize = 50;
            })
          } else {
            animateTo({
              duration: 2000, // 动画时长
              curve: Curve.Linear, // 动画曲线
              delay: 500, // 动画延迟
              iterations: 1, // 播放次数
              playMode: PlayMode.Normal // 动画模式
            }, () => {
              this.widthSize = 200;
              this.heightSize = 100;
            })
          }
          this.flag = !this.flag;
        })
        .width(this.widthSize).height(this.heightSize).backgroundColor(0x317aff)
    }.width('100%').margin({ top: 5 })
  }
}

img

更详细的API文档请参考:显式动画。

优化效果

相比于自定义动画,使用系统提供的动效API可提高动画帧数,提高应用性能。

动画实现方式帧数(fps)
自定义动画60
属性动效API120
显式动效API120

合理设置隐式动画

Tabs组件在不为BottomTabBarStyle样式时,切换页面时默认加载300ms的隐式动画,如果开发场景不需要该动画效果,会因默认加载导致页面跳转完成时延变长,此时可手动设置animationDuration减少动画完成时延。下述正反示例分别为100ms和1000ms的动画时延:

反例:

@Entry
@Component
struct TabsExample {
  ...
  private controller: TabsController = new TabsController();

  build() {
    Column() {
      Tabs({ barPosition: BarPosition.Start, index: this.currentIndex, controller: this.controller }) {
        TabContent()
        TabContent()
        // ...
      }
      // ...
      // 设置Tabs页面跳转的动画时长为1000ms
      .animationDuration(1000)
    }
    .width('100%')
  }
}

img

正例:

@Entry
@Component
struct TabsExample {
  ...
  private controller: TabsController = new TabsController();

  build() {
    Column() {
      Tabs({ barPosition: BarPosition.Start, index: this.currentIndex, controller: this.controller }) {
        TabContent()
        TabContent()
        // ...
      }
      // ...
      // 设置Tabs页面跳转的动画时长为100ms
      .animationDuration(100)
    }
    .width('100%')
  }
}

img

优化效果

优化前 1000ms优化后 100ms

img

img

上述示例通过减少animationDuration数值,减少Tabs切换完成时延。当数值设置为0且TabBar不为BottomTabBarStyle样式时,隐式动效延时为默认的300ms。开发者可根据实际场景适当减少隐式动效时延,如果应用没有特殊的动效要求时,建议设置数值为1,减少阻塞主线程,提高应用性能。

更详细的API文档请参考:Tabs-animationduration。

合理设置动效时长

滚动类组件可使用fling方法按传入的初始速度进行惯性滚动,不合理的滚动速度设置可能导致动效时长过长,此时应通过加快滚动速度减少动效时长。下述正反示例通过改变List组件惯性滚动速度减少动效时长:

反例:

@Entry
@Component
struct ListExample {
  scrollerForList: Scroller = new Scroller();

  build() {
    Column() {
      Button('Fling100')
        .onClick(() => {
          // 设置当前滚动初始速度为100vp/s
          this.scrollerForList.fling(100);
        })
      List({ space: 20, initialIndex: 0, scroller: this.scrollerForList }) {
        // ...
      }
    }
  }
}

正例:

@Entry
@Component
struct ListExample {
  scrollerForList: Scroller = new Scroller();

  build() {
    Column() {
      Button('Fling100')
        .onClick(() => {
          // 设置当前滚动初始速度为10000vp/s
          this.scrollerForList.fling(10000);
        })
      List({ space: 20, initialIndex: 0, scroller: this.scrollerForList }) {
        // ...
      }
    }
  }
}

优化效果

100vp/s:

img

10000vp/s:

img

示例动效耗时(ms)
优化前392
优化后200

上述示例在提高滚动速度到10000vp/s后,相比100vp/s减少了200ms的动画时延。开发者可根据实际场景适当增加滚动速度,在不影响页面效果的情况下减少页面完成时延,提高应用性能。

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)文档用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:

GitCode - 全球开发者的开源社区,开源代码托管平台  希望这一份鸿蒙学习文档能够给大家带来帮助~


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

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

路线图适合人群:

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

2.视频学习教程+学习PDF文档

HarmonyOS Next 最新全套视频教程

  纯血版鸿蒙全套学习文档(面试、文档、全套视频等)       

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

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

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

相关文章

《Learning To Count Everything》CVPR2021

摘要 论文提出了一种新的方法来解决视觉计数问题&#xff0c;即在给定类别中仅有少量标注实例的情况下&#xff0c;对任何类别的对象进行计数。将计数问题视为一个少样本回归任务&#xff0c;并提出了一种新颖的方法&#xff0c;该方法通过查询图像和查询图像中的少量示例对象…

【Linux高级命令】2_查看日志命令(重点)

文章目录 一、查看日志文件1.1 日志文件1.2 查看日志信息&#xff1a;head1.3 查看日志信息&#xff1a; tail【重点】1.4 工作中的使用场景 二、查看操作系统信息 一、查看日志文件 1.1 日志文件 就是一个文本文件 里面记录了程序运行的信息 作用 通过最后几行信息&#xff…

JIT编译:Java性能加速的关键技术

JIT&#xff08;Just-In-Time&#xff09;编译是 Java 虚拟机&#xff08;JVM&#xff09;中一种重要的优化技术&#xff0c;用来在程序运行时动态地将字节码编译成机器码&#xff08;也就是平台特定的原生代码&#xff09;&#xff0c;从而提高程序的执行效率。 以下是 JIT 编…

领衔登榜!凯伦股份入选2024年度市级工业设计中心名单

近日&#xff0c;由苏州市工信局认定的2024年度市级工业设计中心名单正式完成了公示&#xff0c;江苏凯伦建材股份有限公司领衔登榜。 据了解&#xff0c;工业设计是指以工业产品为主要对象&#xff0c;综合运用科技手段和工学、美学、心理学、经济学等知识&#xff0c;对产品的…

2024.9.5 作业

注释QT基础代码 QT core gui#如果Qt版本大于4&#xff0c;则添加widgets模块 greaterThan(QT_MAJOR_VERSION, 4): QT widgets#启用C11编译标准 CONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been mark…

【机器学习】自然语言处理中的Transformer模型:深度解析与前沿发展

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言Transformer模型概述编码器&#xff08;Encoder&#xff09;与解码器&#xff08;Decoder&#xff09; 自注意力机制与多头注意力自注意力机制多头注意力机制 位置编码与模型优势位置编码模型优势…

MySQL数据库的基本概念(day23)

1 学习目标 了解数据库相关的概念了解并掌握MySQL产品的安装了解并掌握MySQL服务的使用重点掌握MySQL语法规范重点掌握数据库的管理语法重点掌握数据表的管理语法 2 数据库概述 2.1 数据库相关概念 2.1.1 什么是数据库 数据库的英文为DataBase&#xff0c;简称DB&#xff…

linux基础IO——动静态库——实现与应用学习、原理深入详解

前言&#xff1a;本节内容是基础IO部分的动静态库。 本节内容&#xff0c; 我们将站在实现者的角度上自己实现一下动静态库&#xff0c; 并且会站在使用者的角度上使用我们自己实现的库。过程中牵扯到许多新的知识&#xff0c; 最后我们会重谈一下我们的进程。 理解一下有了动静…

如何开发潜在客户

本文将介绍发掘潜在客户的关键步骤&#xff0c;其中利用企搜客大数据拓客&#xff0c;是相对高效的工具模式&#xff0c;快速开发潜在客户拓展业务。 一、潜在客户开发的重要性 潜在客户开发是企业营销中至关重要的一环。通过精准的目标客户定位和有效的开发策略&#xff0c;企…

J.U.C Review - CopyOnWrite容器

文章目录 什么是CopyOnWrite容器CopyOnWriteArrayList优点缺点源码示例 仿写&#xff1a;CopyOnWriteMap的实现注意事项 什么是CopyOnWrite容器 CopyOnWrite容器是一种实现了写时复制&#xff08;Copy-On-Write&#xff0c;COW&#xff09;机制的并发容器。在并发场景中&#…

2024年高教社杯数学建模国赛E题解题思路

E 题 交通流量管控 问题背景 随着城市化进程的加快、机动车的快速普及&#xff0c;以及人们活动范围的不断扩大&#xff0c;城市道路交通拥堵问题日渐严重&#xff0c;即使在一些非中心城市&#xff0c;道路交通拥堵问题也成为影响地方经济发展和百姓幸福感的一个“痛点”&a…

SpringDataJPA系列(6)Entiry注解使用

SpringDataJPA系列(6)Entiry注解使用 JPA协议规定 实体是直接进行数据库持久化操作的领域对象&#xff0c;必须通过 Entity 注解进行标示实体必须有一个 public 或者 protected 的无参数构造方法实体里面必须要有一个主键&#xff0c;主键标示的字段可以是单个字段&#xff0…

《机器学习》—— PCA降维

文章目录 一、PCA降维简单介绍二、python中实现PCA降维函数的介绍三、代码实现四、PCA降维的优缺点 一、PCA降维简单介绍 PCA&#xff08;主成分分析&#xff0c;Principal Component Analysis&#xff09;是一种常用的数据降维技术。它通过线性变换将原始数据转换到新的坐标系…

持久化分析

目录 介绍步骤WMI持久化分析注册表映像劫持IFEO持久化 介绍 1、WMI 的全称是 Windows Management Instrumentation&#xff0c;即 Windows 管理规范&#xff0c;在 Windows 操作系统中&#xff0c;随着 WMI 技术的引入并在之后随着时间的推移而过时&#xff0c;它作为一项功能…

Linux【6】系统

时间日期 date日期 cal——当月日历 cal -y 今年的日历 磁盘占用df du df 剩余空间 du 目录下的文件大小 进程ps ps aux a——其他用户 u——详细状态 x——没有控制终端 只看CPU占用高的进程top kill pid代号 ——杀死程序 通配符&#xff08;简略版&#xff09; …

每日OJ_牛客_解读密码(简单模拟)

目录 牛客_解读密码&#xff08;简单模拟&#xff09; 解析代码 牛客_解读密码&#xff08;简单模拟&#xff09; 解读密码__牛客网 解析代码 题目意思&#xff1a;给定字符串中包含其他符合一级数字&#xff0c;将字符串中数字解析出来。 解析步骤&#xff1a; 题目明确…

LabVIEW声发射数据采集系统开发

声发射&#xff08;Acoustic Emission, AE&#xff09;技术是材料检测中的一种无损检测方法&#xff0c;广泛用于结构健康监测。本文将介绍一个基于LabVIEW的声发射数据采集系统的真实案例&#xff0c;涵盖工作原理、开发流程、硬件选型、注意事项及难点。该系统通过LabVIEW平台…

LlamaIndex 使用 RouterOutputAgentWorkflow

LlamaIndex 中提供了一个 RouterOutputAgentWorkflow 功能&#xff0c;可以集成多个 QueryTool&#xff0c;根据用户的输入判断使用那个 QueryEngine&#xff0c;在做查询的时候&#xff0c;可以从不同的数据源进行查询&#xff0c;例如确定的数据从数据库查询&#xff0c;如果…

2024年装电脑,就认准这几个型号,能避坑!

前言 小伙伴是否都会觉得&#xff0c;自己又不懂电脑&#xff0c;跑电脑城去装机又怕被坑。这时候只能找熟人给装机&#xff0c;至少……熟人应该不会坑自己吧&#xff1f;&#xff01; 这不&#xff0c;小白电脑技术的抖音评论区上就有这么一条评论&#xff1a; 这哥们找一熟…

最新HTML5中的视频和音频讲解

第6章 HTML5中的视频和音频 H5新增video,audio,播放视频和音频&#xff0c;统称为多媒体元素。 6.1 多媒体元素基本属性 video用于电影文件和其他视频流的播放。 audio用于音乐文件和其他音频流的播放。 video的属性 src&#xff1a;文件路径&#xff0c;本地或者网络上。…