鸿蒙进阶篇-属性动画-animateTo转场动画

大家好啊,这里是鸿蒙开天组,今天我们来学习属性动画-animateTo&转场动画,咱们先来学习属性动画-animateTo

属性动画-animateTo

属性动画 animation是作为属性使用,而animateTo显示动画是一个系统的内置函数,可以直接调用。功能上和 animation一致,适合于给多个元素应用同一套动画的场景

核心用法

和 animation 的核心用法步骤类似,第三步的语法需要调整

  1. 声明相关状态变量
  2. 将状态变量设置到相关可动画属性接口
  3. 通过属性动画接口开启属性动画(在属性动画上面的属性会应用动画)
  4. 通过状态变量改变UI界面
// 参数 1 动画选项 和 animation 相同
// 参数 2 箭头函数,状态变量的修改写在里面
animateTo({}, () => {// 第 4 步写到这里
})

来试一下

  1. 基于基础模版给页面中的尺寸添加旋转动画
  2. 思考如果用 animation 需要如何编码?

这里给出基础模板

@Entry
@Component
struct Page06_animateTo {// 1. 声明相关状态变量@State rotateAngle: number = 0build() {Column() {// 4个齿轮Flex({ wrap: FlexWrap.Wrap }) {Image($r('app.media.ic_gear1')).width(150)// 2. 将状态变量设置到相关可动画属性接口.rotate({ angle: this.rotateAngle })Image($r('app.media.ic_gear2')).width(150)// 2. 将状态变量设置到相关可动画属性接口.rotate({ angle: this.rotateAngle })Image($r('app.media.ic_gear3')).width(150)// 2. 将状态变量设置到相关可动画属性接口.rotate({ angle: this.rotateAngle })Image($r('app.media.ic_gear4')).width(150)// 2. 将状态变量设置到相关可动画属性接口.rotate({ angle: this.rotateAngle })}Button('点击旋转齿轮').onClick(() => {})}.width('100%').height('100%').backgroundColor(Color.Orange)}
}

tips:

绝大多数情况下 animation 和 animateTo可以互相替代,当多个元素应用同一个动画时,用 animateTo 会更为适合

来揭晓参考答案吧~

@Entry
@Component
struct Page06_animateTo {// 1. 声明相关状态变量@State rotateAngle: number = 0build() {Column() {// 4个齿轮Flex({ wrap: FlexWrap.Wrap }) {Image($r('app.media.ic_gear1')).width(150)// 2. 将状态变量设置到相关可动画属性接口.rotate({ angle: this.rotateAngle })Image($r('app.media.ic_gear2')).width(150)// 2. 将状态变量设置到相关可动画属性接口.rotate({ angle: this.rotateAngle })Image($r('app.media.ic_gear3')).width(150)// 2. 将状态变量设置到相关可动画属性接口.rotate({ angle: this.rotateAngle })Image($r('app.media.ic_gear4')).width(150)// 2. 将状态变量设置到相关可动画属性接口.rotate({ angle: this.rotateAngle })}Button('点击旋转齿轮').onClick(() => {// 3. 通过属性动画接口开启属性动画(在属性动画上面的属性会应用动画)animateTo({ iterations: -1, curve: Curve.Linear }, () => {// 4. 通过状态变量改变UI界面this.rotateAngle = 360})})}.width('100%').height('100%').backgroundColor(Color.Orange)}
}

案例-折扣信息

还是之前的那个折扣信息案例,咱们通过 animateTo 来实现一次,来看看是否可以用 animateTo 一样的效果

需求:

  1. 将原模版中的 animation 替换为 animateTo

核心步骤:

  1. 将 animation 设置的动画属性,通过 animateTo 设置
  2. 调整状态变量的代码写到 animateTo 的回调函数中即可

基础代码前面的文章中已经给出,这里直接提供实现后的代码

