HarmonyOS应用开发实战:萌宠日记 - 统计卡片统一风格

发布时间:2026/7/22 11:48:56

HarmonyOS应用开发实战:萌宠日记 - 统计卡片统一风格
HarmonyOS应用开发实战萌宠日记 - 统计卡片统一风格前言统计卡片统一风格是数据统计页面保持视觉一致性的关键设计。在萌宠日记的StatisticsPage中所有统计卡片日记数量、心情分布、活动统计都采用相同的白色背景、16vp 圆角、轻微阴影、16vp 内边距确保用户在不同统计项之间切换时获得一致的视觉体验。这种组件化设计不仅提升了 UI 一致性还大幅减少了代码重复。本文将从萌宠日记中统计卡片统一风格的实现出发深入解析卡片样式规范、组件化封装、Builder 复用以及风格一致性的设计原则。一、统计卡片现状1.1 三张统计卡片萌宠日记的统计页面包含三张统计卡片卡片名称展示内容核心组件数据源日记数量本月记录数 柱状图Text ColumnState diaryCount心情分布心情占比 图例Circle TextState moodStats活动统计活动次数 图标Column TextState activityStats1.2 当前代码中的重复样式// 日记数量卡片 Column({ space: 8 }) { // 内容... } .width(100%) .backgroundColor(#FFFFFF) .borderRadius(16) .padding(16) .shadow({ radius: 4, color: #10000000, offsetY: 2 }) // 心情分布卡片重复的样式代码 Column({ space: 12 }) { // 内容... } .width(100%) .backgroundColor(#FFFFFF) .borderRadius(16) .padding(16) .shadow({ radius: 4, color: #10000000, offsetY: 2 }) // 活动统计卡片再次重复 Column({ space: 12 }) { // 内容... } .width(100%) .backgroundColor(#FFFFFF) .borderRadius(16) .padding(16) .shadow({ radius: 4, color: #10000000, offsetY: 2 })提示三张卡片的样式代码完全重复这是典型的代码冗余问题。通过组件化封装可以消除重复提升可维护性。二、统计卡片统一样式规范2.1 样式规范// 统计卡片的统一风格定义 const CARD_STYLE { backgroundColor: #FFFFFF, // 白色背景 borderRadius: 16, // 16vp 圆角 padding: 16, // 16vp 内边距 shadow: { radius: 4, color: #10000000, offsetY: 2 }, // 轻微阴影 titleSize: 16, // 标题字号 titleWeight: FontWeight.Bold, // 标题字重 titleColor: #333333 // 标题颜色 }2.2 样式属性详解属性值作用backgroundColor#FFFFFF白色与页面背景#FFF8F0形成对比borderRadius16vp柔和圆角与全局卡片风格一致padding16vp内容与卡片边缘的呼吸空间shadow.radius4轻微模糊增加层次感shadow.color#1000000010% 透明度的黑色阴影柔和shadow.offsetY2向下偏移模拟自然光照三、Builder 封装复用3.1 卡片容器 Builder// 统计卡片容器 — 统一样式封装 Builder StatCard(title: string, content: () void) { Column({ space: 12 }) { // 统一标题 Text(title) .fontSize(16) .fontWeight(FontWeight.Bold) .fontColor(#333333) .width(100%) // 自定义内容区 content() } .width(100%) .backgroundColor(#FFFFFF) .borderRadius(16) .padding(16) .shadow({ radius: 4, color: #10000000, offsetY: 2 }) }3.2 使用卡片容器// 使用统一卡片容器 Scroll() { Column({ space: 16 }) { // 日记数量卡片 this.StatCard(日记数量, () { this.DiaryCountContent() }) // 心情分布卡片 this.StatCard(心情分布, () { this.MoodDistributionContent() }) // 活动统计卡片 this.StatCard(活动统计, () { this.ActivityStatsContent() }) } .padding({ left: 16, right: 16, top: 16, bottom: 24 }) }四、Component 组件化封装4.1 通用卡片组件Component export struct StatCard { Prop title: string Prop paddingValue: number 16 BuilderParam content: () void () {} build() { Column({ space: 12 }) { // 标题行 Text(this.title) .fontSize(16) .fontWeight(FontWeight.Bold) .fontColor(#333333) .width(100%) // 内容区 if (this.content) { this.content() } } .width(100%) .backgroundColor(#FFFFFF) .borderRadius(16) .padding(this.paddingValue) .shadow({ radius: 4, color: #10000000, offsetY: 2 }) } }4.2 组件使用示例// 日记数量卡片 StatCard({ title: 日记数量 }) { Row() { Column({ space: 4 }) { Text(本月记录).fontSize(13).fontColor(#999999) Row({ space: 4 }) { Text(18).fontSize(28).fontWeight(FontWeight.Bold).fontColor(#333333) Text(篇).fontSize(14).fontColor(#666666) } Text(比上月 6篇).fontSize(12).fontColor(#4CAF50) } Blank() // 柱状图 Row({ space: 4 }) { ForEach([3, 5, 4, 7, 6, 8, 5], (h: number) { Column().width(16).height(h * 8).backgroundColor(#F5A623).borderRadius(4) }) } .alignItems(VerticalAlign.Bottom).height(64) } .width(100%) }五、卡片标题统一规范5.1 标题样式规范// 所有统计卡片标题使用相同样式 Text(日记数量) .fontSize(16) // 16fp 标准标题字号 .fontWeight(FontWeight.Bold) // 加粗 .fontColor(#333333) // 深灰色 .width(100%) // 撑满宽度5.2 标题与内容间距Column({ space: 12 }) { // 标题与内容间距 12vp Text(日记数量) // 标题 .fontSize(16).fontWeight(FontWeight.Bold) // 内容区... }六、卡片内容区的差异化设计6.1 各卡片内容差异卡片内容布局差异化参数日记数量Row 左右分布左边数字 右边柱状图心情分布Row 左右分布左边饼图占位 右边图例活动统计Row 三列等宽layoutWeight(1) 等分6.2 差异化通过 BuilderParam 实现// 相同容器 不同内容 卡片复用 StatCard({ title: 日记数量 }) { this.DiaryContent() } StatCard({ title: 心情分布 }) { this.MoodContent() } StatCard({ title: 活动统计 }) { this.ActivityContent() }七、卡片间距控制7.1 卡片之间的间距// 卡片之间的间距由外层 Column 的 space 控制 Column({ space: 16 }) { // 卡片间距 16vp StatCard({ title: 日记数量 }) { ... } StatCard({ title: 心情分布 }) { ... } StatCard({ title: 活动统计 }) { ... } }八、卡片组件封装收益8.1 代码量对比实现方式每张卡片代码量总代码量维护成本重复编写8 行样式 内容24 行样式 3×内容高Builder 封装0 行样式8 行样式 (Builder)低Component 封装0 行样式20 行组件最低8.2 一致性收益视觉统一所有卡片使用完全相同的样式参数修改方便修改一处 Builder 或 Component所有卡片自动更新扩展简单新增统计卡片只需调用 StatCard 组件九、卡片阴影策略9.1 阴影与视觉层次// 统计卡片使用阴影突出 .shadow({ radius: 4, color: #10000000, offsetY: 2 }) // 背景卡片不使用阴影对比 // 内嵌卡片不使用阴影主要特点统计卡片使用阴影从页面背景中突出列表项不使用阴影保持视觉简洁阴影参数统一确保一致性9.2 萌宠日记中的阴影使用场景使用场景阴影配置设计意图统计卡片radius: 4, offsetY: 2从页面背景中突出宠物信息卡片radius: 4, offsetY: 2与统计卡片一致活动横幅卡片radius: 4, offsetY: 2突出推广内容列表项卡片无阴影保持视觉简洁内嵌卡片无阴影避免阴影叠加十、卡片内容的可访问性10.1 无障碍适配// 为统计卡片添加无障碍描述 StatCard({ title: 日记数量 }) { Column() .accessibilityText(日记数量统计卡片本月共18篇日记比上月增加6篇) }10.2 颜色对比度检查统计卡片中的颜色对比度需满足 WCAG 标准颜色组合用途对比度是否达标#FFFFFF背景 #333333文字标题10.6:1✅#FFFFFF背景 #999999文字辅助信息4.5:1✅#F5A623柱状图 #FFFFFF背景图表3.2:1⚠️ 边缘十一、卡片组件的测试11.1 单元测试// 统计卡片组件的测试用例 describe(StatCard, () { it(should render title correctly, () { // 验证标题显示 }) it(should render content correctly, () { // 验证内容渲染 }) it(should apply correct styles, () { // 验证样式应用 }) })十二、从设计稿到代码的映射12.1 设计稿规范设计稿规范代码实现对应属性卡片背景 #FFFFFFbackgroundColor(#FFFFFF)背景色圆角 16pxborderRadius(16)圆角阴影 Y:2, Blur:4shadow({ radius: 4, offsetY: 2 })阴影内边距 16pxpadding(16)内边距标题 16px BoldfontSize(16).fontWeight(Bold)标题12.2 设计与开发协同设计稿使用与代码一致的命名规范设计标注的数值单位与代码的 vp 保持一致设计稿提供明暗两种模式的卡片样式十、最佳实践10.1 卡片设计原则有序列表 — 卡片统一风格设计的 5 个原则统一容器样式所有同类型卡片使用相同的背景、圆角、阴影、内边距组件化封装使用 Builder 或 Component 封装卡片容器内容差异化通过 BuilderParam 插槽实现内容差异化统一标题规范所有卡片标题使用相同的字号、字重、颜色间距统一卡片内外间距保持一致10.2 萌宠日记统计卡片规范总结设计要素规范值说明背景色#FFFFFF白色圆角16vp统一圆角内边距16vp统一内边距阴影radius: 4, offsetY: 2轻微阴影标题字号16fp加粗标题颜色#333333深灰色标题-内容间距12vpColumn space卡片间距16vp外层 Column space总结本文从萌宠日记的统计卡片统一风格实现出发深入解析了卡片风格统一的完整方案样式规范白色背景 16vp 圆角 阴影 16vp 内边距Builder 封装通过 Builder 函数复用卡片容器Component 封装通用 StatCard 组件 BuilderParam 内容插槽标题统一16fp 加粗深灰色标题内容差异化相同容器不同内容通过参数化实现间距控制卡片内外间距统一封装收益减少代码量、提升一致性、降低维护成本通过组件化封装萌宠日记的统计页面实现了一处修改、处处生效的高效开发模式三张卡片在保持统一视觉风格的同时又能灵活展示不同的统计内容。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源Builder 装饰器https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-builderBuilderParam 装饰器https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-builderparamComponent 自定义组件https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-create-custom-components阴影属性https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-shadow-effect卡片设计指南https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/design-cards组件化设计https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/component-based-design布局基础https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkui-layout开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net

