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

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

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

前言

统计卡片统一风格是数据统计页面保持视觉一致性的关键设计。在萌宠日记StatisticsPage中,所有统计卡片(日记数量、心情分布、活动统计)都采用相同的白色背景、16vp 圆角、轻微阴影、16vp 内边距,确保用户在不同统计项之间切换时获得一致的视觉体验。这种组件化设计不仅提升了 UI 一致性,还大幅减少了代码重复。

本文将从萌宠日记中统计卡片统一风格的实现出发,深入解析卡片样式规范、组件化封装、@Builder 复用,以及风格一致性的设计原则。

一、统计卡片现状

1.1 三张统计卡片

萌宠日记的统计页面包含三张统计卡片:

卡片名称展示内容核心组件数据源
日记数量本月记录数 + 柱状图Text + Column@State diaryCount
心情分布心情占比 + 图例Circle + Text@State moodStats
活动统计活动次数 + 图标Column + Text@State activityStats

1.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 }) // 背景卡片不使用阴影(对比) // 内嵌卡片不使用阴影

主要特点:

  1. 统计卡片使用阴影,从页面背景中突出
  2. 列表项不使用阴影,保持视觉简洁
  3. 阴影参数统一,确保一致性

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 个原则:

  1. 统一容器样式:所有同类型卡片使用相同的背景、圆角、阴影、内边距
  2. 组件化封装:使用 @Builder 或 @Component 封装卡片容器
  3. 内容差异化:通过 @BuilderParam 插槽实现内容差异化
  4. 统一标题规范:所有卡片标题使用相同的字号、字重、颜色
  5. 间距统一:卡片内外间距保持一致

10.2 萌宠日记统计卡片规范总结

设计要素规范值说明
背景色#FFFFFF白色
圆角16vp统一圆角
内边距16vp统一内边距
阴影radius: 4, offsetY: 2轻微阴影
标题字号16fp加粗
标题颜色#333333深灰色
标题-内容间距12vpColumn space
卡片间距16vp外层 Column space

总结

本文从萌宠日记统计卡片统一风格实现出发,深入解析了卡片风格统一的完整方案:

  1. 样式规范:白色背景 + 16vp 圆角 + 阴影 + 16vp 内边距
  2. @Builder 封装:通过 Builder 函数复用卡片容器
  3. @Component 封装:通用 StatCard 组件 + @BuilderParam 内容插槽
  4. 标题统一:16fp 加粗深灰色标题
  5. 内容差异化:相同容器不同内容,通过参数化实现
  6. 间距控制:卡片内外间距统一
  7. 封装收益:减少代码量、提升一致性、降低维护成本

通过组件化封装,萌宠日记的统计页面实现了一处修改、处处生效的高效开发模式,三张卡片在保持统一视觉风格的同时,又能灵活展示不同的统计内容。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

  • @Builder 装饰器:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-builder
  • @BuilderParam 装饰器:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-builderparam
  • @Component 自定义组件: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
http://www.jsqmd.com/news/1241059/

相关文章:

  • 调查问卷设计核心要素与高级实践指南
  • 2026 年当下,平遥评价高的食堂冷库定做销售厂家格局重塑与选型新思路,冷库改造,如何让食材损耗降到最低? - 实业推荐官【官方】
  • 紧急通知:2024年NSFC申报季前必看——秘塔AI学术范围限定设置错误将导致查全率暴跌41%!
  • 杭州卖金维权指南:甄选正规认证黄金回收门店,透明金价抵制各类扣费套路 - 好物测评局
  • Cocos Creator 3.8 接入Taku
  • 心跳乱了几分钟自己好了,就没事了?阵发性房颤和持续性房颤
  • C++跨语言电子病历编辑器:高性能核心与多端集成架构解析
  • 短视频标题生成:从视频理解到文案策划的端到端工程
  • 定制珠宝展示柜材质都有哪些?开珠宝店必看!
  • AI论文写作工具对比:千笔AI与WPS AI功能解析
  • 数据库慢SQL优化研究:四步闭环方法论的构建与应用
  • 源码深入篇:RocketMQ 核心源码精读指南
  • ORXCIO_69性能优化工具部署与能效提升实践指南
  • 2026天津二奢门店甄选攻略!实体资质核验、靠谱商家筛选方法 - 日常比对手册
  • 2026企业网站建设|建站思路拆解+建站公司推荐
  • OpenCV 5.0 DNN引擎重构:AI模型部署性能提升与工程实践
  • JDK17在Windows11上的安装与配置指南
  • 手机隐私泄露的隐蔽信号与防护方案
  • YUM包管理工具:原理、实战与企业级应用
  • AI搜索选题到底靠直觉还是数据?揭秘头部平台内部使用的5维评估模型(含可落地的权重计算表)
  • AI芯片测试链核心技术:ATE、探针卡与测试座解析
  • 用 Mock 与契约测试缩短前后端联调周期
  • 2026南京黄金回收行业 “透明金价” 示范单位授牌:这6家门店实测零隐形扣费,守护金陵市民卖金权益 - 资讯洞察员
  • 2026智能体元年:从WAIC看AI Agent技术全景与工程实践
  • 2026双面铝合金保温板源头厂家推荐参考之河南博越铝业 - 起跑123
  • 基于YOLOv8的智能家居图纸识别技术解析
  • 机房GPU故障寄修实操指南|自查、送修、验收全步骤
  • C/C++从入门到精通:四阶段结构化学习路径与实战指南
  • 【开题神器】专业级AI论文软件:研究框架、文献综述一键搭建
  • 短波红外相机制冷温度的5个等级