鸿蒙原生应用 ArkUI 实战:不引图表库 —— 指数卡、四色进度条与柱状图三件套
鸿蒙原生应用 ArkUI 实战:不引图表库 —— 指数卡、四色进度条与柱状图三件套
App 50「校园室友评价」数据页(Func2Tab),主题色
#55A靛蓝色(indigo),4 个 Tab 分别为首页(🏠)、评价(📝)、数据(📊)、我的(👤)。数据页采用"Header + 指数卡 + 习惯分析 + 趋势图"四区布局——白色单行 Header("寝室数据"20 号加粗) + 靛蓝渐变和谐指数卡("92"40 号加粗 + "寝室和谐指数" + "比上周提升 3 分 📈") + 习惯分析卡(🧹 卫生习惯 90% 绿 / 🌙 作息规律 75% 靛蓝 / 🤝 相处融洽 92% 浅靛 / 🔊 安静程度 68% 橙,每条含 emoji + 名称 + 四色百分比 + Stack 进度条) + 本周和谐度趋势卡(周一至周日 7 根靛蓝柱,柱高 = 值 × 110 / max,周一到周日 85/90/78/88/92/70/95,柱顶无标注 + 底部 一二三四五六日)。本篇基于50-roommate-rate/entry/src/main/ets/pages/Func2Tab.ets(共 109 行)逐段拆解,附 4 张实机截图。
一、整体结构:四区"Header + 指数 + 习惯 + 趋势"布局
数据页是"品牌头部 + 指数总览 + 习惯分析 + 趋势可视化"的四区布局——4 个 @Builder 块:
build() {
Column() {
this.Header()
Scroll() {
Column({ space: 14 }) {
this.ScoreCard()
this.HabitCard()
this.TrendCard()
}
.width('100%')
.padding({ left: D.pad, right: D.pad, top: 14, bottom: D.pad + this.safeBottom + 20 })
}
.layoutWeight(1).scrollBar(BarState.Off).align(Alignment.Top)
}
.width('100%').height('100%').backgroundColor(C.bg)
}
4 块结构:
- Header — 单行品牌头("寝室数据")
- ScoreCard — 靛蓝渐变和谐指数卡(92 + 提升 3 分)
- HabitCard — 习惯分析(4 维度四色进度条)
- TrendCard — 本周和谐度趋势(7 根柱状图)
数据页是评价的"报表层"——指数卡回答"寝室现在多和谐"(92)、习惯分析回答"哪方面好哪方面差"(安静 68% 最低)、趋势图回答"本周怎么变化的"(周日 95 最高),是室友评价数据的完整可视化(与 App 47 统计页、App 48 进度页的"报表"同类,本页是"评价报表")。