相关新闻

HarmonyOS应用开发实战:萌宠日记 - 热门话题标签云布局

HarmonyOS应用开发实战:萌宠日记 - 热门话题标签云布局

2026/7/22 11:48:56

HarmonyOS应用开发实战:萌宠日记 - 热门话题标签云布局 前言 热门话题标签云 是社区页面中展示 当前热门话题 的组件。在 萌宠日记 的 CommunityPage 中,话题标签使用 Flex FlexWrap.Wrap 实现 自动换行 布局,每个标签采用 圆角背景 橙色文…

深入解析以太网MAC硬件加速:VLAN哈希过滤与校验和卸载实战

深入解析以太网MAC硬件加速:VLAN哈希过滤与校验和卸载实战

2026/7/22 11:48:56

1. 以太网MAC核心功能与设计哲学在嵌入式网络开发中,直接操作硬件寄存器进行网络数据包处理是家常便饭。以太网MAC控制器作为连接CPU与物理网络的桥梁,其性能与功能直接决定了整个系统的网络吞吐量、延迟和CPU占用率。很多开发者可能只停留在调用Socket …

告别人工高危值守!冶金旋流井行车智能化改造,解锁无人高效作业新模式

告别人工高危值守!冶金旋流井行车智能化改造,解锁无人高效作业新模式

