鸿蒙HarmonyOS开发:如何灵活运用动画效果提升用户体验

news2024/11/15 10:32:10

文章目录

      • 一、动画概述
        • 1、动画的目的
      • 二、显式动画 (animateTo)
        • 1、接口
        • 2、参数
        • 3、AnimateParam对象说明
        • 4、示例
        • 5、效果
      • 三、属性动画 (animation)
        • 1、接口
        • 2、参数
        • 3、AnimateParam对象说明
        • 4、系统可动画属性
        • 4、示例
        • 5、效果

一、动画概述

动画的原理是在一个时间段内,多次改变UI外观,由于人眼会产生视觉暂留,所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧,对应一次屏幕刷新,而决定动画流畅度的一个重要指标就是帧率FPS(Frame Per Second),即每秒的动画帧数,帧率越高则动画就会越流畅。

ArkUI中,产生动画的方式是改变属性值且指定动画参数。动画参数包含了如动画时长、变化规律(即曲线)等参数。当属性值发生变化后,按照动画参数,从原来的状态过渡到新的状态,即形成一个动画。

UI(用户界面)中包含开发者与设备进行交互时所看到的各种组件(如时间、壁纸等)。属性作为接口,用于控制组件的行为。例如,开发者可通过位置属性调整组件在屏幕上的位置。

属性值的变化,通常会引起UI的变化。动画可在UI发生改变时,添加流畅的过渡效果。如果不加入动画,属性将在一瞬间完成变化。造成突兀感的同时,容易导致用户失去视觉焦点。

1、动画的目的
  • 使界面的过渡自然流畅。
  • 增强用户从界面获得的反馈感和互动感。
  • 在内容加载等场景中,增加用户的耐心,缓解等待带来的不适感。
  • 引导用户了解和操作设备。

在需要为UI变化添加过渡的场景,都可以使用动画,如开机、应用启动退出、下拉进入控制中心等。这些动画可向用户提供关于其操作的反馈,并有助于让用户始终关注界面。

二、显式动画 (animateTo)

提供全局animateTo显式动画接口来指定由于闭包代码导致的状态变化插入过渡动效。同属性动画,布局类改变宽高的动画,内容都是直接到终点状态,例如文字、Canvas的内容、linearGradient等,如果要内容跟随宽高变化,可以使用renderFit属性配置。

1、接口
animateTo(value: AnimateParam, event: () => void): void
2、参数
参数类型是否必填描述
valueAnimateParam设置动画效果相关参数。
event() => void指定动效的闭包函数,在闭包函数中导致的状态变化系统会自动插入过渡动画。
3、AnimateParam对象说明
名称类型是否必填描述
durationnumber动画持续时间,单位为毫秒。默认值:1000
temponumber动画播放速度,值越大动画播放越快,值越小播放越慢,为0时无动画效果。默认值:1
curveCurve 、 ICurve9+ 、 string动画曲线。默认值:Curve.EaseInOut
delaynumber动画延迟播放时间,单位为ms(毫秒),默认不延时播放。默认值:0
iterationsnumber动画播放次数。默认播放一次,设置为-1时表示无限次播放。设置为0时表示无动画效果。默认值:1
playModePlayMode动画播放模式,默认播放完成后重头开始播放。默认值:PlayMode.Normal
onFinish() => void动画播放完成回调。
4、示例
  • 实现应用欢迎页的动画效果
  • 延迟0.5s自动跳转到首页
  • @Styles装饰器、@Extend装饰器的使用
import router from '@ohos.router'

@Entry
@Component
struct AnimateTo {
  @State isShow: boolean = false
  @State title: string = '快速单词记忆神器'
  @State message: string = "Falling in love with memorizing words"

  onPageShow() {
    animateTo({
      duration: 800,
      onFinish: () => {
        setTimeout(() => {
          router.replaceUrl({
            url: "pages/Index"
          })
        }, 500)
      }
    }, () => {
      this.isShow = true
    })
  }

  build() {
    Column() {
      if (this.isShow) {
        Image($r("app.media.logo"))
          .logoStyle()
          .transition({
            type: TransitionType.Insert,
            opacity: 0,
            translate: { x: -160 }
          })
        Text(this.title)
          .titleStyle()
          .transition({
            type: TransitionType.Insert,
            opacity: 0,
            translate: { x: 160 }
          })
      }
      Blank()
      Text(this.message)
        .footerStyle()
    }
    .bgStyle()
  }
}

@Styles function bgStyle() {
  .width('100%')
  .height('100%')
  .backgroundImage($r('app.media.img_splash_bg'))
  .backgroundImageSize({ width: '100%', height: '100%' })
}

@Extend(Text) function titleStyle() {
  .fontSize(20)
  .fontColor(Color.White)
  .fontWeight(FontWeight.Bold)
  .margin({ top: 30 })
}