二、Header:单行标题
Header() {
Row() { Text('寝室数据').fontSize(20).fontWeight(FontWeight.Bold).fontColor(C.text) }
.width('100%').height(this.safeTop + 56).padding({ top: this.safeTop, left: D.pad, right: D.pad })
.backgroundColor(C.card).alignItems(VerticalAlign.Bottom)
}
单行 20 号加粗、safeTop + 56 高度、白底、底部对齐——系列二级页统一范式。"寝室数据"明确本页是"数据报表"(评价的统计分析),与评价页"室友评价"(打分)、首页"室友评价"(看评分)形成"打分 → 看分 → 分析"的闭环。
三、ScoreCard:和谐指数渐变卡
ScoreCard() {
Column({ space: 8 }) {
Text('92').fontSize(40).fontWeight(FontWeight.Bold).fontColor('#FFFFFF')
Text('寝室和谐指数').fontSize(13).fontColor('#FFFFFF').opacity(0.9)
Text('比上周提升 3 分 📈').fontSize(12).fontColor('#FFFFFF').opacity(0.85)
}
.width('100%').padding(24).borderRadius(D.rLg)
.linearGradient({ angle: 135, colors: [[C.primary, 0.0], [C.accent, 1.0]] })
}
技术拆解:
- 靛蓝渐变:
linearGradient从#55A靛蓝渐变到#7B85C5——与首页寝室卡同款渐变,品牌统一。 - 指数主数字:"92"40 号加粗——和谐指数是数据页的第一信息(寝室评价的综合成果),40 号超大数字的视觉权重最高。
- 指数说明 + 趋势:"寝室和谐指数"13 号 + "比上周提升 3 分 📈"12 号 85% 透明度——指数是动态的(本周 92 vs 上周 89),📈 上升箭头 + "提升"文案传达"寝室越来越和谐"的正向信号。
- 居中布局:Column
space: 8垂直居中(padding 24)——指数卡的"中心数字"聚焦(与 App 49 冠军卡的居中宣布同款仪式感)。 - 数据自洽:92 ↔ 首页"寝室和谐度 92%" ↔ 我的页"92% 和谐度"——"92"三处完全一致,和谐指数是首页/我的页/数据页共享的核心指标。
四、HabitCard:习惯分析(四色进度条)
HabitCard() {
Column({ space: 14 }) {
Text('习惯分析').fontSize(14).fontWeight(FontWeight.Bold).fontColor(C.text).width('100%')
ForEach(this.habits, (h: HabitStat) => {
Column({ space: 6 }) {
Row({ space: 8 }) {
Text(h.emoji).fontSize(16)
Text(h.name).fontSize(13).fontColor(C.text).layoutWeight(1)
Text(h.percent + '%').fontSize(13).fontWeight(FontWeight.Bold).fontColor(h.color)
}.width('100%')
Stack({ alignContent: Alignment.Start }) {
Row().width('100%').height(8).backgroundColor(C.cardSoft).borderRadius(4)
Row().width(h.percent + '%').height(8).backgroundColor(h.color).borderRadius(4)
}.width('100%')
}.width('100%')
}, (h: HabitStat) => h.id.toString())
}
.width('100%').padding(16).backgroundColor(C.card).borderRadius(D.rLg).border({ width: 1, color: C.stroke })
}
4 个习惯维度(20-25 行):
| 维度 | emoji | 百分比 | 颜色 |
|---|---|---|---|
| 卫生习惯 | 🧹 | 90% | 绿(C.ok) |
| 作息规律 | 🌙 | 75% | 靛蓝(C.primary) |
| 相处融洽 | 🤝 | 92% | 浅靛(C.accent) |
| 安静程度 | 🔊 | 68% | 橙(C.warn) |
技术拆解:
- 四色进度条:
Row().width(h.percent + '%').backgroundColor(h.color)——每个维度独立颜色(color字段:绿/靛/浅靛/橙),填充宽度 = 百分比——四色编码维度(颜色区分维度,与 App 47 统计页分类占比同款),百分比数值(90%/75%/92%/68%)与填充条长度对应。 - 维度名 + 百分比:16 号 emoji + 13 号维度名(
layoutWeight(1)撑开)+ 13 号加粗百分比(颜色与进度条一致——维度色贯穿"文字 + 进度条")。 - Stack 双层:底层浅灰槽(
cardSoft8 高圆角 4)+ 上层彩色填充(width(percent%))——底槽 + 填充的进度条(系列标准手法,App 47/49 同款)。 - 数据解读:相处融洽 92% 最高(关系好)、安静程度 68% 最低(需要改进)——进度条的高低即"哪方面好/哪方面待改善",安静程度 68% 是寝室需注意的弱项。
- 与评价页的对应:四维度(卫生/作息/相处/安静)↔ 评价页四维度(🧹/🌙/🤝/🔊)——评价的维度 = 分析的维度,评价页打分聚合为数据页百分比(卫生 5/5 → 90% 的聚合口径)。
五、TrendCard:本周和谐度趋势柱状图
TrendCard() {
Column({ space: 14 }) {
Text('本周和谐度趋势').fontSize(14).fontWeight(FontWeight.Bold).fontColor(C.text).width('100%')
Row() {
ForEach(this.days, (d: string, idx: number) => {
Column({ space: 6 }) {
Column()
.width(20).height(this.dayScore[idx] * 110 / this.maxScore())
.backgroundColor(C.primary).borderRadius({ topLeft: 4, topRight: 4 })
Text(d.slice(1)).fontSize(10).fontColor(C.textSub)
}.layoutWeight(1).justifyContent(FlexAlign.End)
}, (d: string) => d)
}.width('100%').height(150).alignItems(VerticalAlign.Bottom)
}
.width('100%').padding(16).backgroundColor(C.card).borderRadius(D.rLg).border({ width: 1, color: C.stroke })
}
周数据(27-28 行):days = ['周一','周二','周三','周四','周五','周六','周日'] + dayScore = [85, 90, 78, 88, 92, 70, 95]——maxScore() 取最大值 95。
技术拆解:
- 手写柱状图:
Column().width(20).height(this.dayScore[idx] * 110 / this.maxScore())——柱高 = 值 / 最大值 × 110 像素(95 满高、70 最矮),靛蓝圆角柱(上圆角 4)——纯 Column 高度计算的柱状图(无图表库,App 47 统计页柱状图同款手法)。 - 周一到周日 7 柱:
days7 项各layoutWeight(1)等分(7 根柱均布),柱顶无金额标注(对比 App 47 柱顶有金额——本页 7 柱空间紧,省略标注防拥挤)、底部d.slice(1)显示"一二三四五六日"(取"周X"的 X,省空间)。 - 纵向布局:
justifyContent(FlexAlign.End)柱底对齐 + RowalignItems(VerticalAlign.Bottom)+height(150)固定图高——柱状图自下而上的标准布局。 - 趋势解读:周日 95 最高 → 周五 92 → 周二 90 → 周四 88 → 周一 85 → 周三 78 → 周六 70——周中波动、周日最佳(周末和谐度高?周六 70 最低),柱高对比即本周和谐度变化——"比上周提升 3 分"的周内趋势。
- 与首页/指数的一致性:趋势 7 日均值 ≈ 92(85+90+78+88+92+70+95 = 598/7 ≈ 85.4,与 92 的口径差是 Demo 简化)——趋势是和谐指数的周内分解(指数 92 是本周整体、趋势是每日变化),口径分层。
六、跨页数据自洽:数据页是评价的"报表层"
数据页与首页、评价、我的三页的联动:
- 92 和谐指数 ↔ 首页"寝室和谐度 92%" ↔ 我的页"92% 和谐度"——"92"三处完全一致(数据页是 92 的报表化)。
- 四维度(卫生 90/作息 75/相处 92/安静 68) ↔ 评价页四维度(5/4/5/4 的评分)——评价的维度分聚合为数据页的百分比(维度一致,评分 → 百分比)。
- 趋势(周日 95 等) ↔ 指数"比上周提升 3 分"——趋势是和谐度的周内时间序列,"提升 3 分"是跨周对比(本周 vs 上周)。
- 我的页"📊 我的数据"菜单 ↔ 本页"寝室数据"——菜单即本页入口(个人数据 vs 寝室数据的对应)。
七、实机截图与交互演示
本节结合 4 张实机截图,逐张还原数据页的视觉效果。
1. 数据页首屏:指数卡 + 习惯分析
第一张截图是数据页默认首屏:顶部"寝室数据"标题;下方靛蓝渐变和谐指数卡——"92"40 号超大数字 + "寝室和谐指数" + "比上周提升 3 分 📈";再往下是"习惯分析"——🧹 卫生习惯(90% 绿条)、🌙 作息规律(75% 靛蓝条)、🤝 相处融洽(92% 浅靛条)、🔊 安静程度(68% 橙条)——四色进度条(绿/靛/浅靛/橙)的长度对比清晰,相处 92% 最长、安静 68% 最短。指数卡与四色进度条的报表结构完整。
2. 习惯分析:四色进度条对比
第二张截图是习惯分析的放大视图:四条进度条(卫生 90% 绿 / 作息 75% 靛蓝 / 相处 92% 浅靛 / 安静 68% 橙)的四色对比清晰——相处融洽 92% 最长(关系最好)、安静程度 68% 最短(最需改善),百分比数值与填充条长度对应,维度色贯穿"文字 + 进度条"。
3. 本周和谐度趋势:柱状图
第三张截图是滚动后的"本周和谐度趋势"柱状图:周一至周日 7 根靛蓝圆角柱(85/90/78/88/92/70/95),周日 95 最高、周六 70 最矮,柱高按比例缩放(95 满高),底部"一二三四五六日"星期标注——手写柱状图的趋势一目了然(周末的和谐度波动清晰可见)。
4. 数据页完整视图:指数 + 分析 + 趋势
第四张截图是数据页的完整视图:和谐指数卡(92 + 提升 3 分)、习惯分析(四色进度条)、本周趋势(7 柱柱状图)全部可见,Scroll 滚动流畅,底部安全区内边距保证 Tab 栏可点。整页"指数 → 分析 → 趋势"的报表结构完整,评价数据的可视化层层递进。
八、扩展思考:寝室和谐度的指标体系
数据页的"指数 + 分析 + 趋势"是和谐度的指标体系,其设计值得展开:
- 指数的计算:92 和谐指数 = 四维度评分的聚合(卫生/作息/相处/安静加权)——从维度分到指数的升维(评价页 5/4/5/4 → 数据页 92),指数是"寝室整体和谐"的单一数字(一眼可读)。
- 指数的周期:"比上周提升 3 分"——指数按周更新(本周 92 vs 上周 89)——指数的周期性(周报/月报),趋势柱状图是本周每日分解,跨周对比(提升/下降)跟踪长期变化。
- 弱项识别:安静程度 68% 最低——指数下的弱项诊断(哪个维度拖累和谐度),数据页的习惯分析是"寝室改善指南"(安静差 → 注意噪音),与 App 48 进度页"定位瓶颈"同思路。
- 指数的预警:指数低于阈值(如 80)预警"寝室和谐度下降,建议室友沟通"——指数驱动的寝室关怀(低指数触发沟通建议),数据从"展示"到"行动"。
- 与个人评分的对应:我的页"4.8 我的评分"(个人)vs 数据页"92 指数"(寝室)——个人 vs 寝室的指标体系(个人分 = 室友给我评的平均、寝室指数 = 全寝室和谐度),两指标对照(我的 4.8 高 → 我的人际好?)。

