发布时间:2026/7/23 22:18:01
HarmonyOS7 宽度动画与进度条:animateTo 驱动百分比宽度变化 文章目录前言效果展示布局方案代码详解状态变量进度条组件百分比数字控制按钮数字滚动动画进阶样式渐变色进度条条纹动画分段进度条常见问题写在最后前言进度条是 UI 里最常见的动画场景之一——下载进度、上传进度、表单填写完成度。ArkUI 里做进度条动画有个很巧的方式用width百分比配合animateTo框架自动在两个百分比之间做过渡动画。今天来实现一个带按钮控制的进度条把宽度动画和 Stack 布局结合起来。效果展示一个圆角进度条底部有 25%、50%、75%、100% 四个按钮。点击按钮后进度条平滑填充到对应比例中间显示百分比数字。布局方案进度条的布局用Stack叠放两层┌──────────────────────────────────┐ │ [底层] 灰色背景条100%宽 │ │ [顶层] 蓝色进度条N%宽 │ └──────────────────────────────────┘底层是固定宽度的灰色条顶层是动态宽度的彩色条。两层都用borderRadius(15)做圆角高度 30 的一半。代码详解状态变量EntryComponentstruct WidthProgressBar{StatebarWidth:number0StatetargetPercent:number0// ...}barWidth驱动进度条的宽度百分比targetPercent记录目标值用于显示数字。进度条组件Stack({alignContent:Alignment.Start}){// 底层灰色背景Column().width(100%).height(30).backgroundColor(#E8E8E8).borderRadius(15)// 顶层蓝色进度Column().width(${this.barWidth}%).height(30).backgroundColor(#4D96FF).borderRadius(15).animation({duration:800,curve:Curve.EaseInOut})}.width(100%)几个细节值得注意Alignment.StartStack 默认居中对齐但进度条需要从左边开始填充所以设为Start左对齐。宽度用百分比字符串${this.barWidth}%生成50%这样的字符串。ArkUI 的width支持百分比值会自动按父容器宽度计算。animation声明式动画barWidth变化时宽度自动做 800ms 的EaseInOut过渡。百分比数字Text(${this.targetPercent}%).fontSize(20).fontWeight(FontWeight.Bold).fontColor(#4D96FF).margin({top:12}).textAlign(TextAlign.Center).width(100%)居中显示当前进度百分比。注意这个数字是瞬切的——targetPercent直接赋值没有做动画。如果想要数字也平滑变化需要额外的处理。控制按钮Row({space:8}){ForEach([25,50,75,100],(val:number){Button(${val}%).onClick((){this.targetPercentvalanimateTo({duration:800,curve:Curve.EaseInOut},(){this.barWidthval})})})}.width(100%).justifyContent(FlexAlign.SpaceEvenly).margin({top:16})用ForEach遍历[25, 50, 75, 100]数组为每个值生成一个按钮。点击时同时更新targetPercent瞬切和barWidth带动画。数字滚动动画如果想让百分比数字也平滑变化从 25 滚动到 75可以用定时器模拟Button(50%).onClick((){consttarget50animateTo({duration:800,curve:Curve.EaseInOut},(){this.barWidthtarget})// 数字滚动constintervalsetInterval((){if(this.targetPercenttarget){this.targetPercent}elseif(this.targetPercenttarget){this.targetPercent--}else{clearInterval(interval)}},16)// 约 60fps})每 16ms 更新一次数字800ms 内从旧值滚动到新值。进阶样式渐变色进度条Column().width(${this.barWidth}%).height(30).linearGradient({angle:90,colors:[[#4D96FF,0],[#6BCB77,1]]}).borderRadius(15)进度条从左到右做蓝绿渐变比纯色更有设计感。条纹动画Column().width(${this.barWidth}%).height(30).backgroundColor(#4D96FF).backgroundImageSize({width:30,height:30}).borderRadius(15)配合backgroundImage和backgroundPosition的动画可以做出 iOS 风格的条纹进度条。分段进度条把进度条分成多段每段颜色不同范围颜色含义0~30%红色危险30~70%橙色警告70~100%绿色安全常见问题Q宽度用百分比和用数值有什么区别百分比值50%是相对于父容器宽度的数值100是绝对 vp 值。做进度条用百分比更方便因为不需要知道父容器的具体宽度。Q为什么进度条回退时也有动画animateTo不管是从大到小还是从小到大变化都会做过渡动画。如果不想回退有动画可以在回退时不调animateTo直接赋值。800ms 的进度条动画时长在大多数场景都合适。如果是实时进度比如下载进度不应该用animateTo而是直接更新值——因为进度值本身就在高频变化每次变化都触发 800ms 动画会导致严重的延迟。写在最后宽度动画配合百分比值是做进度条的最简方案。Stack叠放两层 .animation()声明式动画代码不到 20 行就能做出一个带过渡效果的进度条。关键是要用Alignment.Start让进度条从左开始填充不然默认居中对齐会变成中间向两边扩展的效果。

相关新闻

2026/7/23 22:18:01

【黑金云课堂】FPGA技术教程Vitis开发:SD卡WAV文件读取音频播放实验

基于FPGA的简易音乐播放器实验 一、实验概述与技术基础 本实验基于 FPGA 纯硬件逻辑实现无操作系统的简易音乐播放器,通过 SPI 接口读取 SD 卡数据,以裸扇区搜索方式定位 WAV 音频文件,最终驱动 WM8731 音频编解码芯片完成实时播放。方案具备…

2026/7/23 22:18:01

AI 对话中的 Markdown 渲染:安全解析与代码高亮的前端实践

AI 对话中的 Markdown 渲染&#xff1a;安全解析与代码高亮的前端实践 一、模型输出原始文本的那一刻&#xff0c;危险就开始了 模型生成到一半突然吐出一段 </div><script>alert(1)</script>。前端没消毒直接 innerHTML 注入&#xff0c;整个对话页弹满警告…

2026/7/23 22:18:01

HarmonyOS7 弹簧弹性动画:Curve.FastOutSlowIn 实现弹性回弹效果

文章目录前言效果展示实现原理Curve.FastOutSlowIn圆角变化的"形变"效果代码详解状态变量动画组件弹簧右移弹簧回弹弹性缩放全部恢复真正的弹簧动画常见问题写在最后前言 弹簧动画是一种"物理感"很强的动画效果——方块移动到目标位置后不是直接停住&…

2026/7/24 1:08:14

集合详解(五):集合嵌套与Collections工具类

一、集合嵌套1、HashMap嵌套HashMap<span style"font-size:18px;"> /** HashMap嵌套HashMap* * * * 先存储元素&#xff0c;然后遍历元素*/public void test3(){// 创建集合对象HashMap<String, HashMap<String, Integer>> czbkMap new HashMap&l…

2026/7/24 1:08:14

doom3 代码结构

doom3代码结构 code 原文地址 https://www.iddevnet.com/doom3/code.php &#xff0c; 原来 我认为这个网站已经倒闭了&#xff0c;毕竟从Doom4&#xff0c;quake4是2004,2005的&#xff0c; 关注的人太少了 &#xff0c;我觉得这些文章有助于对于doom3,代码的理解&#xff…

2026/7/24 1:08:14

Java DDD(领域驱动设计)

一句话核心&#xff1a; DDD&#xff08;领域驱动设计&#xff09;不是一套框架&#xff0c;而是一种代码组织哲学。它要求你用代码直接翻译业务语言&#xff0c;而不是把业务逻辑散落在增删改查&#xff08;CRUD&#xff09;里。 对于Java开发者&#xff0c;最经典的DDD范式就…

2026/7/24 1:08:14

MSPM0微控制器NONMAIN配置详解:从安全启动到量产避坑指南

1. 项目概述&#xff1a;为什么你需要关注MSPM0的NONMAIN配置&#xff1f;如果你正在使用德州仪器&#xff08;TI&#xff09;的MSPM0 L系列微控制器&#xff0c;并且你的产品即将进入量产阶段&#xff0c;或者你正在设计一个对安全性、可靠性和知识产权保护有要求的嵌入式系统…

2026/7/24 1:03:14

羽球搭子 HarmonyOS 实战(19):账号认证后的数据作用域

一、登录成功之后&#xff0c;真正困难的是“不串数据” 球友甲登录后创建了一场周末对局&#xff0c;退出账号&#xff0c;再让球友乙登录同一台设备。如果页面仍然显示甲的对局、邀请码或个人胜率&#xff0c;认证虽然成功&#xff0c;数据边界却已经失效。账号系统不能只回…

2026/7/23 12:54:51

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/24 0:03:10

不同品牌斜齿行星减速机如何替换?以PX与PAG系列为例

不同品牌斜齿行星减速机如何替换&#xff1f;以 PX 与 PAG 系列为例 一、系列对应不等于型号直接互换 PX 与 PAG 都属于斜齿、方法兰、输出轴式精密行星减速机&#xff0c;结构形式和应用方向具有对应关系。 原设备使用PX系列时&#xff0c;可以优先从PAG系列中寻找替换型号。但…

2026/7/24 0:03:10

jdk8 把list 扁平化成String 多个以逗号分隔

在 JDK 8 中&#xff0c;将 List 扁平化为以逗号分隔的 String&#xff0c;有几种非常简洁且高效的方法。&#x1f680; 推荐方案&#xff1a;使用 Collectors.joining()这是最标准的 Java 8 写法&#xff0c;适用于 List<String>。javaimport java.util.stream.Collecto…

2026/7/24 0:03:10

java 两个 long id 怎么合并成一个long id 并且不重复

“把两个 Long ID 合并成一个唯一的 Long ID&#xff0c;且保证不重复”这个需求&#xff0c;在 Java 里直接做数学上的“完美合并”是不可能的。因为两个 Long&#xff08;各 64 位&#xff09;要合并成一个 Long&#xff08;64 位&#xff09;&#xff0c;在信息论上是有损压…

2026/7/23 23:42:43

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…