@Extend(Image) function logoStyle() {
  .width(90)
  .height(90)
  .margin({ top: 120 })
}

@Extend(Text) function footerStyle() {
  .fontSize(12)
  .fontColor('#546B9D')
  .fontWeight(FontWeight.Bold)
  .margin({ bottom: 30 })
}
5、效果

在这里插入图片描述

三、属性动画 (animation)

组件的某些通用属性变化时,可以通过属性动画实现渐变过渡效果,提升用户体验。支持的属性包括width、height、backgroundColor、opacity、scale、rotate、translate等。布局类改变宽高的动画,内容都是直接到终点状态,例如文字、Canvas的内容、linearGradient等,如果要内容跟随宽高变化,可以使用renderFit属性配置。

1、接口
animation(value:AnimateParam)
2、参数
参数类型是否必填描述
valueAnimateParam设置动画效果相关参数。
3、AnimateParam对象说明

同显式动画 (animateTo)

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

只对写在animation之前的属性生效,而对写在animation之后的属性无效。

@Entry
@Component
struct AnimationPage {
  @State message: string = 'Hello World'
  @State myWidth: number = 300;
  @State myHeight: number = 200;
  @State flag: boolean = false;
  @State myColor: Color = Color.Blue;
  build() {
    Column({space:20}) {
      Text(this.message)
        .textAlign(TextAlign.Center)
        .fontColor(Color.White)
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .width(this.myWidth)
        .height(this.myHeight)
        .backgroundColor(this.myColor)
        .animation({ duration: 1000, curve: Curve.Linear })

      Button("属性动画")
        .fontSize(16)
        .width(200)
        .onClick(() => {
          if (this.flag) {
            this.myWidth = 300;
            this.myHeight = 200;
            this.myColor = Color.Blue;
          } else {
            this.myWidth = 200;
            this.myHeight = 100;
            this.myColor = Color.Pink;
          }
          this.flag = !this.flag;
        })
    }
    .padding(20)
    .width('100%')
    .height('100%')
  }
}
5、效果

在这里插入图片描述

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

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

相关文章

QT使用ui文件创建窗口

目录 带ui文件 添加状态栏 资源文件的使用 添加文件资源 使用文件资源 带ui文件 编辑 添加状态栏 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);// 添加状态栏ui->statusbar->addWidget(new QLab…

codeforces查看题解

