作为一名每天和代码、界面打交道的开发者,我总觉得优秀的应用不该只有 “能用” 的骨架,还得有 “灵动” 的灵魂 —— 动画和转场就是赋予灵魂的关键。最近晚上泡杯热茶,坐在电脑前跟着 HarmonyOS NEXT的课程学习,算是把这层 “让应用活起来” 的窗户纸彻底捅破了。

课程链接:<HarmonyOS第一课>合理使用动画和转场

使用属性动画

在这里插入图片描述

动画概述

一个App的界面(UI)是由一堆零件组成的,比如显示时间的框、背景图片等等。每个零件都有一堆“属性”来控制它,比如“位置”这个属性就决定了零件在屏幕上出现在哪里。当你改变属性值(比如把位置从左边调到右边),界面就会变。如果这个变化是“唰”地一下直接跳过去的,就会显得很生硬、很突然。而“动画”就是在这个变化过程中,加上一个流畅的过渡效果,让用户的视线能自然地跟上去,不会觉得莫名其妙。
在这里插入图片描述

ArkUI 这个框架给了我们好多现成的工具(比如属性动画)来做动画。它的工作原理很简单,就是让一个属性(比如位置、大小)在一段时间里,从一个起始值慢慢变到结束值。不过电脑实现的“慢慢变”其实是骗我们眼睛的!它是在屏幕每次刷新的时候,飞快地给我们看这个变化过程中的一个“快照”(就是一帧一帧的画面)。因为我们人眼有“视觉暂留”的毛病,这些快速连续的快照看起来就成了一段连贯的动画。动画流不流畅,就看一秒内能闪过多少张“快照”,这个数叫帧率(FPS)。而控制这个变化“节奏”的开关,叫动画曲线。比如用“线性”曲线,变化就是匀速的,很机械;但如果用个“先快后慢”的曲线,那动画看起来就有加速度,更自然。

这直接解释了为什么有些动画虽然快,但感觉很“生硬”;有些动画虽然慢,却感觉很“顺滑”。差别就在于那个看不见的“曲线”。它决定了动画是机械的、有弹性的、还是富有生命感的。以后调动画,真不能光调时长,得像调音师一样,好好调教那条“曲线”,让它符合用户的心理预期。比如,一个弹窗出现用个轻微的“缓动曲线”,那种感觉立马就高级、自然了。

属性动画概述

UI组件的属性有很多种,但并不是所有属性变了都能或者都应该做动画。所以属性被分成了“可动画属性”和“不可动画属性”。判断一个属性能不能做动画,主要看两条规矩:

第一条是基本前提:这个属性的变化必须能让我们眼睛看得到。反面例子: enabled 属性(控制组件能不能被点击)。它变了只是交互状态变了,比如按钮从可点变成不可点,但样子可能没变。既然看不到变化,做动画也就没意义了。

第二条是关于用户体验:这个属性的变化过程适不适合“慢悠悠”地过渡。反面例子:focusable属性(控制组件能不能获得焦点)。比如用户按键盘,焦点应该“啪”一下立刻切换到下一个输入框,这样才能快速响应。如果焦点还做个移动动画,用户会觉得卡顿、反应慢,体验就很差。另外还提到一个技术细节:为了让动画起点准确,系统在开启动画前,会先把所有需要更新的UI(在“标脏队列”里的节点)都刷新一遍。所以如果发现某个动画特别慢,可能得查查是不是这次“刷新”捎带手处理了太多别的东西,拖了后腿。

一个属性能不能做动画,跟它的数据类型是“连续”的还是“非连续”的,没有绝对关系。通常我们觉得,能做动画的属性(比如位置、大小、颜色),它的值应该是可以“慢慢变”的,比如从 0px 到 100px,中间可以有 1px, 2px… 这叫“连续数据类型”。但 ArkUI 很灵活,它打破了这个常规认知。它举的例子是 direction 这个属性,它的值是一些固定的选项(比如“从左到右”或“从右到左”,这叫“枚举值”,是“离散数据类型”),本身没法“慢慢变”。但因为改变 direction 最终会引发组件位置的变化,而位置本身是一个标准的、可动画的属性。所以,ArkUI 就聪明地“绕过”了 direction 这个枚举值本身,转而去为它所引起的位置变化添加了动画。所以判断关键还是看最终效果是否引起可见的、适合动画的UI变化,而不是死磕属性的数据类型。

因此,做动画前,得先像这样对自己的属性进行一场“资格审查”。先问自己两个问题:

1.这变化用户看得见吗?
2.这个变化需要立即生效吗?

想清楚了再动手,这样才能做出既流畅又不碍事的优秀动画。我们应该多从“用户想达到什么目的”这个角度思考,而不是仅仅暴露冰冷的底层参数。ArkUI 在这里做的就是理解了开发者的意图(“我想让布局方向的变化有过渡效果”),并自动完成了最合理的实现。

在本次课程中,ArkUI提供三种动画接口animateToanimationkeyframeAnimateTo驱动组件属性按照动画曲线等动画参数进行连续的变化,产生属性动画。大家可以在上方课程链接点击直达!

使用转场动画

在这里插入图片描述

转场动画概述

我们来看一下两者的区别:

属性动画:负责让界面上已经存在的东西“动起来”,比如移动一个图标、改变按钮颜色。
转场动画:专门负责处理组件的“登台”和“退场”,比如一个弹窗的弹出和关闭。

转场动画最大的好处是帮你自动处理了组件的“生死”问题。你想啊,如果你用属性动画让一个组件消失(比如让它缩小到看不见),你还得在动画结束时写代码手动把这个组件从界面上删掉,不然它只是看不见了,但还占着坑位。更麻烦的是,你还要防止动画没放完,这个组件又被别的地方调用了,容易出bug。而转场动画把这些底层杂活全包了,你只需要说“请让这个组件优雅地离开”,它就自动帮你处理好动画和销毁的整个流程。

这个设计不仅仅是“方便”,它更是为了“可靠”。通过约束和封装,从根本上减少了开发者犯错的机会(比如内存泄漏、状态不一致)。这提醒我们,在设计接口或系统时,一个重要的目标不应该是提供无限的自由度,而是为常见的任务提供一条“最优路径”,让开发者能轻松地写出正确、高效的代码。转场动画就是这条“最优路径”的完美例子。

在本次课程中还演示了如何实现各种类型的转场动效。其中包括使用Navigation组件导航实现页面间转场,使用transition属性实现组件内转场,使用bindSheet实现模态转场,使用geometryTransition实现共享元素转场及卡片一镜到底动效。通过转场动效,可以平滑地过渡到下一个组件或页面,增加应用的连贯性和流畅性。大家可以点击上方课程链接直达!

如果你也和我一样,在学习中经历过 “认知破碎 — 重建 — 兴奋” 的循环,或是对鸿蒙开发有无数疑问

欢迎加入 鸿蒙知识共建交流群 : 点击链接直达

在这里,我们可以拆解技术难点,分享实践案例,甚至一起畅想全场景生态的下一个突破点 —— 毕竟,在鸿蒙的浪潮里,独行太孤独,并肩才能走得更远。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