HarmonyOS ArkUI 属性动画入门详解

news2024/9/28 13:22:05

HarmonyOS ArkUI 属性动画入门详解

  • 前言
  • 属性动画是什么?
    • 我们借助官方的话来说,
    • 我们自己简单归纳下
  • 参数解释
  • 举个例子
    • 旋转动画
  • 位移动画
  • 组合动画
  • 总结

前言

鸿蒙OS最近吹的很凶,赶紧卷一下。学习过程中发现很多人吐槽官方属性动画这一章比较敷衍,我第一遍也看的半懂不懂的,所以就有了这篇文章,在官方的介绍基础上补充了自己的理解

属性动画是什么?

我们借助官方的话来说,

属性动画,是最为基础的动画,其功能强大、使用场景多,应用范围较广。常用于如下场景中:

一、页面布局发生变化。例如添加、删除部分组件元素。
二、页面元素的可见性和位置发生变化。例如显示或者隐藏部分元素,或者将部分元素从一端移动到另外一端。
三、页面中图形图片元素动起来。例如使页面中的静态图片动起来。
简单来说,属性动画是组件的通用属性发生改变时而产生的属性渐变效果。如下图所示,其原理是,当组件的通用属性发生改变时,组件状态由初始状态逐渐变为结束状态的过程中,会创建多个连续的中间状态,逐帧播放后,就会形成属性渐变效果,从而形成动画。

在这里插入图片描述
属性动画的使用方式也非常简单,只需要给组件(包括基础组件和容器组件)添加animation属性,并设置好参数,如下代码所示:

Image($r('app.media.image1'))   
   .animation({   
      duration: 1000,    
      tempo: 1.0,    
      delay: 0,    
      curve: Curve.Linear,    
      playMode: PlayMode.Normal,    
      iterations: 1  
   })

别急哈,等你把上面这个代码贴上去,你就会发现上例代码并没有动画,这是因为

1、animation属性作用域。animation自身也是组件的一个属性,其作用域为animation之前。即产生属性动画的属性须在animation之前声明,其后声明的将不会产生属性动画。以示例中的五个图标动画为例,我们期望产生动画的属性为Image组件的width属性,故该属性width需在animation属性之前声明。如果将该属性width在animation之后声明,则不会产生动画效果。

2、产生属性动画的属性变化时需触发UI状态更新。在上面的示例中,因为缺少产生动画的属性,所以并不会有动画

3、产生属性动画的属性本身需满足一定的要求,并非任何属性都可以产生属性动画。目前支持的属性包括width、height、position、opacity、backgroundColor、scale、rotate、translate等

我们自己简单归纳下

属性动画 = 属性 + a n i m a t i o n (属性作用域) 属性动画 = 属性 + animation (属性作用域) 属性动画=属性+animation(属性作用域)

这个属性就是目前支持的width、height、position、opacity、backgroundColor、scale、rotate、translate等

参数解释

属性名称属性类型默认值描述
durationnumber1000动画时长,单位为毫秒,默认时长为1000毫秒。
temponumber1.0动画的播放速度,值越大动画播放越快,值越小播放越慢,为0时无动画效果。
curveCurveCurve.Linear动画变化曲线,默认曲线为线性。
delaynumber0延时播放时间,单位为毫秒,默认不延时播放。
iterationsnumber1播放次数,默认一次,设置为-1时表示无限次播放。
playModePlayModePlayMode.Normal设置动画播放模式,默认播放完成后重头开始播放。
onFinishfunction-动画播放结束时回调该函数。

其中变化曲线curve枚举值为:

名称描述
Linear表示动画从头到尾的速度都是相同的。
Ease表示动画以低速开始,然后加快,在结束前变慢,CubicBezier(0.25, 0.1, 0.25, 1.0)。
EaseIn表示动画以低速开始,CubicBezier(0.42, 0.0, 1.0, 1.0)。
EaseOut表示动画以低速结束,CubicBezier(0.0, 0.0, 0.58, 1.0)。
EaseInOut表示动画以低速开始和结束,CubicBezier(0.42, 0.0, 0.58, 1.0)。
FastOutSlowIn标准曲线,cubic-bezier(0.4, 0.0, 0.2, 1.0)。
LinearOutSlowIn减速曲线,cubic-bezier(0.0, 0.0, 0.2, 1.0)。
FastOutLinearIn加速曲线,cubic-bezier(0.4, 0.0, 1.0, 1.0)。
ExtremeDeceleration急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。
Sharp锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。
Rhythm节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。
Smooth平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。
Friction阻尼曲线,CubicBezier(0.2, 0.0, 0.2, 1.0)。

人话解释:相同时间,结果相同,不同的过程

播放模式playMode枚举值为:

名称描述
Normal动画按正常播放。
Reverse动画反向播放。
Alternate动画在奇数次(1、3、5…)正向播放,在偶数次(2、4、6…)反向播放。
AlternateReverse动画在奇数次(1、3、5…)反向播放,在偶数次(2、4、6…)正向播放。