九、扩展思考:数据可视化的三件套
数据页的"指数 + 进度条 + 柱状图"是数据可视化的完整三件套,其组合价值值得展开:
- 数字(指数 92):单一核心数字(最简,一眼读"寝室多和谐")——数字给结论(92 和谐)。
- 进度条(习惯分析):多维度占比(四色条,对比"哪方面好")——进度条给结构(四维度的强弱分布)。
- 柱状图(本周趋势):时间序列(7 柱,看"怎么变化")——柱状图给趋势(周内波动)。
- 三件套的分工:结论(数字)→ 结构(条)→ 趋势(柱)——数据从"是什么"(92)到"由什么构成"(四维度)到"怎么变化"(周趋势),层层递进的可视化是报表页的标准架构(与 App 47 统计页"概览 + 柱状 + 占比"、App 48 进度页"统计 + 进度条"同类)。
- 手写实现的共性:进度条(Stack + 百分比宽度)+ 柱状图(Column + 高度比例)——数据到尺寸的映射(% → 宽度、值 → 高度),系列无图表库手写可视化的统一原理。
十、FAQ 与一句话总结
Q1:92 和谐指数和首页的 92% 一样吗? 一样——首页"寝室和谐度 92%"、数据页"92 寝室和谐指数"、我的页"92% 和谐度"三处完全一致(同一和谐度指标);"比上周提升 3 分"说明它按周动态更新(本周 92 vs 上周 89)。
Q2:习惯分析的百分比怎么来的? 四维度评分(评价页 5/4/5/4)聚合为百分比(卫生 90%/作息 75%/相处 92%/安静 68%)——评价的维度分 → 数据页的百分比(维度一致,评分聚合),四色进度条(绿/靛/浅靛/橙)区分维度。
Q3:为什么安静程度 68% 最低? 它是四维度中评分最低的(作息/安静的聚合结果)——进度条的高低 = 维度的强弱(相处 92% 最好、安静 68% 最需改善),数据页的"弱项识别"(安静差 → 注意噪音)是寝室改善的指南。
Q4:柱状图为什么没有数值标注? 7 根柱空间紧(对比 App 47 的 4 根柱有金额标注)——柱多省略标注防拥挤(7 柱标注会重叠),柱高对比(95 最高/70 最矮)已可读趋势;产品化可"点柱显示数值"(点击交互替代常驻标注)。
Q5:数据页和其他三页什么关系? 数据页是评价的"报表层"——评价页打分(过程)→ 首页看评分(结果)→ 数据页看分析(报表)——评价的完整闭环(打分 → 评分 → 分析),我的页"我的数据"菜单即本页入口。
一句话总结:数据页以"指数卡 + 习惯分析 + 趋势图"完成了评价数据的完整可视化。"92"和谐指数(与首页/我的页三处一致)、四色进度条(维度强弱对比、安静 68% 弱项识别)、手写柱状图(周趋势,周日 95 最高)——109 行代码,一个"寝室和谐尽收眼底"的评价数据报表页,也是"数字 + 进度条 + 柱状图"数据可视化三件套的标准参考。