2026/7/22 11:48:56

在钢管冶金生产体系中,旋流井是废水、废渣沉淀分离的核心关键单元,而配套行车更是钢渣抓取、沥水转运、堆料外运的核心专用设备,直接影响整条产线的顺畅运行与生产安全。长期以来,传统旋流井行车高度依赖人工现场操作,…

MibSPI寄存器深度解析:从并行模式到多缓冲调度的嵌入式实战

MibSPI寄存器深度解析:从并行模式到多缓冲调度的嵌入式实战

2026/7/22 12:58:59

1. MibSPI核心价值与设计哲学:从标准SPI到高效数据引擎的演进 在嵌入式系统开发,尤其是汽车电子和工业控制领域,SPI(Serial Peripheral Interface)总线是我们与传感器、存储器、通信模块打交道的老朋友。它的全双工、主…

[高性能量化] 拒绝 API 超限与重复加载:用 Python + Redis + QuantDash 构建高频分钟线本地缓存层

[高性能量化] 拒绝 API 超限与重复加载:用 Python + Redis + QuantDash 构建高频分钟线本地缓存层

2026/7/22 12:58:59

TL;DR(一句话摘要) 在日内策略或分钟线级别的策略开发中,高频重复地从远程服务器请求大量的行情数据不仅会拖慢回测效率,更容易频繁触发服务商的 API 调用频率限制(Rate Limit)。本文分享一种在 Python 环…

