首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

HarmonyOS:ArkTS 显式动画 animateTo 自学指南

  • 25-04-25 09:21
  • 4578
  • 13101
blog.csdn.net

在最近的项目开发工作中,我频繁需要为界面元素添加过渡动画效果,以提升用户体验。在这个过程中,我接触到了 ArkTS 提供的 animateTo 全局显式动画接口。它为由于闭包代码导致的状态变化插入过渡动效提供了便捷的方式,能让布局类的宽高变化以及内容呈现出流畅的动画效果。然而,这个接口的使用细节和相关参数较多,文档虽然详细但较为零散,对于初学者来说理解和掌握起来有一定难度。因此,我决定撰写这篇博客,将自己的学习经验和理解整理成一份自学指南,希望能帮助其他开发者更快速、深入地掌握 animateTo 接口的使用。

一、animateTo 接口概述

animateTo 接口提供了一种显式的方式来为状态变化添加过渡动画。它支持属性动画、布局类的宽高变化动画等。不过需要注意的是,默认情况下内容(如文字、Canvas 内容)会直接到达终点状态,若要让内容跟随宽高变化,可以使用 renderFit 属性进行配置。

支持版本

  • 从 API Version 7 开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
  • 从 API version 9 开始,该接口支持在 ArkTS 卡片中使用。
  • 从 API version 10 开始,可以通过使用 UIContext 中的 animateTo 来明确 UI 的执行上下文。
  • 从 API version 11 开始,该接口支持在元服务中使用。

接口定义

typescript

animateTo(value: AnimateParam, event: () => void): void
  • 参数说明:
    • value:AnimateParam 类型,必填,用于设置动画效果相关参数。
    • event:() => void 类型,必填,指定动效的闭包函数,在闭包函数中导致的状态变化系统会自动插入过渡动画。

二、AnimateParam 对象详细说明

AnimateParam 对象包含了多个用于配置动画效果的参数,下面是各个参数的详细介绍:

1. duration

  • 类型:number
  • 是否必填:否
  • 描述:动画持续时间,单位为毫秒。默认值为 1000。
    • 在 ArkTS 卡片上最大动画持续时间为 1000 毫秒,若超出则固定为 1000 毫秒。
    • 设置小于 0 的值时按 0 处理。
    • 设置浮点型类型的值时,向下取整。例如,设置值为 1.2,按照 1 处理。

2. tempo

  • 类型:number
  • 是否必填:否
  • 描述:动画播放速度,值越大动画播放越快,值越小播放越慢,为 0 时无动画效果。默认值为 1.0。当设置小于 0 的值时按值为 1 处理。

3. curve

  • 类型:Curve | ICurve9+ | string
  • 是否必填:否
  • 描述:动画曲线。默认值为 Curve.EaseInOut。

4. delay

  • 类型:number
  • 是否必填:否
  • 描述:动画延迟播放时间,单位为 ms(毫秒),默认不延时播放。默认值为 0,取值范围为 (-∞, +∞)。
    • delay >= 0 为延迟播放,delay < 0 表示提前播放。对于 delay < 0 的情况:当 delay 的绝对值小于实际动画时长,动画将在开始后第一帧直接运动到 delay 绝对值的时刻的状态;当 delay 的绝对值大于等于实际动画时长,动画将在开始后第一帧直接运动到终点状态。其中实际动画时长等于单次动画时长乘以动画播放次数。
    • 设置浮点型类型的值时,向下取整。例如,设置值为 1.2,按照 1 处理。

5. iterations

  • 类型:number
  • 是否必填:否
  • 描述:动画播放次数。默认播放一次,设置为 -1 时表示无限次播放。设置为 0 时表示无动画效果。默认值为 1,取值范围为 [-1, +∞)。

6. playMode

  • 类型:PlayMode
  • 是否必填:否
  • 描述:动画播放模式,默认播放完成后重头开始播放。默认值为 PlayMode.Normal。
    • 推荐使用 PlayMode.Normal 和 PlayMode.Alternate,此场景下动画的第一轮是正向播放的。如使用 PlayMode.Reverse 和 PlayMode.AlternateReverse,则动画的第一轮是逆向播放的,在动画刚开始时会跳变到终止状态,然后逆向播放动画。
    • 使用 PlayMode.Alternate 或 PlayMode.AlternateReverse 时,开发者应保证动画最终状态和状态变量的取值一致,即应保证动画的最后一轮是正向播放的。使用 PlayMode.Alternate 时,iterations 应为奇数。使用 PlayMode.AlternateReverse 时,iterations 应为偶数。
    • 不推荐使用 PlayMode.Reverse,此场景下不仅会导致动画刚开始就跳变到终止状态,也会导致动画最终状态和状态变量的取值不同。

7. onFinish

  • 类型:() => void
  • 是否必填:否
  • 描述:动画播放完成回调。UIAbility 从前台切换至后台时会立即结束仍在步进中的有限循环动画,触发播放完成回调。

8. finishCallbackType11+

  • 类型:FinishCallbackType
  • 是否必填:否
  • 描述:在动画中定义 onFinish 回调的类型。默认值为 FinishCallbackType.REMOVED。
    • FinishCallbackType 说明:
      • REMOVED:当整个动画结束并立即删除时,将触发回调。
      • LOGICALLY:当动画在逻辑上处于下降状态,但可能仍处于其长尾状态时,将触发回调。

