HarmonyOS Next 属性动画和转场动画

HarmonyOS Next 属性动画和转场动画

在鸿蒙应用开发中,动画是提升用户体验的关键要素。通过巧妙运用动画,我们能让应用界面更加生动、交互更加流畅,从而吸引用户的注意力并增强其使用粘性。鸿蒙系统为开发者提供了丰富且强大的动画开发能力,其中属性动画是整个动画体系的核心基础。接下来,让我们深入探索鸿蒙动画。

鸿蒙动画体系概览

鸿蒙动画体系旨在为开发者打造全方位、多层次的动画创作环境。它不仅包含属性动画这种能够精确控制组件属性变化的基础类型,还拥有转场动画,用于实现界面间的平滑过渡,为用户带来自然且流畅的视觉切换体验。无论是组件的移动、旋转、缩放,还是界面的淡入淡出、滑动切换,鸿蒙动画体系都能轻松应对,助力开发者创建出极具吸引力的应用界面。

属性动画

可动画属性的多样选择

系统预定义可动画属性:鸿蒙系统贴心地为组件提供了一系列内置的可动画属性接口。例如,position属性能够精准地调整组件在屏幕上的位置,使组件可以在不同坐标间平滑移动;scale属性用于控制组件的缩放比例,让组件能够自如地放大或缩小;opacity属性则决定了组件的透明度,实现淡入淡出等效果;blur属性可赋予组件模糊效果,为界面增添独特的视觉风格。这些系统预定义的可动画属性,极大地简化了开发者创建常见动画效果的过程。

分类说明
布局属性位置、大小、内边距、外边距、对齐方式、权重等。
仿射变换平移、旋转、缩放、锚点等。
背景背景颜色、背景模糊等。
内容文字大小、文字颜色,图片对齐方式、模糊等。
前景前景颜色等。
OverlayOverlay属性等。
外观透明度、圆角、边框、阴影等。

自定义可动画属性拓展:ArkUI 赋予开发者强大的自定义能力,通过@AnimatableExtend装饰器,开发者能够从自定义绘制的内容中抽象出可动画属性。设想在开发一个音乐应用时,需要自定义绘制一个音量图标,并且希望该图标能够根据音量大小动态改变其大小、颜色或形状。借助@AnimatableExtend装饰器,开发者就可以为这个原本不具备默认动画属性的自定义图标添加动画效果,从而满足特定的业务需求和创意设计。

丰富的属性动画接口

animateTo 接口:该接口主要作用于闭包内改变属性引起的界面变化,尤其在组件出现和消失的转场场景中表现出色。其原理是通过对比闭包前界面和闭包中状态变量引起的界面之间的差异,然后依据设定的动画参数对这些差异进行动画处理。它支持多次调用以及嵌套使用,这为开发者在处理复杂动画逻辑时提供了极大的灵活性。例如,在一个需要让组件同时进行平移、旋转和缩放,并且这些动画都使用相同动画参数的场景中,animateTo就能发挥其优势,简洁高效地实现所需动画效果。

animation 接口animation接口作用于组件通过属性接口绑定的属性变化引起的界面变化。它能够敏锐地识别组件的可动画属性变化,当检测到绑定的可动画属性发生改变时,会自动为这些属性变化添加动画效果。值得注意的是,组件的接口调用遵循从下往上的执行顺序,animation只会作用于在其之上的属性调用。这意味着开发者可以根据组件属性的调用顺序,轻松地对多个属性设置不同的animation效果。比如,在一个组件既要移动又要改变透明度,且移动速度和透明度变化速度不同的场景中,通过animation接口分别为translate属性和opacity属性设置不同的动画参数,就能精准实现所需的动画效果。

代码示例

下面通过一个具体的代码示例,展示如何使用animateTo接口来实现属性动画。

@Entry
@Component
@Preview
struct AnimPage {
  @State animate: boolean = false;
  // 第一步: 声明相关状态变量
  @State rotateValue: number = 0; // 组件一旋转角度
  @State translateX: number = 0; // 组件二偏移量
  @State opacityValue: number = 1; // 组件二透明度

