0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙开发之发动画篇

王程 来源:jf_75796907 作者:jf_75796907 2024-02-01 15:25 次阅读

动画的原理是在一个时间段内,多次改变UI外观,由于人眼会产生视觉暂留,所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧,对应一次屏幕刷新,而决定动画流畅度的一个重要指标就是帧率FPS(Frame Per Second),即每秒的动画帧数,帧率越高则动画就会越流畅。

ArkUI中,产生动画的方式是改变属性值且指定动画参数。动画参数包含了如动画时长、变化规律(即曲线)等参数。当属性值发生变化后,按照动画参数,从原来的状态过渡到新的状态,即形成一个动画。

ArkUI提供的动画能力按照页面的分类方式,可分为页面内的动画和页面间的动画。如下图所示,页面内的动画指在一个页面内即可发生的动画,页面间的动画指两个页面跳转时才会发生的动画。

wKgZomW7RvqAXcOyAAFprGg9jqY409.png

图1 按照页面分类的动画

wKgaomW7R3KAYQ7FAAA3OIfX5UU220.png

如果按照基础能力分,可分为属性动画、显式动画、转场动画三部分。如下图所示。

wKgZomW7R0OAaNHiAAFciaKtSJM294.png

图2 按照基础能力分类的动画

wKgZomW7R3KAXS-1AAAusHLGs1U740.png

使用显式动画产生布局更新动画

显式动画的接口为:

animateTo(value: AnimateParam, event: () => void): void

第一个参数指定动画参数,第二个参数为动画的闭包函数。

以下是使用显式动画产生布局更新动画的示例。示例中,当Column组件的alignItems属性改变后,其子组件的布局位置结果发生变化。只要该属性是在animateTo的闭包函数中修改的,那么由其引起的所有变化都会按照animateTo的动画参数执行动画过渡到终点值。