9. expectedFrameRateRange11+

  • 类型:ExpectedFrameRateRange
  • 是否必填:否
  • 描述:设置动画的期望帧率。
    • ExpectedFrameRateRange 说明:
      • min:期望的最小帧率。
      • max:期望的最大帧率。
      • expected:期望的最优帧率。

三、使用注意事项

  • 在 duration 为 0 的动画闭包函数中改变属性,可以实现停止该属性动画的效果。
  • 如果需要在组件出现时创建动画,可以在 onAppear 中实现动画的创建。不推荐在 aboutToAppear、aboutToDisappear 中调用动画。因为在 aboutToAppear 中调用动画,自定义组件内的 build 还未执行,内部组件还未创建,动画时机过早,动画属性没有初值无法对组件产生动画;执行 aboutToDisappear 时,组件即将销毁,不能在 aboutToDisappear 里面做动画。
  • 也可以使用组件内转场,在组件出现和消失时做动画。组件内转场不支持的属性,可以使用 animateTo 实现组件消失动画效果。

四、示例代码

示例 1:设置动画在 onAppear 中执行

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct AnimateToExample {
  5. @State widthSize: number = 300
  6. @State heightSize: number = 120
  7. @State rotateAngle: number = 0
  8. private flag: boolean = true
  9. build() {
  10. Column() {
  11. Button('change size')
  12. .width(this.widthSize)
  13. .height(this.heightSize)
  14. .margin(40)
  15. .onClick(() => {
  16. if (this.flag) {
  17. // 建议使用this.getUIContext()?.animateTo()
  18. animateTo({
  19. duration: 2500,
  20. curve: Curve.EaseIn,
  21. iterations: 4,
  22. playMode: PlayMode.Normal,
  23. onFinish: () => {
  24. console.info('play end')
  25. }
  26. }, () => {
  27. this.widthSize = 180
  28. this.heightSize = 80
  29. })
  30. } else {
  31. // 建议使用this.getUIContext()?.animateTo()
  32. animateTo({}, () => {
  33. this.widthSize = 300
  34. this.heightSize = 120
  35. })
  36. }
  37. this.flag = !this.flag
  38. })
  39. Button('stop rotating')
  40. .margin(60)
  41. .rotate({ x: 0, y: 0, z: 1, angle: this.rotateAngle })
  42. .onAppear(() => {
  43. // 组件出现时开始做动画
  44. // 建议使用this.getUIContext()?.animateTo()
  45. animateTo({
  46. duration: 1500,
  47. curve: Curve.EaseIn,
  48. delay: 600,
  49. iterations: -1, // 设置-1表示动画无限循环
  50. playMode: PlayMode.Alternate,
  51. expectedFrameRateRange: {
  52. min: 15,
  53. max: 130,
  54. expected: 70,
  55. }
  56. }, () => {
  57. this.rotateAngle = 120
  58. })
  59. })
  60. .onClick(() => {
  61. // 建议使用this.getUIContext()?.animateTo()
  62. animateTo({ duration: 0 }, () => {
  63. // this.rotateAngle之前为120,在duration为0的动画中修改属性,可以停止该属性之前的动画,按新设置的属性显示
  64. this.rotateAngle = 0
  65. })
  66. })
  67. }.width('100%').margin({ top: 10 })
  68. }
  69. }

示例 2:动画执行结束后组件消失

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct AttrAnimationExample {
  5. @State heightSize: number = 120;
  6. @State isShow: boolean = true;
  7. @State count: number = 0;
  8. private isToBottom: boolean = true; // 向下
  9. build() {
  10. Column() {
  11. if (this.isShow) {
  12. Column()
  13. .width(220)
  14. .height(this.heightSize)
  15. .backgroundColor('green')
  16. .onClick(() => {
  17. // 建议使用this.getUIContext()?.animateTo()
  18. animateTo({
  19. duration: 2200,
  20. curve: Curve.EaseInOut,
  21. iterations: 1,
  22. playMode: PlayMode.Normal,
  23. onFinish: () => {
  24. this.count--;
  25. if (this.count == 0 && !this.isToBottom) { // 组件只有在向下做完动画才会消失
  26. this.isShow = false;
  27. }
  28. }
  29. }, () => {
  30. this.count++;
  31. if (this.isToBottom) {
  32. this.heightSize = 70;
  33. } else {
  34. this.heightSize = 120;
  35. }
  36. this.isToBottom = !this.isToBottom;
  37. })
  38. })
  39. }
  40. }.width('100%').height('100%').margin({ top: 10 })
  41. .justifyContent(FlexAlign.End)
  42. }
  43. }

通过以上的介绍和示例,相信你已经对 ArkTS 的 animateTo 接口有了更深入的了解。在实际开发中,你可以根据具体需求灵活配置 AnimateParam 对象的参数,实现各种炫酷的动画效果。

最后如果这篇文章对你有帮助,希望您能关注,点赞,加收藏哦~~~~

注:本文转载自blog.csdn.net的李游Leo的文章"https://blog.csdn.net/liyou041/article/details/146568408"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

135
HarmonyOS
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top