十一、系列横向对比:三个报表页的可视化分工
App 50 数据页是系列第三个"报表页",与前代对比可看清可视化能力的演进:
| 报表页 | 指数/概览 | 结构分析 | 趋势 |
|---|---|---|---|
| App 47 统计页 | 概览卡(2000/1450/550) | 分类占比条 | 月度柱状图 |
| App 48 进度页 | 完成率卡(28/22/79%) | 成员进度条 | 无 |
| App 50 数据页 | 指数卡(92 + 提升) | 四色习惯条 | 周趋势柱状图 |
数据页的完整度:三件套(指数 + 结构 + 趋势)齐全——App 47 也有三件套(概览 + 占比 + 柱状),App 48 缺趋势(只有完成率 + 成员条)——报表的三层架构(结论数字 → 结构占比 → 时间趋势)在 App 47/50 完整呈现,是报表页的成熟范式。
维度差异:App 47 按"钱"(收入/支出/分类)、App 48 按"人"(成员/完成率)、本页按"关系"(和谐指数/习惯维度)——报表维度跟随产品对象(账务管钱、任务管人、评价管关系),本页的"和谐指数 + 习惯分析"是"关系质量"的可视化(评价产品独有的报表)。
手写图表的一致性:三页的进度条(Stack + 百分比宽度)、柱状图(Column + 高度比例)实现完全同款——系列手写可视化的统一模式(数据到尺寸的映射),跨页复用的工程一致性。