  build() {
    Column({ space: 20 }) {
      Row() {
        // 组件一
        Column() {
          Text("123")
        }
        .rotate({ angle: this.rotateValue })
        .backgroundColor('#317AF7')
        .justifyContent(FlexAlign.Center)
        .width(100)
        .height(100)
        .borderRadius(30)
        .onClick(() => {
          this.getUIContext()?.animateTo({ curve: curves.springMotion(), duration: 3500 }, () => {
            this.animate = !this.animate;
            // 第三步:闭包内通过状态变量改变UI界面
            // 这里可以写任何能改变UI的逻辑比如数组添加,显隐控制,系统会检测改变后的UI界面与之前的UI界面的差异,对有差异的部分添加动画
            // 组件一的rotate属性发生变化,所以会给组件一添加rotate旋转动画
            this.rotateValue = this.animate ? 90 : 0;
            // 组件二的透明度发生变化,所以会给组件二添加透明度的动画
            this.opacityValue = this.animate ? 0.6 : 1;
            // 组件二的translate属性发生变化,所以会给组件二添加translate偏移动画
            this.translateX = this.animate ? 50 : 0;
          })
        })

        // 组件二
        Column() {
          Text("456")
        }
        .justifyContent(FlexAlign.Center)
        .width(100)
        .height(100)
        .backgroundColor('#D94838')
        .borderRadius(30)
        .opacity(this.opacityValue)
        .translate({ x: this.translateX })
        .animation({ curve: curves.springMotion(), duration: 3500 })
      }
      .width('100%')
      .justifyContent(FlexAlign.Center)
    }
  }
}

在上述代码中,当用户点击Column组件时,animate状态变量会发生改变。依据animate的值,rotateValue(旋转角度)、translateX(偏移量)和opacityValue(透明度)这三个状态变量会相应地改变。由于opacityrotate等属性绑定了animation接口,并且设置了弹簧曲线curves.springMotion(),所以当这些属性值发生变化时,会自动按照弹簧曲线的规律产生动画效果,使组件的旋转、平移和透明度变化呈现出自然的弹簧效果,为用户带来独特而生动的视觉体验。
效果如下:
请添加图片描述

转场动画

转场动画是指对将要出现或消失的组件做动画,对始终出现的组件做动画应使用属性动画。转场动画主要为了让开发者从繁重的消失节点管理中解放出来,如果用属性动画做组件转场,开发者需要在动画结束回调中删除组件节点。同时,由于动画结束前已经删除的组件节点可能会重新出现,还需要在结束回调中增加对节点状态的判断。

转场效果说明动画
IDENTITY禁用转场效果。无。
OPACITY默认的转场效果,透明度转场。出现时透明度从0到1,消失时透明度从1到0。
SLIDE滑动转场效果。出现时从窗口左侧滑入,消失时从窗口右侧滑出。
translate通过设置组件平移创建转场效果。出现时为translate接口设置的值到默认值0,消失时为默认值0到translate接口设置的值。
rotate通过设置组件旋转创建转场效果。出现时为rotate接口设置的值到默认值0,消失时为默认值0到rotate接口设置的值。
opacity通过设置透明度参数创建转场效果。出现时为opacity设置的值到默认透明度1,消失时为默认透明度1到opacity设置的值。
move通过TransitionEdge创建从窗口哪条边缘出来的效果。出现时从TransitionEdge方向滑入,消失时滑出到TransitionEdge方向。
asymmetric通过此方法组合非对称的出现消失转场效果。
- appear:出现转场的效果。
- disappear:消失转场的效果。
出现时采用appear设置的TransitionEffect出现效果,消失时采用disappear设置的TransitionEffect消失效果。
combine组合其他TransitionEffect。组合其他TransitionEffect,一起生效。
animation定义转场效果的动画参数:
- 如果不定义会跟随animateTo的动画参数。
- 不支持通过控件的animation接口配置动画参数。
- TransitionEffect中animation的onFinish不生效。
调用顺序时从上往下,上面TransitionEffect的animation也会作用到下面TransitionEffect。

代码示例

@Entry
@Component
@Preview
struct AnimPage {
  @State buttonScale: number = 1;
  @State buttonWidth: number = 100;

  @State showNewBtn: boolean = true

  // 创建默认透明度转场效果,并指定了springMotion(0.6, 0.8)曲线
  private opacityEffect: TransitionEffect = TransitionEffect.OPACITY.animation({ curve: curves.springMotion(0.6, 0.8) })

  // 创建默认平移转场效果, 左进右出
  private slideEffect: TransitionEffect = TransitionEffect.SLIDE.animation({ curve: curves.springMotion(0.6, 0.8) })