文章目录 1. 步骤一:右键单击箭头指向位置,根据提示打开链接2. 步骤二:左键单击箭头指向位置3. 结果:红线上方是参考代码,下方是测试样例4. 补充:① 右边这个方框可以筛选想要查看代码的状态(Accepted、Wro…

AI在医学领域:残差扩散模型预测特发性肺纤维化 (IPF)

关键词: IPF 进展预测、残差扩散模型、临床信息 特发性肺纤维化(Idiopathic Pulmonary Fibrosis,IPF)是一种严重且不可逆的肺部疾病,它会导致肺部组织出现瘢痕和增厚,从而引起呼吸困难。。及时对IPF进行治…

Unity入门4——常用接口

C#中常用类和接口 DateTime:表示某个时刻 DateTime.Now:拿到系统当前时间DtaTime.TimeOfDay:获取此实例当天的时间 Quaternion:用来旋转,采用四元数,由w(实部)和x,y,z(虚…

ChinaJoy 2024: 维塔士携自研游戏亮相,探讨数据驱动游戏开发

2024年7月30日,上海——全球领先的视频游戏开发公司维塔士精彩亮相第二十一届中国国际数码互动娱乐展览会(ChinaJoy),并首次公开自研游戏《唐传奇:琵琶行》DEMO试玩。在展会首日举办的2024中国游戏开发者大会(CGDC)上,来自维塔士西安工作室的执行制作人熊鹏昱受邀发表题为《维塔…

springboot的拦截器,监听器,过滤器,servlet的使用(三大组件)

目录 1. 拦截器1.1 简介1.2 使用 2. 监听器2.1 简介2.2 使用 3. 过滤器3.1 简介3.2 使用 4. servlet4.1 简介4.2 使用 5. 例子6. 心得 1. 拦截器 1.1 简介 Spring Boot 拦截器(Interceptor)是Spring MVC中用于在请求处理流程中执行某些操作的组件。它们…

Open3D 三维重建-Alpha Shapes (α-形状)

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.1.1函数 2.1.2参数详解 2.2完整代码 三、实现效果 3.1原始点云 3.2处理后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新…

08-PCB工程文件的创建

1.创建工程文件 2.创建原理图库 3.创建PCB元件库 4.创建原理图 5.创建PCB 6.改名,保持和项目名一致 最后save。

uniapp获取swiper中子组件的内容高度

swiper有默认高度,如果不单独设置一个具体高度&#xff0c;swiper后面的内容将不会展示 这里展示的例子是: swiper中放有一个子组件,想要完整展示子组件的内容&#xff0c;swiper就需要获取到子组件的内容高度并设置 <!-- 注意: 这里的单位是 px,不是rpx --><swiper…

【STM32】IO口取反 | 寄存器方式 | 异或运算符 | 原理

目录 STM32 IO口取反 | 寄存器方式 | 异或运算符 | 原理1. 引言2. GPIO基础知识2.1 GPIO概述2.2 STM32的GPIO架构2.3 GPIO寄存器简介 3. GPIO引脚取反原理3.1 寄存器操作实现取反3.2 异或运算符的应用 4. 示例代码4.1 基础示例&#xff1a;LED闪烁4.2 应用实例&#xff1a;继电…

大数据面试SQL(三):每分钟在线直播人数

文章目录 每分钟在线直播人数 一、题目 二、分析 三、SQL实战 四、样例数据参考 每分钟在线直播人数 一、题目 有如下数据记录直播平台主播上播及下播时间&#xff0c;根据该数据计算出平台每分钟的在线直播人数。 这里用主播名称做统计&#xff0c;前提是主播名称唯一…

【初阶数据结构题目】16.用队列实现栈

用队列实现栈 点击链接答题 思路&#xff1a; 出栈&#xff1a;找不为空的队列&#xff0c;将size-1个数据导入到另一个队列中。 入栈&#xff1a;往不为空队列里面插入数据 取栈顶元素&#xff1a; 例如&#xff1a; 两个队列&#xff1a; Q1&#xff1a;1 2 3Q2&#xff1a;…

『大模型笔记』从API到Agent:万字长文洞悉LangChain工程化设计

『大模型笔记』从API到Agent&#xff1a;万字长文洞悉LangChain工程化设计 具体内容来自&#xff1a;从API到Agent&#xff1a;万字长文洞悉LangChain工程化设计

Spring源码解析(30)之AOP拦截链执行过程

一、前言 在上一节中我们介绍了AOP动态代理对象的创建过程&#xff0c;并且看到了Spring AOP在生成calllBacks的时候第一个拦截器就是&#xff1a;DynamicAdvisorInterceptor&#xff0c;所以我们通过代理对象执行对应的方法的时候就如跳入到这个拦截器中&#xff0c;接下来我们…

【RISC-V设计-07】- RISC-V处理器设计K0A之CSR

【RISC-V设计-07】- RISC-V处理器设计K0A之CSR 文章目录 【RISC-V设计-07】- RISC-V处理器设计K0A之CSR1.简介2.顶层设计3.端口说明4.寄存器说明5.代码设计6.总结 1.简介 控制和状态寄存器&#xff08;Control and Status Register&#xff0c;简称CSR&#xff09;是用于控制和…

使用历史版本比对法排查C++程序中的内存泄漏问题

目录 1、问题描述 2、使用Process Explorer实时查看程序的虚拟内存占用 2.1、对于内存泄漏问题&#xff0c;需要查看程序占用的虚拟内存 2.2、Windows任务管理器中看不到程序进程占用的虚拟内存&#xff0c;使用Process Explorer工具可以看到 2.3、通过Process Explorer工…

通世智库:姚力渟——第一次走进缓和医疗

2024年7月9日&#xff0c;我因工作原因&#xff0c;第一次以工作者的视角走进了位于北京市中心最具盛名的协和医院缓和医疗门诊&#xff0c;亲临现场去感受缓和医疗给患者及家属的贴心温暖和有益帮助。在此之前&#xff0c;我是一个惧怕医院&#xff0c;并时刻抱着能不去医院就…

Waterfox水狐浏览器:追求性能与隐私的64位网络探索者

大家好&#xff0c;今天电脑天空要为大家详细介绍一款基于Mozilla Firefox源代码开发的浏览器——Waterfox&#xff08;水狐浏览器&#xff09;。它专为64位系统优化&#xff0c;致力于提供更快速、更高效的浏览体验&#xff0c;并高度重视用户隐私保护。 主要特点 1. 高性能…

Stable Diffusion绘画 | 图生图-批量处理

批量处理中&#xff0c;对待处理图片的要求&#xff1a;宽高比一致 修改提示词后批量处理 调整参数&#xff1a; 确保宽高与原图一致增加一定的重绘幅度 调整提示词信息&#xff1a; 批量处理后&#xff0c;出图如下所示&#xff1a; 修改模型后批量处理 恢复提示词&#xf…

【数学建模】 多模数据与智能模型

文章目录 多模数据与智能模型1. 数字图像处理与计算机视觉1.1 数字图像的表示与处理1.1.1 认识OpenCV1.1.2 色彩学1.1.3 常见图像操作 1.2 数字图像的特征点1.2.1 Sobel算子1.2.2 Canny算子1.2.3 Harris角点检测1.2.4 ORB特征点检测 1.3 计算机视觉1.3.1 卷积神经网络1.3.2 YOL…