首页 最新 热门 推荐

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

鸿蒙HarmonyOS实战-ArkUI动画(布局更新动画)

  • 25-02-22 03:21
  • 3547
  • 8171
blog.csdn.net

 前言

动画是一种通过连续展示一系列静止的图像(称为帧)来创造出运动效果的艺术形式。它可以以手绘、计算机生成或其他各种形式呈现。在动画中,每一帧都具有微小的变化,当这些帧被快速播放时,人眼会产生视觉上的错觉,认为物体在运动。动画可以用来表达故事、观念、想法、情感或其他形式的艺术创作。它在电影、电视节目、广告、游戏和网页设计等领域中得到广泛应用。

按照页面分类的动画:
在这里插入图片描述
按照基础能力分类的动画
在这里插入图片描述

一、布局更新动画

显式动画(animateTo)和属性动画(animation)是ArkUI提供的最基础和常用的动画功能。这些动画功能可以在布局属性(例如尺寸属性、位置属性)发生变化时使用。通过属性动画或显式动画,可以按照指定的动画参数过渡到新的布局参数状态。这些动画功能的使用可以使UI变得更加生动和有趣。

1.使用显式动画产生布局更新动画

显式动画是指通过在代码中显式地定义动画效果,来实现视图的动态变化。在HarmonyOS中,通过使用animateTo方法可以创建显式动画。这个方法可以传入目标属性值、动画时长和动画插值器等参数,以实现在一段时间内使视图属性平滑过渡到指定的目标值。显式动画可以用于控制视图的尺寸、位置、透明度等属性,在用户交互或特定事件触发时产生动态效果,增强用户体验。

显式动画的接口为:

animateTo(value: AnimateParam, event: () => void): void
  • 第一个参数指定动画参数

  • 第二个参数为动画的闭包函数

?1.1 平移动画

平移动画是一种移位动画效果,通过改变元素在屏幕上的位置来实现物体的平移效果。在平移动画中,元素可以沿着水平、垂直或对角线方向移动,或者沿着自定义的路径移动。平移动画可以为用户界面添加动感和交互性,提高用户体验。

  1. @Entry
  2. @Component
  3. struct LayoutChange {
  4. // 用于控制Column的alignItems属性
  5. @State itemAlign: HorizontalAlign = HorizontalAlign.Start;
  6. allAlign: HorizontalAlign[] = [HorizontalAlign.Start, HorizontalAlign.Center, HorizontalAlign.End];
  7. alignIndex: number = 0;
  8. build() {
  9. Column() {
  10. Column({ space: 10 }) {
  11. Button("1").width(100).height(50)
  12. Button("2").width(100).height(50)
  13. Button("3").width(100).height(50)
  14. }
  15. .margin(20)
  16. .alignItems(this.itemAlign)
  17. .borderWidth(2)
  18. .width("90%")
  19. .height(200)
  20. Button("click").onClick(() => {
  21. // 动画时长为1000ms,曲线为EaseInOut
  22. animateTo({ duration: 1000, curve: Curve.EaseInOut }, () => {
  23. this.alignIndex = (this.alignIndex + 1) % this.allAlign.length;
  24. // 在闭包函数中修改this.itemAlign参数,使Column容器内部孩子的布局方式变化,使用动画过渡到新位置
  25. this.itemAlign = this.allAlign[this.alignIndex];
  26. });
  27. })
  28. }
  29. .width("100%")
  30. .height("100%")
  31. }
  32. }

初始化
在这里插入图片描述
移动到中间
在这里插入图片描述
移动到末尾
在这里插入图片描述
最后还原初始化

?1.2 缩放动画