注意onFinish回调函数与参数iterations有关。当参数iterations播放结束时,会调用onFinish函数来进行后续的业务处理。而当iterations设置为-1时,表示无限次播放,则onFinish回调函数不会被调用。

举个例子

旋转动画

@State rotateAngle : number = 0
...
  Text("旋转动画")

      Row(){
            Button("旋转动画开始",{type: ButtonType.Capsule,stateEffect:true})
              .onClick(()=>{
                this.rotateAngle =360
              })

            Image($r('app.media.loading'))
              .width(100)
              .height(100)
              .rotate({ x: 0, y: 0, z: 1, angle: this.rotateAngle })
              .animation({
                duration: 2000,
                tempo: 1.0,
                delay: 0,
                curve: Curve.Linear,
                playMode: PlayMode.Normal,
                iterations: -1
              })
      }
      .height("30%")
      .width("100%")
      .backgroundColor(Color.Green)

上例可以看到,添加了rotate旋转作用域,和animation作用域,并通过rotateAngle 状态的改变控制了动画的开始,效果如下
在这里插入图片描述

位移动画

  @State xState : number = 0
  @State yState : number = 0
...
 Text("位移动画")

      Row(){

            Text('HarmonyOS')
              .width(200)
              .height(100)
              .fontColor(Color.Blue)
              .fontSize(30)
              .fontStyle(FontStyle.Italic)
              .fontWeight(FontWeight.Bold)
              .fontFamily('Arial')
              .margin(100)
              .position({x: this.xState,y:this.yState})
              .animation({
                duration: 1000,
                tempo: 1.0,
                delay: 0,
                curve: Curve.Linear,
                playMode: PlayMode.Normal,
                iterations: 1,
                onFinish:()=>{
                  if ( this.xState == 0) {
                    this.xState =100
                    this.yState =100
                  }else {
                    this.xState =0
                    this.yState =0
                  }
                }
              })
      }
      .height("30%")
      .width("100%")
      .backgroundColor(Color.Yellow)

上例我们可以看到,通过设置position和animation实现了位移动画,并且在其到达指定路径的onFinish回调中重新设置了xState 和yState ,以达到一种另类的永久动画效果。运行效果如下
在这里插入图片描述

组合动画

并不是一次只能加一个属性,也可以多个一起加

  @State watermelonRotateAngle : number = 0
  @State width : number = 50
  @State height : number = 50
  ...


Text("组合动画")

      Row(){

        Button("组合动画开始",{type: ButtonType.Capsule,stateEffect:true})
          .onClick(()=>{
            this.watermelonRotateAngle =360
            this.width = 100
            this.height = 100
          })

        Image($r('app.media.watermelon'))
          .width(this.width)
          .height(this.height)
          .rotate({ x: 0, y: 0, z: 1, angle: this.watermelonRotateAngle })
          .animation({
            duration: 2000,
            tempo: 1.0,
            delay: 0,
            curve: Curve.Linear,
            playMode: PlayMode.Normal,
            iterations: -1
          })

      }
      .height("40%")
      .width("100%")
      .backgroundColor(Color.Orange)
  

上面我们有三个属性动画,分别是width ,height和 rotate,效果如下

在这里插入图片描述

总结

参考:HarmonyOS第一课
教程跟以前比来说丰富了很多,也比较系统。所以博主只会在比官方现在教程比较笼统或自己觉得理解比较晦涩的地方进行单篇输出,不会像Compose一样边学变更新了。如果对Compose有兴趣可以看看我的Jetpack Compose入门详解(实时更新)

吐槽一下:官方文档属性动画文档写的是真的敷衍,给人一种我都讲了你不懂是你的事情的感觉(当然,可能是我比较菜)

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

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

相关文章

【面试】一文讲清组合逻辑中的竞争与冒险

竞争的定义:组合逻辑电路中,输入信号的变化传输到电路的各级逻辑门,到达的时间有先后,也就是存在时差,称为竞争。 冒险的定义:当输入信号变化时,由于存在时差,在输出端产生错误&…

5G终端视频客服需求及实现方式

5G视频客服的适老化需求聚焦“远程辅助”和“触屏交互”两项功能。 需要UI、AP framework和Modem共同实现完成需求。 UI需要终端自行按需求开发实现。 芯片商提供AP framework层和modem的修改方案。 终端厂商要自行和CMCC客服端进行功能上的调试验证,完成功能认…

RTSP/Onvif视频服务器EasyNVR安防视频云服务平台出现崩溃并重启的情况解决方案

EasyNVR安防视频云服务平台的特点是基于RTSP/Onvif协议将前端设备统一接入,在平台进行转码、直播、处理及分发,在安防监控场景中,EasyNVR可实现实时监控、云端录像、云存储、告警、级联等视频能力,极大满足行业的视频监控需求。 有…

HBP人脑计划结果如何:欧洲投入6亿欧元利用计算机重建人脑?

为期十年的人脑计划将在九月份结束。《Nature》杂志审视了它的成就和动荡的过去。 来自人脑颞叶神经元回路的数字重建。来源:Nicolas Antille 人脑计划(Human Brain Project,HBP)历时长达10年,即将迎来圆满结束。这一庞…