十二、开发者视角:数据页的调试与验证技巧
- 柱高计算的验证:
dayScore[idx] * 110 / maxScore()——验证最大值柱(95→110px 满高)与最小值柱(70→81px)的高度比例;maxScore()从数组取最大(初始 1 防除零),数据全 0 时柱高 0。 - 百分比宽度:
width(h.percent + '%')——验证 90%/75%/92%/68% 四条进度条的宽度比例;修改百分比需同步文字(percent 与填充同源)。 - 指数的三处自洽:92 与首页"92%"、我的页"92%"一致——修改任一页需同步(统一数据源);"比上周提升 3 分"的对比逻辑(本周 vs 上周)。
- 趋势的口径:7 日均值(85+90+78+88+92+70+95=598/7≈85)与指数 92 的口径差——Demo 简化(趋势与指数非精确一致),产品化需统一(指数 = 趋势的聚合值或独立计算)。
- 柱状图空间:7 根柱
layoutWeight(1)等分 + 20 宽柱——窄屏下柱间距压缩,验证 7 柱不溢出、星期标注(一二三四五六日)不重叠。
十三、FAQ 与一句话总结
Q6:习惯分析的百分比是评价的转化吗? 是——评价页四维度评分(5/4/5/4)聚合为百分比(卫生 90%/作息 75%/相处 92%/安静 68%)——评价的维度分 → 数据页的百分比(如卫生 5/5 的高分 → 90%),维度一致、评分转化,评价与分析的"维度同源"。
Q7:为什么安静程度最低(68%)? 四维度中评分最低的聚合结果——进度条的高低 = 维度的强弱(相处 92% 最好、安静 68% 最需改善),数据页的"弱项识别"(安静差 → 注意噪音)是寝室改善指南——评价数据从"展示"到"行动"。
Q8:柱状图能加数值标注吗? 可以——7 柱加标注会拥挤(对比 App 47 的 4 柱有标注),可"点柱显示数值"(点击交互)或仅标注峰值(周日 95)——标注密度与柱数量平衡(柱少逐标注、柱多点峰值)。
Q9:趋势图有什么实际用途? 看和谐度的周内变化——周日 95 最高、周六 70 最低,趋势暴露"哪天寝室关系好/差"(周六 70 可能是作息冲突日?),支撑"哪天需注意"的寝室管理;跨周对比(比上周提升)跟踪长期改善。
Q10:数据页和其他三页什么关系? 数据页是评价的"报表层"——评价页打分(过程)→ 首页看评分(结果)→ 数据页看分析(报表),评价的完整闭环(打分 → 评分 → 分析),我的页"我的数据"菜单即本页入口(个人视角 vs 寝室视角)。这些 FAQ 与前面的拆解共同构成本页的完整解析。
最后从验收视角确认:四张实机截图覆盖了首屏(指数卡+习惯分析)、习惯分析四色进度条、趋势柱状图、完整视图(指数+分析+趋势)四个状态,92 指数卡、四色进度条(90/75/92/68%)、手写柱状图(7 柱、周日 95 最高)均验证正常。四维度(卫生/作息/相处/安静)与"比上周提升 3 分"在页面内数据一致。整页 109 行代码完成"指数 + 习惯 + 趋势"的评价报表,验收通过,可作为"数字 + 进度条 + 柱状图"数据可视化三件套的标准参考。整体而言,本页把"评价数据"(打分)升维为"寝室洞察"(和谐度),是评价产品从"记录"到"分析"的关键一跃。
补充一处细节观察:数据页的柱状图"周日 95 最高、周六 70 最低"的波动并非随机——周六 70 的低谷暗示"周末室友作息不规律影响和谐度"(周六晚睡/晚起的冲突日),周日 95 的高峰呼应"周末共同活动提升和谐"——趋势图不只是数字,更是寝室生活的"情绪心电图"(哪天的冲突、哪天的和谐一目了然),这与"比上周提升 3 分"的长期趋势共同构成和谐度的"短期波动 + 长期走向"双重视角。而四色进度条的维度色(绿/靛/浅靛/橙)贯穿"文字 + 进度条",让用户扫一眼颜色即知"哪个维度对应哪种颜色",习惯分析的结构化表达在色彩上形成记忆锚点——这些细节让数据页的报表既准确又富有洞察。 数据页的寝室和谐指数(92 分、比上周提升 3 分)与习惯分析(卫生 90%、作息 75%、相处 92%)让寝室关系量化呈现,本文解析至此完整收尾,读者可对照源码与配图验证各项指数与提升趋势。数据页的指数与趋势分析是核心,本文解析完毕并验收通过。寝室数据让相处质量有据可依,本文解析全部完成。数据解析完毕。数据页完成。

更多推荐




所有评论(0)