缩放动画是一种在动画中改变对象的尺寸大小的效果。它可以通过逐渐增大或减小对象的尺寸,或者通过突然改变对象的尺寸来实现。缩放动画可以应用于各种类型的对象,包括文字、图片、图标等。

  1. @Entry
  2. @Component
  3. struct LayoutChange2 {
  4. @State myWidth: number = 100;
  5. @State myHeight: number = 50;
  6. // 标志位,true和false分别对应一组myWidth、myHeight值
  7. @State flag: boolean = false;
  8. build() {
  9. Column({ space: 10 }) {
  10. Button("text")
  11. .type(ButtonType.Normal)
  12. .width(this.myWidth)
  13. .height(this.myHeight)
  14. .margin(20)
  15. Button("area: click me")
  16. .fontSize(12)
  17. .margin(20)
  18. .onClick(() => {
  19. animateTo({ duration: 1000, curve: Curve.Ease }, () => {
  20. // 动画闭包中根据标志位改变控制第一个Button宽高的状态变量,使第一个Button做宽高动画
  21. if (this.flag) {
  22. this.myWidth = 100;
  23. this.myHeight = 50;
  24. } else {
  25. this.myWidth = 200;
  26. this.myHeight = 100;
  27. }
  28. this.flag = !this.flag;
  29. });
  30. })
  31. }
  32. .width("100%")
  33. .height("100%")
  34. }
  35. }

在这里插入图片描述
在这里插入图片描述
如果不希望其他组件也变化位置,可以把变化组件放在足够大容器内,或者进行布局约束,如下:

  1. Column() {
  2. // Button放在足够大的容器内,使其不影响更外层的组件位置
  3. Button("text")
  4. .type(ButtonType.Normal)
  5. .width(this.myWidth)
  6. .height(this.myHeight)
  7. }
  8. .margin(20)
  9. .width(200)
  10. .height(100)
  1. Button("area: click me")
  2. .fontSize(12)
  3. // 配置position属性固定,使自己的布局位置不被第一个Button的宽高影响
  4. .position({ x: "30%", y: 200 })
  5. .onClick(() => {
  6. animateTo({ duration: 1000, curve: Curve.Ease }, () => {
  7. // 动画闭包中根据标志位改变控制第一个Button宽高的状态变量,使第一个Button做宽高动画
  8. if (this.flag) {
  9. this.myWidth = 100;
  10. this.myHeight = 50;
  11. } else {
  12. this.myWidth = 200;
  13. this.myHeight = 100;
  14. }
  15. this.flag = !this.flag;
  16. });
  17. })

2.使用属性动画产生布局更新动画

属性动画是一种在HarmonyOS平台上用于实现动画效果的机制。属性动画可以对任意对象的属性进行动画操作,包括视图的位置、大小、透明度、颜色等属性。属性动画可以实现更灵活、更复杂的动画效果。

属性动画的接口为:

animation(value: AnimateParam)

案例

  1. @Entry
  2. @Component
  3. struct LayoutChange2 {
  4. @State myWidth: number = 100;
  5. @State myHeight: number = 50;
  6. @State flag: boolean = false;
  7. @State myColor: Color = Color.Blue;
  8. build() {
  9. Column({ space: 10 }) {
  10. Button("text")
  11. .type(ButtonType.Normal)
  12. .width(this.myWidth)
  13. .height(this.myHeight)
  14. // animation只对其上面的type、width、height属性生效,时长为1000ms,曲线为Ease
  15. .animation({ duration: 1000, curve: Curve.Ease })
  16. // animation对下面的backgroundColor、margin属性不生效
  17. .backgroundColor(this.myColor)
  18. .margin(20)
  19. Button("area: click me")
  20. .fontSize(12)
  21. .onClick(() => {
  22. // 改变属性值,配置了属性动画的属性会进行动画过渡
  23. if (this.flag) {
  24. this.myWidth = 100;
  25. this.myHeight = 50;
  26. this.myColor = Color.Blue;
  27. } else {
  28. this.myWidth = 200;
  29. this.myHeight = 100;
  30. this.myColor = Color.Pink;
  31. }
  32. this.flag = !this.flag;
  33. })
  34. }
  35. }
  36. }

在这里插入图片描述

?写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing?,不定期分享原创知识。
  • 想要获取个人更多完整鸿蒙最新VIP学习资料,请点击→全套鸿蒙HarmonyOS学习资料
  • 或者关注小编后私信回复【666】也可获取资料哦~~

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

/ 登录

评论记录:

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

分类栏目

后端 (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)

热门文章

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