HarmonyKit | 鸿蒙新特性实践:ToolCard 统一卡片布局设计迭代
HarmonyKit | 鸿蒙新特性实践ToolCard 统一卡片布局设计迭代卡片的困境工具卡片看起来是最简单的 UI 组件——一个图标、一个标题、一行描述。但当你的网格里有 10 张卡片每张卡片的描述文字长度从 8 个字到 21 个字不等时“简单就变成了棘手”。HarmonyKit 的卡片设计经历了两轮迭代。第一轮是先让它能跑——每个卡片自适应内容高度结果 2 列网格中同行两张卡片高度不齐参差感严重。第二轮是让它整齐——引入了固定高度、统一间距和主题色体系10 张卡片的视觉效果终于统一。项目仓库https://atomgit.com/VON-/harmony-kit迭代一宽度自适应 高度自适应最初的设计很简单——卡片宽度设为44%相对于 GridItem高度不指定靠内容自然撑开Column(){Text(icon).fontSize(32)Text(name).fontSize(14)Text(description).fontSize(11).maxLines(1)}.width(44%).padding(20)这个方案在工具只有 5 个时看起来还凑合。但当工具扩展到 10 个描述文字的差异性暴露了出来“文本与 Base64 互相转换”10 个汉字“二进制、八进制、十进制、十六进制互转”17 个汉字在 11px 的字体下17 个汉字在 44% 屏幕宽度的卡片中会换行。而 10 个汉字的不会。结果就是换行的卡片比不换行的卡片高出一行的高度。在 2 列网格中同一行的两张卡片高度不一致底部参差不齐。迭代二固定高度 柔和阴影 主题色第二版设计做了三个核心改动1. 固定高度 158vp.height(158).justifyContent(FlexAlign.Center)158vp 的选择是计算出来的top padding: 20vp图标圆形: 48vp图标底边距: 12vp名称文字行高: ~20vp名称底边距: 4vp描述文字最多两行: 11px × 1.5 行距 × 2 行 ≈ 33vpbottom padding: 20vp合计: 约 157vp → 取整 158vpjustifyContent(FlexAlign.Center)让短内容的卡片垂直居中而不是贴顶。这样即使内容只有一半高度卡片视觉上也平衡。2. 图标设计文字胜于图形HarmonyKit 的图标不是 PNG 文件而是一个带半透明底色圆的等宽文本Stack(){Circle().width(48).height(48).fill(this.tool.color18);Text(this.tool.icon).fontSize(18).fontWeight(FontWeight.Bold).fontColor(this.tool.color).fontFamily(monospace);}this.tool.color 18这个技巧值得展开。color是十六进制颜色字符串如#007aff。追加18变成了#007aff18——在十六进制中最后两位是 alpha 通道00-FF。18约等于 9% 的不透明度。这个半透明底色圆圈为卡片提供了柔和的视觉锚点比纯色填充精致得多。使用等宽字体文本作为图标好处是零资源文件——不需要 PNG/SVG 文件不增加 APK 体积随字号缩放——字体缩放时图标自动跟随动态换色——每个工具用自己的主题色不需要为每种颜色准备一份图标资源等宽字体保障了对齐——{}和/虽然宽度不同但monospace保证了每个字符占据相同宽度3. 主题色体系10 个工具各有独立的主题色JSON 格式化 #007aff 蓝色 — Apple 的系统蓝 Base64 编解码 #34c759 绿色 — 编解码安全绿色 时间戳转换 #ff9500 橙色 — 时间温暖橙色调 URL 编解码 #5856d6 紫色 — URL网页链接紫色 哈希计算 #ff3b30 红色 — 哈希指纹独一无二红色 UUID 生成器 #30b0c7 青色 — UUIDID冷静青色 颜色转换 #af52de 粉紫 — 颜色光谱粉紫 进制转换 #ff6482 粉红 — 进制数学活泼粉红 正则测试器 #30d158 翠绿 — 正则模式精确翠绿 文本统计 #ff9f0a 琥珀 — 统计数字琥珀配色原则相邻工具的颜色在色环上拉开至少 60 度防止混淆冷色调蓝/青/绿/紫和暖色调橙/红/粉红/琥珀交错排列每个颜色在白色背景上的对比度 4.5:1保证可读性卡片的阴影设计.shadow({radius:10,color:#0d000000,offsetX:0,offsetY:2})阴影参数经过了多次微调radius: 10足够大的模糊半径让阴影看起来柔和不像是硬边框color: #0d000000纯黑色 5% 不透明度。比默认的#1a00000010%更轻在白色背景上若有若无offsetY: 2轻微偏下模拟顶光照下物体的自然投影这个阴影组合在浅灰色背景#f5f5f5上创造了微妙的浮起感——卡片似乎在背景上方 1-2mm 处悬浮。但如果背景也是白色阴影效果会被弱化。这就是为什么主页背景必须是浅灰而非纯白。名称文字的单行截断Text(this.tool.name).fontSize(14).maxLines(1).textOverflow({overflow:TextOverflow.Ellipsis})工具名称都是精心控制在 10 个字符以内的短文本。“JSON 格式化”“Base64 编解码”“时间戳转换”——最长的是时间戳转换5 个字在 14px 字体下约 70px 宽。卡片宽度约 170px足够容纳。但为了防御未知的长名称仍然设置了maxLines(1) 省略号截断。描述文字的两行限制Text(this.tool.description).fontSize(11).maxLines(2).lineHeight(16).textOverflow({overflow:TextOverflow.Ellipsis}).textAlign(TextAlign.Center)maxLines(2)配合lineHeight(16)让描述区域最多占据 32vp 的高度。超过两行的文字被截断为省略号。居中对齐让描述在卡片宽度内水平居中视觉上更平衡。为什么是 2 行而不是 1 行因为有的描述比较长“二进制、八进制、十进制、十六进制互转需要两行才能完整展示。如果限制为 1 行用户只能看到被截断的二进制、八进制、十进制…”——丢失了关键信息。卡片的交互反馈HarmonyKit 的卡片在点击时提供路由跳转.onClick((){this.getUIContext().getRouter().pushUrl({url:this.tool.routerPath});})使用this.getUIContext().getRouter()而非全局router.pushUrl()——这是鸿蒙路由 API 演进后的推荐写法。UI 上下文绑定的路由实例在多窗口场景下行为正确而全局 router 可能路由到错误的窗口。Grid 布局的配合ToolCard 的width(100%)配合 Grid 的columnsTemplate(1fr 1fr)Grid(){ForEach(TOOL_LIST,(tool:ToolItem){GridItem(){ToolCard({tool:tool})}})}.columnsTemplate(1fr 1fr).columnsGap(12).rowsGap(12)Grid 平均分配两列每列宽度 (screenWidth - 左右padding - gap) / 2。卡片的width(100%)填充 GridItem 的全部可用宽度。columnsGap和rowsGap定义卡片之间的间距——12vp 是一个经验值既不显得拥挤也不浪费空间。项目仓库https://atomgit.com/VON-/harmony-kit