深入解析TI TMS320F2837xS DSP的DCSM安全机制与ROM预取配置

深入解析TI TMS320F2837xS DSP的DCSM安全机制与ROM预取配置

2026/7/22 12:58:59

1. 项目概述与核心价值在工业控制、汽车电子这些对可靠性和安全性要求极高的领域,我们手里的那颗微控制器(MCU)早已不是简单的计算单元,它更像是一个需要严密守护的“数字堡垒”。最近在折腾TI的TMS320F2837xS系列DSP时&#xff0…

Claude Code与DeepSeek API集成开发指南

Claude Code与DeepSeek API集成开发指南

2026/7/22 12:58:59

1. Claude Code与DeepSeek集成方案概述 作为一名长期使用AI编程助手的开发者,我发现Claude Code与DeepSeek的集成确实能够显著提升编程效率。Claude Code作为终端内的AI编程助手,通过与DeepSeek API的结合,可以发挥出更强大的代码生成和理解能…

[套利实战] 跨市场/同板块配对交易:如何用 Python + QuantDash 快速搭建协整套利模型?

[套利实战] 跨市场/同板块配对交易:如何用 Python + QuantDash 快速搭建协整套利模型?

2026/7/22 12:58:59

TL;DR(一句话摘要) 配对交易(Pairs Trading)是量化投资领域最经典的市场中性(Market-Neutral)策略之一。本文展示如何利用 Python,配合金融数据平台 QuantDash 获取跨市场或同板块的强相关股票…

MIPI CSI-2接收器寄存器配置实战:从原理到调试的嵌入式视觉开发指南

MIPI CSI-2接收器寄存器配置实战:从原理到调试的嵌入式视觉开发指南

2026/7/22 12:48:58

1. 项目概述与核心价值搞嵌入式视觉系统,特别是摄像头驱动和图像采集,MIPI CSI-2接口是绕不开的一道坎。你可能在手机、行车记录仪、无人机或者工业相机里都见过它的身影。它本质上是一个高速、低功耗的串行接口,负责把图像传感器&#xff08…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/21 5:45:57

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/21 9:56:14

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/21 3:09:32

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

设计EDA 首席专家 12 维度 JD(HR 仅高管 / HRD 使用)

设计EDA 首席专家 12 维度 JD(HR 仅高管 / HRD 使用)

2026/7/22 0:08:09

定位:公司 EDA 技术最高负责人、技术天花板、战略级专家、流片总兜底人 属于P9/Fellow/ 首席科学家级,不做日常执行,管方向、管架构、管风险、管突破。1. 对标层级内部职级:P9 / 首席专家 / Fellow 外部对标:华为 20–…

费用率无法实时监控怎么办?费用率联动预算管理怎么实现?

费用率无法实时监控怎么办?费用率联动预算管理怎么实现?

2026/7/22 0:08:09

很多企业费用管控存在严重滞后性:日常差旅、招待、营销、人力费用持续发生,但费用率只能等到月末结账、营收数据出来后才能计算核对,月度中途费用超标、营收不达标导致的费用率失衡完全无法感知。等到月末发现整体费用率远超预算目标时&#…

设计EDA 研发总监 12 维度 JD(HR 内部仅高管层使用)

设计EDA 研发总监 12 维度 JD(HR 内部仅高管层使用)

2026/7/22 0:08:09

定位:公司 EDA / 设计平台最高管理岗,技术 管理 经营三重决策,对整体流片、效率、质量、成本、团队负最终责任1. 对标层级内部职级:M3 / P8 / 总监级 外部对标:华为 20 级、互联网 M2 / 总监、头部芯片 / EDA 公司研…