薪火传承 | 天空卫士致敬原三线企业核工业部525厂老同志

上世纪60年代,几百万建设者开创了我国历史上一次规模空前的工业大迁移和工业大开发。创造出“艰苦创业、勇于创新、团结协作、无私奉献”的三线建设精神永为后世所敬仰和学习。 三线企业的前辈们用自己的青春和智慧为中国的科技事业作出了巨大的贡献。时光斗转&…

宠物赛道,用AI定制宠物头像搞钱项目教程

今天给大家介绍一个非常有趣,而粉丝价值又极高,用AI去定制宠物头像或合照的AI项目。 接触过宠物行业应该知道,获取1位铲屎官到私域,这类用户的价值是极高的,一个宠物粉,是连铲个屎都要花钱的,每…

排水管网水位监测方案助力城市“排忧解涝”

城市排水管网是城市地下生命线之一,事关城市安全、健康运行和高质量发展。然而由于排水管网内部自身的复杂性、多样性、隐蔽性等因素的存在,致使城市排水管网存在雨污混接、管网淤堵、入渗入流、运行负荷等现象,导致城市出现内涝、溢流污染等…

实力突出!安全狗云原生安全整体解决方案获优胜奖

近日,经过层层筛选,“2023年网络安全优秀创新成果大赛暨四川省‘熊猫杯’网络安全优秀作品大赛”得出获奖名单。 作为国内云原生安全领导厂商,安全狗旗下解决方案获优胜奖。 厦门服云信息科技有限公司(品牌名:安全狗&a…

创建web应用程序,React和Vue怎么选?

React和Vue都是创建web应用程序的绝佳选择。React得到了科技巨头和庞大的开源社区的支持,代码库可以很大程度地扩展,允许你创建企业级web应用程序。React拥有大量合格甚至优秀的开发人员粉丝,可以解决你在开发阶段可能遇到的任何问题。 毫无疑…

C语言:选择+编程(每日一练Day7)

目录 选择题: 题一: 题二: 题三: 题四: 题五: 编程题: 题一:图片整理 思路一: 思路二: 题二:寻找数组的中心下标 思路一&#xff1…

软考A计划-系统集成项目管理工程师-项目风险管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

csdn冷知识:如何在csdn里输入公式或矩阵

目录 1 输入公式 2 输入矩阵 3 如何输入复杂公式 4 如何修改,已经生成的公式 1 输入公式 进入编辑模式点击右边的菜单:公式然后进入公式编辑器,选择右边的 ... 可以选择大括号等,右边还有矩阵符号选择后你需要创建几行几列的…

Python“牵手”唯品会商品详情API接口运用场景及功能介绍,唯品会API接口申请指南

唯品会是一家专门做特卖的网站,成立于2008年。唯品会网站以比零售大幅优惠的折扣价,向中国消费者提供优质、受欢迎的品牌正品,商品囊括时装、护肤品、箱包、皮具、配饰、香水等2。唯品会在中国领创"名牌折扣限时抢购正品保障"的独特…

【VS_C++基础知识】

很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享VS_C的基础知识,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易会继续努力分享,一起进步! 你的点赞就…

三星申请新商标:未来将应用于智能戒指,作为XR头显延伸设备

三星最近向英国知识产权局提交了名为“Samsung Curio”的新商标,这预示着三星正积极扩展可穿戴设备生态。该商标被分类为“Class 9”,这表明它有可能被用于未来的智能戒指。 据报道,三星计划将智能戒指作为XR头显设备的延伸,与苹果…

Qt应用开发(基础篇)——进度条 QProgressBar

一、前言 QProgressBar类继承于QWidget,是一个提供了横向或者纵向进度条的小部件。 QProgressBar进度条一般用来显示用户某操作的进度,比如烧录、导入、导出、下发、上传、加载等这些需要耗时和分包的概念,让用户知道程序还在正常的执行中。 …

tomcat更改端口号和隐藏端口号

因为默认端口:8080不会自动隐藏,因此为了更显格调需要将其改为:80 进入tomcat的server文件 将其改为80,之后将tomcat重新启动即可 tomcat启动流程 [rootshang ~]# cd /usr/local/tomcat/apache-tomcat-8.5.92 [rootshang apache-tomcat-8.5.92]# cd b…

框架分析(4)-Spring

框架分析(4)-Spring 专栏介绍Spring核心特点控制反转(IoC)面向切面编程(AOP)组件化集成简化开发总结 优缺点优点高度可扩展控制反转(IoC)面向切面编程(AOP)集…

7、Spring_AOP

一、Spring AOP 简介 1.概述 对于spring来说,有三大组件,IOC,ID,AOP aop概述:AOP(Aspect Oriented Programming)面向切面编程。 作用:不改变原有代码设计的基础上实现功能增强 例子 传统打印日志 使用…

常见前端面试之VUE面试题汇总六

17. MVVM 的优缺点? 优点: 分离视图(View)和模型(Model),降低代码耦合,提⾼视图或者 逻辑的重⽤性: ⽐如视图(View)可以独⽴于 Model 变化和修改,⼀个 ViewModel 可以…