相关新闻

如何快速提升视频画质:终极AI媒体增强指南

如何快速提升视频画质:终极AI媒体增强指南

如何快速提升视频画质:终极AI媒体增强指南 【免费下载链接】Waifu2x-Extension-GUI Video, Image and GIF upscale/enlarge(Super-Resolution) and Video frame interpolation. Achieved with Waifu2x, Real-ESRGAN, Real-CUGAN, RTX Video Super Resolution VSR, S…

2026/7/6 1:43:45阅读更多 →
AIGC 全生命周期风控拆解:企业应该先补哪块短板?

AIGC 全生命周期风控拆解:企业应该先补哪块短板?

从工程落地看,AIGC 全生命周期风控可以拆成三层:上线前的合规与安全准备,上线中的实时风控链路,上线后的运营闭环。企业先补哪块,不应按厂商能力清单决定,而应按系统风险缺口决定。生产级 AIGC 应用建议优先…

2026/7/7 2:33:26阅读更多 →
基于STM32单片机座位管理系统 图书馆智能选座设计4421(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于STM32单片机座位管理系统 图书馆智能选座设计4421(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于STM32单片机座位管理系统 图书馆智能选座设计4421(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 版本一 座位感应座位引导刷卡身份识别电机控制进出时间OLED液晶显示当前剩余座位数量、座位状态(是否占用)RC522射频…

2026/7/7 3:55:29阅读更多 →
“通感智融合”趋势下,工业无线通信如何做好支撑?

“通感智融合”趋势下,工业无线通信如何做好支撑?

2026年1月发布的《推动工业互联网平台高质量发展行动方案(2026—2028年)》专设“平台聚‘数’提‘智’行动”章节,明确提出“推进人工智能赋能工业互联网平台”,支持平台企业加快培育工业场景智能体,探索“平台场景智能…

2026/7/7 5:08:07阅读更多 →
OpenDesign与openEuler生态整合:打造统一的开源品牌形象

OpenDesign与openEuler生态整合:打造统一的开源品牌形象

OpenDesign与openEuler生态整合:打造统一的开源品牌形象 【免费下载链接】opendesign-resources The repository of OpenDesign resources 项目地址: https://gitcode.com/openeuler/opendesign-resources 前往项目官网免费下载:https://ar.opene…

2026/7/7 5:08:06阅读更多 →
【Springboot毕设全套源码+文档】基于springboot蔬菜超市系统的设计与实现(丰富项目+远程调试+讲解+定制)

【Springboot毕设全套源码+文档】基于springboot蔬菜超市系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/7 5:08:06阅读更多 →
OpenClaw极简AI智能体:飞书Bot快速接入实战指南

OpenClaw极简AI智能体:飞书Bot快速接入实战指南

1. 项目概述:OpenClaw不是另一个“大模型玩具”,而是普通人能亲手拧紧的AI螺丝刀 OpenClaw 这个名字刚出来的时候,我第一反应是——又一个套壳界面?点开 GitHub 仓库,看到那行“Minimalist AI Agent Framework for Re…

2026/7/7 5:08:06阅读更多 →
Seedance 2.5本地AI生图视频部署指南:免费开源一键安装

Seedance 2.5本地AI生图视频部署指南:免费开源一键安装

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看一个近期在AI生成领域引起关注的工具——Seedance 2.5。从标题就能看出,这是一个主打本地部署的AI生图和视频…

2026/7/7 5:08:06阅读更多 →
7 种方法将三星S26/S25/S24/S23手机视频传电脑

7 种方法将三星S26/S25/S24/S23手机视频传电脑

视频能够记录珍贵瞬间,方便和他人分享,但这类文件会大量占用三星手机存储空间,长期使用会导致设备运行卡顿、性能下降。想要让手机始终保持流畅运行,你需要定期把视频文件转移到电脑,释放 Galaxy 手机本地储存空间。但…

2026/7/7 5:03:06阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/7 4:43:43阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/7 2:56:31阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/7 1:03:28阅读更多 →
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8…

2026/7/7 0:02:41阅读更多 →
国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot) 🌐 演示地址:http://ruoyioffice.com | 📦 源码1GitHub:ruoyi-office | 📦 源码2GitCode:ruoyi-o…

2026/7/7 0:02:41阅读更多 →
CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS SSH连接故障排查:从基础检查到深度修复的完整指南引言当你尝试通过Xshell或其他SSH客户端连接CentOS服务器时,突然遭遇"Connection refused"或"Connection timed out"的错误提示,这种经历对任何运维人员或开发者来…

2026/7/7 0:02:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/6 4:45:01阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/6 4:45:01阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/6 4:45:03阅读更多 →