@Entry
@Component
struct Page07_animateToDemo {// 1. 声明相关状态变量@State scaleX: number = 1@State scaleY: number = 1build() {Column({ space: 50 }) {Text('全场低至一分购').fontSize(30).fontWeight(900).fontColor(Color.Red).backgroundColor('#e8b66d').padding(10).borderRadius(20)// 2.将状态变量设置到相关可动画属性接口.scale({x: this.scaleX,y: this.scaleY}).onAppear(() => {// 3. 通过属性动画接口开启属性动画animateTo({duration: 1000,curve: Curve.EaseInOut,playMode: PlayMode.Alternate,iterations: -1}, () => {// 4.通过状态变量改变UI界面this.scaleX = 1.3this.scaleY = 1.3})})}.width('100%').height('100%').padding(20)}@StylesfullSize() {.width('100%').height('100%')}
}

转场动画

转场动画是指对将要出现或消失的组件做动画,对始终出现的组件做动画应使用属性动画。

转场动画主要有如下分类:

  1. 出现/消失转场
  2. 导航转场(和路由相关-路由阶段讲解)
  3. 模态转场(全模态、半模态弹框,还有一些其他的弹出菜单-链接)
  4. 共享元素转场(和路由相关-路由阶段讲解)

出现消失转场-核心用法

比如点击关闭广告,添加或者删除元素。核心就是元素需要出现或者消失,都可以使用转场动画来添加过渡效果

核心步骤:

  1. 创建TransitionEffect
  2. 将转场效果通过transition接口设置到组件
  3. 新增或者删除组件触发转场
@State isPresent: boolean = true;
...
if (this.isPresent) {Text('test').transition(effect)
}
...
// 控制新增或者删除组件
// 方式一:将控制变量放到animateTo闭包内,未通过animation接口定义动画参数的TransitionEffect将跟随animateTo的动画参数
animateTo({ curve: curves.springMotion() }, () => {this.isPresent = false;
})// 方式二:直接控制删除或者新增组件,动画参数由TransitionEffect的animation接口配置
this.isPresent = false;

出现消失转场-转场效果

转场效果可以通过下列语法随意进行设置,支持通过点语法链式调用

