HarmonyOS ArkUI 属性动画入门详解

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 =100this.yState =100}else {this.xState =0this.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 =360this.width = 100this.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.rhkb.cn/news/104540.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS 盒子模型

前言 盒子模型-组成 CSS盒子模型是一种用来描述元素在页面布局中占据空间的模型。它将每个元素看作由内容区域、内边距、边框和外边距组成的一个矩形框。 盒子模型的组成部分包括: 内容区域(Content):显示元素的实际内容&#xf…

商城的TPS与并发用户数是如何换算的?

商城的TPS与并发用户数的换算关系可以通过以下公式计算: TPS 并发用户数 / 平均事务响应时间 其中,平均事务响应时间是指系统处理一个事务所需的平均时间。 下面是商城性能测试的一些用例示例: 用户登录: 目标:测…

Docker的革命:容器技术如何重塑软件部署之路

引言 在过去的几年中,容器技术已经从一个小众的概念发展成为软件开发和部署的主流方法。Docker,作为这一变革的先驱,已经深深地影响了我们如何构建、部署和运行应用程序。本文将探讨容器技术的起源,Docker如何崛起并改变了软件部…

centos7安装MySQL8

Centos7安装MySQL8 MySQL版本:8.0.34 1.安装前准备 (1)查看是否安装mariadb [rootkb135 ~]# rpm -qa|grep mariadb (2)卸载mariadb并检查是否卸干净 [rootkb135 ~]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x8…

vue 简单实验 v-on html事件绑定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"event-handling"><p>{{ message }}</p><button v-on:click"reverseMessage">反转 Message</but…

Selenium环境+元素定位大法

selenium 与 webdriver Selenium 是一个用于 Web 测试的工具&#xff0c;测试运行在浏览器中&#xff0c;就像真正的用户在手工操作一样。支持所有主流浏览器 WebDriver 就是对浏览器提供的原生API进行封装&#xff0c;使其成为一套更加面向对象的Selenium WebDriver API。 使…

限制立方样条(RCS)中的P for overall和P for nonlinear的计算

最近不少人私信我&#xff0c;说有些SCI文章报了两个P值一个是P for overall,一个是P for nonlinear,就像下图这样&#xff0c;问我P for overall怎么计算。 P for overall我也不清楚是什么&#xff0c;有些博主说这个是总效应的P值&#xff0c;但是我没有找到相关出处。但是怎…

CnetSDK .NET OCR SDK Crack

CnetSDK .NET OCR SDK Crack CnetSDK.NET OCR库SDK是一款高度准确的.NET OCR扫描仪软件&#xff0c;用于使用手写、文本和其他符号等图像进行字符识别。它是一款.NET OCR库软件&#xff0c;使用Tesseract OCR引擎技术&#xff0c;可将字符识别准确率提高99%。通过将此.NET OCR扫…

CodeSite for .NET Crack

CodeSite for .NET Crack CodeSite for.NET与Visual Studio集成&#xff0c;通过实时查看器日志记录系统提供对代码执行的更深入了解&#xff0c;该系统有助于在本地或远程执行代码时快速查找问题。超越传统的断点调试&#xff0c;在应用程序继续运行时记录应用程序的执行&…

Java基础之IO流File类创建及删除

1.File类概述及构造方法 2.File类创建功能 文件创建成功&#xff01; 如果文件不存在&#xff0c;就创建文件&#xff0c;并返回true 如果文件存在&#xff0c;就不创建文件&#xff0c;并返回false 如果文件夹不存在&#xff0c;就创建文件夹&#xff0c;并返回true 如果文件…

python 开发环境(PyCharm)搭建指南

Python 的下载并安装 参考&#xff1a;Python基础教程——搭建Python编程环境 下载 Python Python 下载地址&#xff1a;官网 &#xff08;1&#xff09;点击【Downloads】>>>点击【Windows】>>>点击【Python 3.x.x】下载最新版 Python&#xff1b; Pyt…

【VS Code插件开发】消息通信(四)

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域优质作者、阿里云专家博主&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4e2; 资料领取&#xff1a;前端…

Sim/circuit10

通过观察可知&#xff0c;在a、b同时为0或1时&#xff0c;state的值改变 state的值可以改变q的输出&#xff0c;1为ab的同或&#xff0c;0为异或 利用assign q进行输出 module top_module (input clk,input a,input b,output q,output state );always(posedge clk)if(a&…

国标GB2818视频平台EasyGBS国标平台与车机设备连接显示未连接成功的问题解决方法

EasyGBS平台可提供流媒体接入、处理、转发等服务&#xff0c;支持内网、公网的监控设备通过国标GB/T28181协议进行视频监控直播。平台兼容性强&#xff0c;只要设备支持国标GB28181协议&#xff0c;均能快速接入EasyGBS&#xff0c;实现视频的监控直播、视频录像、语音对讲、云…

一次hard parse处理过程

文章目录 1.问题描叙2. AWR报告2.1 load profile2.2 Instance Efficiency Percentages(Target 100%)2.3 Time Model Statistics2.4 Instance Activity Stats2.5 Top 5 Timed Events2.6 查询hard parse 3. 解决方案&#xff1a;3.1.修改程式&#xff0c;使用绑定变量3.2.使用cur…

机器人远程控制软件设计

机器人远程控制软件设计 That’s all.

Vue3+Pinia+Koa+Three.js 全栈电商项目总结复盘

前言 前几天一个朋友去义乌旅游&#xff0c;带回来很多小商品&#xff0c;就是一整个物美价廉&#xff0c;但是为什么线下购物和网购有的时候差别这么大&#xff08;网购经常要退换货啊&#x1f62d;&#x1f62d;&#x1f62d;&#xff09;&#xff0c;为此我萌生了一个想法&…

什么是确认测试报告?确认测试报告的用途和周期?

确认测试又称有效性测试&#xff0c;其任务是验证软件的功能和性能及其他特性是否与用户的要求一致。确认测试需要提供的资料包括&#xff1a; 软件需求规格说明书&#xff1a;列出了软件的功能和性能要求&#xff0c;是确认测试的依据。 确认测试计划&#xff1a;制定了确认…

分布式微服务架构下网络通信的底层实现原理

在分布式架构中&#xff0c;网络通信是底层基础&#xff0c;没有网络&#xff0c;也就没有所谓的分布式架构。只有通过网络才能使得一大片机器互相协作&#xff0c;共同完成一件事情。 同样&#xff0c;在大规模的系统架构中&#xff0c;应用吞吐量上不去、网络存在通信延迟、我…

Java 四种访问控制权限

1.背景&#xff1a; 针对java的类成员访问控制权限理解 2.Java有四种访问控制权限&#xff1a; private&#xff0c;protected&#xff0c;public&#xff0c;default 他们的具体访问权限都是什么呢&#xff1f;用例子来分析一下&#xff1a; 这里要分几个情景&#xff1a;内…