  private customEffect: TransitionEffect =
    // 创建默认透明度转场效果,并指定了springMotion(0.6, 0.8)曲线
    TransitionEffect.OPACITY.animation({ curve: curves.springMotion(0.6, 0.8) })
      // 通过combine方法,这里的动画参数会跟随上面的TransitionEffect,也就是springMotion(0.6, 0.8)
      .combine(TransitionEffect.scale({ x: 0, y: 0 }))
        // 添加旋转转场效果,这里的动画参数会跟随上面带animation的TransitionEffect,也就是springMotion(0.6, 0.8)
      .combine(TransitionEffect.rotate({ angle: 90 }))
        // 添加平移转场效果,这里的动画参数使用指定的springMotion()
      .combine(TransitionEffect.translate({ y: 150 }).animation({ curve: curves.springMotion() }))
        // 添加move转场效果,这里的动画参数会跟随上面的TransitionEffect,也就是springMotion()
      .combine(TransitionEffect.move(TransitionEdge.END))

  build() {
    Column({ space: 20 }) {
      Button("开始动画").onClick(() => {
        this.buttonScale = 1.5 / this.buttonScale
        this.buttonWidth = 300 - this.buttonWidth

        this.showNewBtn = !this.showNewBtn
      })
        .width(this.buttonWidth)
        .scale({ x: this.buttonScale, y: this.buttonScale })
        .animation({ curve: curves.springMotion() })

      if (this.showNewBtn) {
        Button("透明显隐(默认)").transition(this.opacityEffect)
      }

      if (this.showNewBtn) {
        Button("左进右出").transition(this.slideEffect)
      }

      if (this.showNewBtn) {
        Button("自定义").transition(this.customEffect)
      }
    }.width('100%')
  }
}

这段代码实现了一个包含按钮动画效果的界面。主要功能如下:
定义了按钮的缩放、宽度和显示状态。
创建了三种动画效果:透明度转场、平移转场和自定义组合转场。
点击“开始动画”按钮时,切换按钮的缩放和宽度,并切换新按钮的显示状态。
根据显示状态,动态展示三个带有不同动画效果的按钮。
运行效果:
file

通过以上对鸿蒙动画体系的介绍,特别是对属性动画和转场动画代码示例的实操,相信开发者们对鸿蒙动画开发有了更清晰的认识和更深入的理解。在实际开发中,充分利用这些动画特性,将为鸿蒙应用增添无限魅力,提升用户体验到新的高度。

#ArkTS UI

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

K8S学习之基础十:k8s中初始化容器和主容器

init容器和主容器 init容器和主容器的区别 初始化容器不支持 Readinessprobe,因为他们必须在pod就绪之前运行完成每个init容器必须运行成功,下一个才能够运行 # 定义两个初始化容器,完成后再运行主容器 vi pod-init.yaml apiVersion: v1 …

PostgreSQL 安装与使用

下载地址: EDB: Open-Source, Enterprise Postgres Database Management 安装图形化安装界面安装。安装完后将bin目录配置到系统环境变量 执行psql -h localhost -p 5432 -U postgres 密码在安装过程中设置的 ​ 0、修改密码 ALTER USER sonar WITH PASSWORD 123456; 1、新…

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中 一、前言二、部署与发布基础概念2.1 部署的定义与目的2.2 发布的方式与渠道2.3 部署与发布的关键要素 三、WPF 应用程序打包3.1 使用 Visual Studio 自带的打包工具3.2 使用第三方打包工具 四、发布到不同…

Mybatis 的关联映射(一对一,一对多,多对多)

前言 在前面我们已经了解了,mybatis 的基本用法,动态SQL,学会使用mybatis 来操作数据库。但这些主要操作还是针对 单表实现的。在实际的开发中,对数据库的操作,常常涉及多张表。 因此本篇博客的目标:通过my…

在Linux中开发OpenGL——检查开发环境对OpenGL ES的支持

由于移动端GPU规模有限,厂商并没有实现完整的OpenGL特性,而是实现了它的子集——OpenGL ES。因此如果需要开发的程序要支持移动端平台,最好使用OpenGL ES开发。 1、 下载支持库、OpenGL ES Demo 1.1、下载PowerVRSDK支持库作为准备&#xff…

【Python项目】基于深度学习的电影评论情感分析系统

【Python项目】基于深度学习的电影评论情感分析系统 技术简介:采用Python技术、Flask框架、MySQL数据库、Word2Vec模型等实现。 系统简介:该系统基于深度学习技术,特别是Word2Vec模型,用于分析电影评论的情感倾向。系统分为前台…

SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决

介绍一下我的是ubuntu20.04.机载电脑是orinnx,通过源码烧写的系统。 首先打开终端,输入 pip install evo --upgrade --no-binary evo 安装过程中出现如下问题 缺少 onnx 库还有Pandas 版本不兼容, ONNX(Open Neural Network E…

Arcgis中添加脚本工具箱

文章目录 准备资料1、打开arcmap2、找到目录窗口3、复制粘贴工具箱的路径4、添加或者确认python脚本路径准备资料 (1)工具箱 (2)python脚本 1、打开arcmap 2、找到目录窗口 3、复制粘贴工具箱的路径 4、添加或者确认python脚本路径 脚本上右键属性(注意:脚本内容和路径…

第二次CCF-CSP认证(思路及源码)

第二次CCF-CSP认证 第一道(easy)思路及AC代码 第二道(easy)基本思路及AC代码 第三道(mid)基本思路及AC代码solution 1 (模拟)solution 2(KMP) 第一道(easy) 题…

RAGflow 无法加载Embedding模型

部署0.17版本的RAGflow,在模型列表中已经添加了嵌入模型,但是知识库配置时,嵌入模型灰显: 问题原因: 提前上传了一个文档,在知识库有文档之后,就不能够修改嵌入模型了。删除文档之后&#xff0…

C++ Primer 拷贝、赋值与销毁

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

【够用就好006】如何从零开发游戏上架steam面向AI编程的godot独立游戏制作实录001流程

记录工作实践 这是全新的系列,一直有个游戏制作梦 感谢AI时代,让这一切变得可行 长欢迎共同见证,期更新,欢迎保持关注,待到游戏上架那一天,一起玩 面向AI编程的godot独立游戏制作流程实录001 本期是第…

计算机毕业设计Python+DeepSeek-R1大模型空气质量预测分析(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

【文生图】windows 部署stable-diffusion-webui

windows 部署stable-diffusion-webui AUTOMATIC1111 stable-diffusion-webui Detailed feature showcase with images: 带图片的详细功能展示: Original txt2img and img2img modes 原始的 txt2img 和 img2img 模式 One click install and run script (but you still must i…

单片机项目复刻需要的准备工作

一、前言 复刻单片机的项目的时候,有些模块是需要焊接的。很多同学对焊接没有概念。 这里说一下做项目的基本工具。 比如:像这种模块,都需要自己焊接了排针才可以链接的。 二、基本模块 2.1 单排排针 一些模块买回来是没有焊接的&#x…

微服务概览与治理

微服务概览与治理 1. 微服务架构的演进 1.1 引言 当我们讨论微服务时,我们并不是在谈论一种炫酷的新技术,而是在寻找一种更好的方式来组织我们的软件系统,使其更易扩展、更易维护。软件架构的发展历程往往是对业务需求和技术挑战的回应。从…

《代码随想录第五十七天》——孤岛的总面积、沉没孤岛、水流问题、建造最大岛屿

《代码随想录第五十七天》——孤岛的总面积、沉没孤岛、水流问题、建造最大岛屿 本篇文章的所有内容仅基于C撰写。 1. 孤岛的总面积 1.1 题目 孤岛的总面积 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指…

IntelliJ IDEA 华为云远程开发配置步骤

1.连接华为云主机,点击New Project 2.输入用户名与主机IP后连接 3.输入密码授权连接 4.继续连接 注意,远程主机内存最少要4G才能启动后端IDE 5.连接华为云主机成功,下载IDE并连接 选择项目位置

23种设计模式之单例模式(Singleton Pattern)【设计模式】

文章目录 一、简介二、关键点三、实现单例模式的步骤四、C#示例4.1 简单的单例模式4.2 线程安全的单例模式(双重检查锁定)4.3 静态初始化单例模式 五、单例模式优缺点5.1 优点5.2 缺点 六、适用场景七、示例的现实应用 一、简介 单例模式(Si…

c盘爆红后,使用diskgenius给C盘无损扩容,操作记录

diskgenius下载链接 参考链接 操作前环境 之前电脑配置了一个每天定时清理c盘临时文件的脚本,依然阻止不了c盘爆红。 实测DISKGENIUS 无损扩容有效,扩容前的环境: 扩容前,C区可用空间 9G,爆红C盘D盘都是 NTFS 格式,D…