// 设置多个效果 出现和消失均有转场
effect: object = TransitionEffect.OPACITY.animation({}).combine(TransitionEffect.scale({ x: 0, y: 0 }))// 组合 缩放效果.combine(TransitionEffect.rotate({ angle: 90 })) // 组合 旋转效果.combine(TransitionEffect.move(TransitionEdge.END)) // 组合 移动效果// 出现没有转场
// 消失透明度转场
effect2: object = TransitionEffect.asymmetric(TransitionEffect.IDENTITY, // 出现转场TransitionEffect.OPACITY.animation({ // 消失转场duration: 300}))

静态方法:

接口名称

参数类型

是否静态函数

参数描述

opacity

number

设置组件转场时的透明度效果,为插入时起点和删除时终点的值。
取值范围: [0, 1]

translate

TranslateOptions

设置组件转场时的平移效果,为插入时起点和删除时终点的值。

scale

ScaleOptions

设置组件转场时的缩放效果,为插入时起点和删除时终点的值。

rotate

RotateOptions

设置组件转场时的旋转效果,为插入时起点和删除时终点的值。

move

TransitionEdge

指定组件转场时从屏幕边缘滑入和滑出的效果,本质为平移效果,为插入时起点和删除时终点的值。
从API version 10开始,该接口支持在ArkTS卡片中使用。

asymmetric

appear: TransitionEffect

,
disappear: TransitionEffect

指定非对称的转场效果。
第一个参数指定出现的转场效果,第二个参数指定消失的转场效果。
如不通过asymmetric函数构造TransitionEffect,则表明该效果在组件出现和消失时均生效。

combine

TransitionEffect

对TransitionEffect进行链式组合,以形成包含多种转场效果的TransitionEffect。

animation

AnimateParam

指定该TransitionEffect的动画参数。
该参数只用来指定动画参数,其入参AnimateParam的onFinish回调不生效。

静态成员:

静态成员名称

参数描述

IDENTITY

禁用转场效果。

OPACITY

指定透明度为0的转场效果。即相当于TransitionEffect.opacity(0)

SLIDE

指定出现时从左侧滑入、消失时从右侧滑出的转场效果。即相当于TransitionEffect.asymmetric(TransitionEffect.move(TransitionEdge.START), TransitionEffect.move(TransitionEdge.END))

SLIDE_SWITCH

指定出现时从右先缩小再放大侧滑入、消失时从左侧先缩小再放大滑出的转场效果。动画时长600ms,指定动画曲线曲线cubicBezierCurve(0.24f, 0.0f, 0.50f, 1.0f),最小缩放比例为0.8。

如果要组合多个动画效果,可以用如下的方式进行设置,之所以可以一路点下去,是因为这些设置动画的语法,设置之后返回的都是 TransitionEffect,所以继续链式调用

参考代码

@Entry
@Component
struct Page09_transitionEffect {@State isShow: boolean = false//  1. 定义转场效果effect: object = TransitionEffect.OPACITY.animation({}).combine(TransitionEffect.scale({ x: 0, y: 0 })).combine(TransitionEffect.rotate({ angle: 90 })).combine(TransitionEffect.move(TransitionEdge.END))build() {Column() {Button('切换元素').onClick(() => {this.isShow = !this.isShow})// 3. 新增或者删除组件触发转场if (this.isShow) {Text('我是文本框').fontSize(50).fontWeight(FontWeight.Bold)// 2. 添加转场效果.transition(this.effect)}// 我是底部的元素(// 元素是瞬间消失或出现的,所以这个输入框会瞬间上去或下去// 因为通过动画的方式让这一过程更为平滑,所以会出现 Text 上去了,但是消失、出现的动画还在播放// 如果要视觉效果更为美观,可以通过布局的方式让元素的出现或消失不影响布局Text('底部的文本框').fontSize(40)}.width('100%').height('100%')}
}

最后再给大家扩展一个帧动画

ImageAnimator 帧动画组件

供逐帧播放图片的能力,可以方便的控制播放状态:播放,暂停,停止..

核心用法:

ImageAnimator不是容器组件,也不需要传递参数,只需要设置属性即可

ImageAnimator().属性()

用例

@Entry
@Component
struct Page12_ImageAnimator {// 需要动画的图片// 两套动画素材// ic_animator_coin1(1-6 硬币)// ic_animator_dog1(1-4 狗狗)images: ImageFrameInfo[] = [{ src: $r('app.media.ic_animator_dog1') },{ src: $r('app.media.ic_animator_dog2') },{ src: $r('app.media.ic_animator_dog3') },{ src: $r('app.media.ic_animator_dog4') },]// 需要控制动画状态 定义状态变量 默认状态@State aniStatus: AnimationStatus = AnimationStatus.Initialbuild() {Column({ space: 10 }) {// 动画组件ImageAnimator().animatorFancy().iterations(-1)// 动画次数.duration(400)// 持续时间.height(150).images(this.images)// 动画图片.state(this.aniStatus) // 动画抓个状态// 按钮控制区域Row({ space: 20 }) {Button('启动').onClick(() => {this.aniStatus = AnimationStatus.Running // 播放})Button('暂停').onClick(() => {this.aniStatus = AnimationStatus.Paused // 暂停:停在触发的瞬间})Button('停止').onClick(() => {this.aniStatus = AnimationStatus.Stopped // 停止:直接到最后一张图})}}.width('100%').height('100%').padding(10)}// 抽取的通用属性@StylesanimatorFancy() {.width(300).backgroundColor(Color.Gray).padding(10).borderRadius(10)}
}

参数名称

参数类型

参数描述

images

Array<ImageFrameInfo>

设置图片帧信息集合。
说明:
不支持动态更新。

state

AnimationStatus

默认为初始状态,用于控制播放状态。

duration

number

单位为毫秒,默认时长为1000ms;duration为0时,不播放图片;值的改变只会在下一次循环开始时生效;当images中任意一帧图片设置了单独的duration后,该属性设置无效。
默认值:1000
从API version 10开始,该接口支持在ArkTS卡片中使用。

iterations

number

默认播放一次,设置为-1时表示无限次播放。
默认值:1

。。。。

好啦,今天的内容就到这里了,这里是鸿蒙开天组~喜欢的话可以点点收藏!感谢大家~

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

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

相关文章

我谈正态分布——正态偏态

目录 pdf和cdf参数 标准正态分布期望和方差分布形态 3 σ 3\sigma 3σ原则 正态和偏态正态偏态瑞利分布偏度 (Skewness)峰度 (Kurtosis) 比较 正态分布的英文是Normal Distribution&#xff0c;normal是“正常”或“标准”的意思&#xff0c;中文翻译是正态&#xff0c;多完美的…

从无音响Windows 端到 有音响macOS 端实时音频传输播放

以下是从 Windows 端到 macOS 端传输音频的优化方案&#xff0c;基于上述链接中的思路进行调整&#xff1a; Windows 端操作 安装必要软件 安装 Python&#xff08;确保版本兼容且已正确配置环境变量&#xff09;。安装 PyAudio 库&#xff0c;可通过 pip install pyaudio 命令…

AI知识库在行业应用中的未来趋势与案例分析

在数字化转型的浪潮中&#xff0c;AI知识库正成为企业提升效率和创新能力的关键工具。本文将探讨AI知识库在不同行业的应用案例&#xff0c;并分析其未来发展趋势。 一、汽修行业的AI知识库应用 汽修行业正通过构建内部知识库来提升服务质量和工作效率。一个完善的内部知识库能…

STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55

STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55 前面我们讲述了几种BootLoader中的命令&#xff0c;包括获取软件版本号、获取帮助、获取芯片ID、读取Flash保护Level。 下面我们来介绍一下BootLoader中最重要的功能之一—跳转&#xff01;就像BootLoader词汇中的Boot…

sqlite3数据库的相关API使用

1 1:使用sqlite3_exec函数读取数据库的数据,将这些数据存入链表遍历该链表&#xff0c;输出“字段”“数据”2:使用sqlite3_get_table读取数据库的数据写一个“字段" "数据”输出的循环 1 #include <stdio.h> #include <string.h> #include <unistd.…

基于Python下载HYCOM-3hourly数据(可无脑用)

基于Python下载HYCOM-3hourly数据 一、安装库二、主要函数2.1 draw_time_range2.2 download2.2.1 下载函数2.2.2 必传入参数&#xff1a;2.2.3 其他参数&#xff1a; 2.3 merge5nc 三、完整代码3.1 乱七八糟版3.2 精简版3.3 get_time_list 四、效果4.1 终端4.2 nc文件4.3 全文本…

Hbase集群搭建

1. 环境 三台节点hadoop 集群zookeeper 集群hbase 1.1环境准备 使用前文hdfs三台节点 1.11 zookeeper搭建 下载 wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz解压 tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz zookee…

为什么用SQL而不是Excel+VBA?

SQL主要服务数据库 SQL服务的是MySQL、Oracle、SQL Sever、Hive等各大数据库&#xff0c;它们都需要SQL来管理、定义。题主理解的SQL只限于查询数据、清洗数据&#xff0c;这些当然ExcelVBA都能做到&#xff0c;任何编程语言都能做到&#xff0c;但事实是SQL是数据库的管理工具…

Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别

目录 一、概念 1、纹理过滤 2、邻近过滤 3、线性过滤 二、邻近过滤和线性过滤的区别 三、源码下载 一、概念 1、纹理过滤 当纹理被应用到三维物体上时&#xff0c;随着物体表面的形状和相机视角的变化&#xff0c;会导致纹理在渲染过程中出现一些问题&#xff0c;如锯齿…

OpenHarmony4.1蓝牙芯片如何适配?触觉智能RK3568主板SBC3568演示

当打开蓝牙后没有反应时&#xff0c;需要排查蓝牙节点是否对应、固件是否加载成功&#xff0c;本文介绍开源鸿蒙OpenHarmony4.1系统下适配蓝牙的方法&#xff0c;触觉智能SBC3568主板演示 修改对应节点 开发板蓝牙硬件连接为UART1&#xff0c;修改对应的节点&#xff0c;路径为…

Kafka高频面试题详解

1、kafka是如何做到高效读写 1&#xff09;Kafka 本身是分布式集群&#xff0c;可以采用分区技术&#xff0c;并行度高 2&#xff09;读数据采用稀疏索引&#xff0c;可以快速定位要消费的数据。&#xff08;mysql中索引多了之后&#xff0c;写入速度就慢了&#xff09; 3&a…

ML 系列: 第 23 节 — 离散概率分布 (多项式分布)

目录 一、说明 二、多项式分布公式 2.1 多项式分布的解释 2.2 示例 2.3 特殊情况&#xff1a;二项分布 2.4 期望值 &#xff08;Mean&#xff09; 2.5 方差 三、总结 3.1 python示例 一、说明 伯努利分布对这样一种情况进行建模&#xff1a;随机变量可以采用两个可能的值&#…

MFC工控项目实例三十实现一个简单的流程

启动按钮夹紧 密闭&#xff0c;时间0到平衡 进气&#xff0c;时间1到进气关&#xff0c;时间2到平衡关 检测&#xff0c;时间3到平衡 排气&#xff0c;时间4到夹紧开、密闭开、排气关。 相关代码 void CSEAL_PRESSUREDlg::OnTimer_2(UINT nIDEvent_2) {// if (nIDEvent_21 &am…

当使用key-value方式进行参数传递时,若key对应的是一个对象或数组结构,如何利用API Post工具进行模拟操作。

1. 后端服务代码如下 RequestMapping("/handle11")public Person handle11(Person person){System.out.println(person);return person;} 2. 后端入参结构 person是一个对象&#xff0c;对象结构如下&#xff1a; public class Person {private String username …

MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并

MySQL技巧之跨服务器数据查询&#xff1a;基础篇-A数据库与B数据库查询合并 上一篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的链接名: MY_ODBC_MYSQL 以…

人工智能赋能快递物流,基于YOLOv3全系列【tiny/l/spp】参数模型开发构建物流分拣场景下快递包裹智能检测计数系统

随着电商互联网的迅猛发展&#xff0c;消费者的购物习惯发生了翻天覆地的变化&#xff0c;网购已成为日常生活不可或缺的一部分。这一趋势直接推动了快递物流行业的快速扩张&#xff0c;每天都有数以亿计的包裹在全球范围内流转。然而&#xff0c;传统的快递点物流包裹分拣工作…

Nginx中实现流量控制(限制给定时间内HTTP请求的数量)示例

场景 流量控制 流量限制 (rate-limiting)&#xff0c;可以用来限制用户在给定时间内HTTP请求的数量。 流量限制可以用作安全目的&#xff0c;比如可以减慢暴力密码破解的速率&#xff0c; 更常见的情况是该功能被用来保护上游应用服务器不被同时太多用户请求所压垮。 流量…

【ARM Coresight OpenOCD 系列 5 -- arp_examine 使用介绍】

文章目录 OpenOCD arp_examine 使用 OpenOCD arp_examine 使用 因为我们很多时候运行 Openocd 的时候有些 core 还没有启动, 所以最好在配置脚本中添加 -defer-examine这个参数, 如下&#xff1a; #cortex-m33 target create ${_CHIPNAME}.m33 cortex_m -dap ${_CHIPNAME}.da…

【AI新领域应用】AlphaFold 2,原子级别精度的蛋白质3D结构预测,李沐论文精读(2021Nature封面,2024诺贝尔奖)

文章目录 AlphaFold 2 —— 原子级别精度的蛋白质3D结构预测背景&#xff08;2024诺奖与AI学习资料&#xff09;1、摘要、导论、写作技巧2、方案&#xff1a;模型&#xff0c;编码器&#xff0c;解码器3、实验&#xff1a;数据集&#xff0c;训练&#xff0c;结果 AlphaFold 2 …

微服务day06

MQ入门 同步处理业务&#xff1a; 异步处理&#xff1a; 将任务处理后交给MQ来进行分发处理。 MQ的相关知识 同步调用 同步调用的小结 异步调用 MQ技术选型 RabbitMQ 安装部署 其中包含几个概念&#xff1a; publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 …