当前位置: 首页 > news >正文

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

文章目录

      • 一、动画概述
        • 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、效果

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用 Charles 模拟手机弱网测试
  • AppenTalk | 不止于赛场,巴黎奥运会上的中国AI科技
  • APP支付宝授权获取code uniapp
  • 案例 | 生产制造中的直线度测量
  • jmeter中添加集合点
  • 华为od面试经验2024-面经
  • CAD图纸加密软件有哪些?10款超级好用的CAD图纸加密软件推荐
  • 字符串算法
  • wangeditor编辑器自定义按钮和节点,上传word转换html,文本替换
  • 简单封装一个类似菜单栏的树状结构转换
  • VMware-Ubuntu共享文件找不到
  • 深入探索分布式任务调度框架:MySQL实现高效锁机制
  • 误删?损坏?SD卡数据恢复全攻略,让你的数据起死回生!
  • RK3568平台(PWM篇)PWM驱动
  • xss-靶场
  • 【Leetcode】104. 二叉树的最大深度
  • CSS 三角实现
  • CSS居中完全指南——构建CSS居中决策树
  • echarts花样作死的坑
  • If…else
  • Java-详解HashMap
  • js操作时间(持续更新)
  • Lsb图片隐写
  • node入门
  • Node项目之评分系统(二)- 数据库设计
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • PV统计优化设计
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • spring boot 整合mybatis 无法输出sql的问题
  • WebSocket使用
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 如何设计一个微型分布式架构?
  • 原生 js 实现移动端 Touch 滑动反弹
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 说说我为什么看好Spring Cloud Alibaba
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​字​节​一​面​
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (CPU/GPU)粒子继承贴图颜色发射
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (八十八)VFL语言初步 - 实现布局
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (六)DockerCompose安装与配置
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (四)Linux Shell编程——输入输出重定向
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)程序员技术练级攻略
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net 6.0 处理跨域的方式