@Entry @Component struct LayoutChange { // 用于控制Column的alignItems属性 @State itemAlign: HorizontalAlign = HorizontalAlign.Start; allAlign: HorizontalAlign[] = [HorizontalAlign.Start, HorizontalAlign.Center, HorizontalAlign.End]; alignIndex: number = 0; build() { Column() { Column({ space: 10 }) { Button("1").width(100).height(50) Button("2").width(100).height(50) Button("3").width(100).height(50) } .margin(20) .alignItems(this.itemAlign) .borderWidth(2) .width("90%") .height(200) Button("click").onClick(() => { // 动画时长为1000ms,曲线为EaseInOut animateTo({ duration: 1000, curve: Curve.EaseInOut }, () => { this.alignIndex = (this.alignIndex + 1) % this.allAlign.length; // 在闭包函数中修改this.itemAlign参数,使Column容器内部孩子的布局方式变化,使用动画过渡到新位置 this.itemAlign = this.allAlign[this.alignIndex]; }); }) } .width("100%") .height("100%") } }

除直接改变布局方式外,也可直接修改组件的宽、高、位置。

@Entry @Component struct LayoutChange2 { @State myWidth: number = 100; @State myHeight: number = 50; // 标志位,true和false分别对应一组myWidth、myHeight值 @State flag: boolean = false; build() { Column({ space: 10 }) { Button("text") .type(ButtonType.Normal) .width(this.myWidth) .height(this.myHeight) .margin(20) Button("area: click me") .fontSize(12) .margin(20) .onClick(() => { animateTo({ duration: 1000, curve: Curve.Ease }, () => { // 动画闭包中根据标志位改变控制第一个Button宽高的状态变量,使第一个Button做宽高动画 if (this.flag) { this.myWidth = 100; this.myHeight = 50; } else { this.myWidth = 200; this.myHeight = 100; } this.flag = !this.flag; }); }) } .width("100%") .height("100%") } }

另一种方式是给第二个Button添加布局约束,如position的位置约束,使其位置不被第一个Button的宽高影响。核心代码如下:

Column({ space: 10 }) { Button("text") .type(ButtonType.Normal) .width(this.myWidth) .height(this.myHeight) .margin(20) Button("area: click me") .fontSize(12) // 配置position属性固定,使自己的布局位置不被第一个Button的宽高影响 .position({ x: "30%", y: 200 }) .onClick(() => { animateTo({ duration: 1000, curve: Curve.Ease }, () => { // 动画闭包中根据标志位改变控制第一个Button宽高的状态变量,使第一个Button做宽高动画 if (this.flag) { this.myWidth = 100; this.myHeight = 50; } else { this.myWidth = 200; this.myHeight = 100; } this.flag = !this.flag; }); }) } .width("100%") .height("100%")

使用属性动画产生布局更新动画

显式动画把要执行动画的属性的修改放在闭包函数中触发动画,而属性动画则无需使用闭包,把animation属性加在要做属性动画的组件的属性后即可。

属性动画的接口为:

animation(value: AnimateParam)

其入参为动画参数。想要组件随某个属性值的变化而产生动画,此属性需要加在animation属性之前。有的属性变化不希望通过animation产生属性动画,可以放在animation之后。上面显式动画的示例很容易改为用属性动画实现。例如:

@Entry @Component struct LayoutChange2 { @State myWidth: number = 100; @State myHeight: number = 50; @State flag: boolean = false; @State myColor: Color = Color.Blue; build() { Column({ space: 10 }) { Button("text") .type(ButtonType.Normal) .width(this.myWidth) .height(this.myHeight) // animation只对其上面的type、width、height属性生效,时长为1000ms,曲线为Ease .animation({ duration: 1000, curve: Curve.Ease }) // animation对下面的backgroundColor、margin属性不生效 .backgroundColor(this.myColor) .margin(20) Button("area: click me") .fontSize(12) .onClick(() => { // 改变属性值,配置了属性动画的属性会进行动画过渡 if (this.flag) { this.myWidth = 100; this.myHeight = 50; this.myColor = Color.Blue; } else { this.myWidth = 200; this.myHeight = 100; this.myColor = Color.Pink; } this.flag = !this.flag; }) } } }

上述示例中,第一个button上的animation属性,只对写在animation之前的type、width、height属性生效,而对写在animation之后的backgroundColor、margin属性无效。运行结果是width、height属性会按照animation的动画参数执行动画,而backgroundColor会直接跳变,不会产生动画

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    56

    文章

    2262

    浏览量

    42437
收藏 人收藏

    评论

    相关推荐

    鸿蒙OpenHarmony南向/北向快速开发教程-迅为RK3568开发

    4.1学习之旅了吗?快来加入我们,一起探索 鸿蒙4.1系统的无限魅力吧! 【北京迅为】OpenHarmony学习 开发系列教程(第1期 北向基础 一) P0_先导课 P1_OpenHarmony系统概述
    发表于07-23 10:44

    HarmonyOS开发案例:【转场动画

    在本教程中,我们将会通过一个简单的样例,学习如何基于ArkTS的声明式 开发范式 开发转场 动画。其中包含页面间转场、组件内转场以及共享元素转场。
    的头像 发表于05-06 15:42 756次阅读
    HarmonyOS<b class='flag-5'>开发</b>案例:【转场<b class='flag-5'>动画</b>】

    OpenHarmony实战开发-如何实现动画

    (this.animation); } } 说明: 在调用该函数时需传入一个具有标识id的参数。 最后 **如果大家觉得这篇内容对学习 鸿蒙 开发有帮助,我想邀请大家帮我三个小忙: 点赞,转发,有
    发表于05-06 14:11

    OpenHarmony实战开发-如何实现组件动画

    ArkUI为组件提供了通用的属性 动画和转场 动画能力的同时,还为一些组件提供了默认的 动画效果。例如,List的滑动动效,Button的点击动效,是组件自带的默认 动画效果。在组件默认
    的头像 发表于04-28 15:49 390次阅读
    OpenHarmony实战<b class='flag-5'>开发</b>-如何实现组件<b class='flag-5'>动画</b>。

    HarmonyOS开发案例:【动画

    使用 动画样式,实现几种常见 动画效果:平移、旋转、缩放以及透明度变化。
    的头像 发表于04-25 15:13 274次阅读
    HarmonyOS<b class='flag-5'>开发</b>案例:【<b class='flag-5'>动画</b>】

    鸿蒙NEXT南向开发案例:【智能台灯】

    鸿蒙南向 开发 智能台灯案例
    的头像 发表于04-03 18:00 728次阅读
    <b class='flag-5'>鸿蒙</b>NEXT南向<b class='flag-5'>开发</b>案例:【智能台灯】

    使用 Taro开发鸿蒙原生应用 —— 快速上手,鸿蒙应用开发指南

    鸿蒙原生应用。 在 《使用 Taro 开发 鸿蒙原生应用》 系列文章中,我们已经介绍了 鸿蒙的基本概念 和 Taro 适配 鸿蒙的原理。本文作
    的头像 发表于02-02 16:09 643次阅读
    使用 Taro <b class='flag-5'>开发</b><b class='flag-5'>鸿蒙</b>原生应用 —— 快速上手,<b class='flag-5'>鸿蒙</b>应用<b class='flag-5'>开发</b>指南

    鸿蒙开发教程

    去年8 月份华为发布会上,华为发布了HarmonyOS NEXT预览版,宣布不再兼容安卓应用。大家期待的纯血 鸿蒙终于要来临了,next 预览版本现在已经开放申请渠道了,Next 开发者预览版本目前只
    的头像 发表于01-31 17:11 544次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>教程

    鸿蒙开发用什么语言?

    两种 开发方向 我们常说 鸿蒙 开发,但是其实 鸿蒙 开发分为两个方向: 一个是系统级别的 开发,比如驱动,
    的头像 发表于01-30 16:12 1181次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>用什么语言?

    鸿蒙开发【设备开发基础知识】

    鸿蒙 开发基础知识讲解
    的头像 发表于01-29 18:44 704次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>【设备<b class='flag-5'>开发</b>基础知识】

    现在加入鸿蒙开发咋样

    现在加入 鸿蒙 开发咋样? 各位前辈, 现在加入 鸿蒙 开发还有前景吗?
    发表于01-29 18:07

    鸿蒙开发ArkTS基础知识

    一、ArkTS简介 ArkTS是HarmonyOS优选的主力应用 开发语言。它在TypeScript(简称TS)的基础上,匹配了 鸿蒙的ArkUI框架,扩展了声明式UI、状态管理等相应的能力,让 开发者以
    的头像 发表于01-24 16:44 1631次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b><b class='flag-5'>之</b>ArkTS基础知识

    鸿蒙ArkUI开发-Tabs组件的使用

    鸿蒙ArkUI 开发-Tabs组件的使用
    的头像 发表于01-19 16:01 1248次阅读
    <b class='flag-5'>鸿蒙</b>ArkUI<b class='flag-5'>开发</b>-Tabs组件的使用

    京东与华为鸿蒙合作 京东启动鸿蒙原生应用开发

     1月10日,华为和京东宣布正式合作,共同推动 鸿蒙原生应用的 开发,进一步完善 鸿蒙生态系统。
    的头像 发表于01-11 16:22 734次阅读

    华为鸿蒙系统

    华为 鸿蒙系统(HUAWEI Harmony OS),是华为公司在2019年8月9日于东莞举行的华为 开发者大会(HDC.2019)上正式发布的操作系统。 华为 鸿蒙系统是一款全新的面向全场景的分布式
    发表于11-02 19:39