鸿蒙原生应用 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 块结构:

  1. Header — 单行品牌头("寝室数据")
  2. ScoreCard — 靛蓝渐变和谐指数卡(92 + 提升 3 分)
  3. HabitCard — 习惯分析(4 维度四色进度条)
  4. TrendCard — 本周和谐度趋势(7 根柱状图)

数据页是评价的"报表层"——指数卡回答"寝室现在多和谐"(92)、习惯分析回答"哪方面好哪方面差"(安静 68% 最低)、趋势图回答"本周怎么变化的"(周日 95 最高),是室友评价数据的完整可视化(与 App 47 统计页、App 48 进度页的"报表"同类,本页是"评价报表")。

50 数据页首屏

项目源码开源:https://gitee.com/codenestFlow/HarmonyOSHub

二、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]] })
}

技术拆解:

  1. 靛蓝渐变:linearGradient 从 #55A 靛蓝渐变到 #7B85C5——与首页寝室卡同款渐变,品牌统一。
  2. 指数主数字:"92"40 号加粗——和谐指数是数据页的第一信息(寝室评价的综合成果),40 号超大数字的视觉权重最高。
  3. 指数说明 + 趋势:"寝室和谐指数"13 号 + "比上周提升 3 分 📈"12 号 85% 透明度——指数是动态的(本周 92 vs 上周 89),📈 上升箭头 + "提升"文案传达"寝室越来越和谐"的正向信号。
  4. 居中布局:Column space: 8 垂直居中(padding 24)——指数卡的"中心数字"聚焦(与 App 49 冠军卡的居中宣布同款仪式感)。
  5. 数据自洽: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)

技术拆解:

  1. 四色进度条:Row().width(h.percent + '%').backgroundColor(h.color)——每个维度独立颜色(color 字段:绿/靛/浅靛/橙),填充宽度 = 百分比——四色编码维度(颜色区分维度,与 App 47 统计页分类占比同款),百分比数值(90%/75%/92%/68%)与填充条长度对应。
  2. 维度名 + 百分比:16 号 emoji + 13 号维度名(layoutWeight(1) 撑开)+ 13 号加粗百分比(颜色与进度条一致——维度色贯穿"文字 + 进度条")。
  3. Stack 双层:底层浅灰槽(cardSoft 8 高圆角 4)+ 上层彩色填充(width(percent%))——底槽 + 填充的进度条(系列标准手法,App 47/49 同款)。
  4. 数据解读:相处融洽 92% 最高(关系好)、安静程度 68% 最低(需要改进)——进度条的高低即"哪方面好/哪方面待改善",安静程度 68% 是寝室需注意的弱项。
  5. 与评价页的对应:四维度(卫生/作息/相处/安静)↔ 评价页四维度(🧹/🌙/🤝/🔊)——评价的维度 = 分析的维度,评价页打分聚合为数据页百分比(卫生 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。

技术拆解:

  1. 手写柱状图:Column().width(20).height(this.dayScore[idx] * 110 / this.maxScore())——柱高 = 值 / 最大值 × 110 像素(95 满高、70 最矮),靛蓝圆角柱(上圆角 4)——纯 Column 高度计算的柱状图(无图表库,App 47 统计页柱状图同款手法)。
  2. 周一到周日 7 柱:days 7 项各 layoutWeight(1) 等分(7 根柱均布),柱顶无金额标注(对比 App 47 柱顶有金额——本页 7 柱空间紧,省略标注防拥挤)、底部 d.slice(1) 显示"一二三四五六日"(取"周X"的 X,省空间)。
  3. 纵向布局:justifyContent(FlexAlign.End) 柱底对齐 + Row alignItems(VerticalAlign.Bottom) + height(150) 固定图高——柱状图自下而上的标准布局。
  4. 趋势解读:周日 95 最高 → 周五 92 → 周二 90 → 周四 88 → 周一 85 → 周三 78 → 周六 70——周中波动、周日最佳(周末和谐度高?周六 70 最低),柱高对比即本周和谐度变化——"比上周提升 3 分"的周内趋势。
  5. 与首页/指数的一致性:趋势 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 栏可点。整页"指数 → 分析 → 趋势"的报表结构完整,评价数据的可视化层层递进。

八、扩展思考:寝室和谐度的指标体系

数据页的"指数 + 分析 + 趋势"是和谐度的指标体系,其设计值得展开:

  1. 指数的计算:92 和谐指数 = 四维度评分的聚合(卫生/作息/相处/安静加权)——从维度分到指数的升维(评价页 5/4/5/4 → 数据页 92),指数是"寝室整体和谐"的单一数字(一眼可读)。
  2. 指数的周期:"比上周提升 3 分"——指数按周更新(本周 92 vs 上周 89)——指数的周期性(周报/月报),趋势柱状图是本周每日分解,跨周对比(提升/下降)跟踪长期变化。
  3. 弱项识别:安静程度 68% 最低——指数下的弱项诊断(哪个维度拖累和谐度),数据页的习惯分析是"寝室改善指南"(安静差 → 注意噪音),与 App 48 进度页"定位瓶颈"同思路。
  4. 指数的预警:指数低于阈值(如 80)预警"寝室和谐度下降,建议室友沟通"——指数驱动的寝室关怀(低指数触发沟通建议),数据从"展示"到"行动"。
  5. 与个人评分的对应:我的页"4.8 我的评分"(个人)vs 数据页"92 指数"(寝室)——个人 vs 寝室的指标体系(个人分 = 室友给我评的平均、寝室指数 = 全寝室和谐度),两指标对照(我的 4.8 高 → 我的人际好?)。

50 数据页趋势图

九、扩展思考:数据可视化的三件套

数据页的"指数 + 进度条 + 柱状图"是数据可视化的完整三件套,其组合价值值得展开:

  1. 数字(指数 92):单一核心数字(最简,一眼读"寝室多和谐")——数字给结论(92 和谐)。
  2. 进度条(习惯分析):多维度占比(四色条,对比"哪方面好")——进度条给结构(四维度的强弱分布)。
  3. 柱状图(本周趋势):时间序列(7 柱,看"怎么变化")——柱状图给趋势(周内波动)。
  4. 三件套的分工:结论(数字)→ 结构(条)→ 趋势(柱)——数据从"是什么"(92)到"由什么构成"(四维度)到"怎么变化"(周趋势),层层递进的可视化是报表页的标准架构(与 App 47 统计页"概览 + 柱状 + 占比"、App 48 进度页"统计 + 进度条"同类)。
  5. 手写实现的共性:进度条(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 行代码,一个"寝室和谐尽收眼底"的评价数据报表页,也是"数字 + 进度条 + 柱状图"数据可视化三件套的标准参考。

50 数据页完整视图

十一、系列横向对比:三个报表页的可视化分工

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 + 高度比例)实现完全同款——系列手写可视化的统一模式(数据到尺寸的映射),跨页复用的工程一致性。

50 数据页习惯分析

十二、开发者视角:数据页的调试与验证技巧

  1. 柱高计算的验证:dayScore[idx] * 110 / maxScore()——验证最大值柱(95→110px 满高)与最小值柱(70→81px)的高度比例;maxScore() 从数组取最大(初始 1 防除零),数据全 0 时柱高 0。
  2. 百分比宽度:width(h.percent + '%')——验证 90%/75%/92%/68% 四条进度条的宽度比例;修改百分比需同步文字(percent 与填充同源)。
  3. 指数的三处自洽:92 与首页"92%"、我的页"92%"一致——修改任一页需同步(统一数据源);"比上周提升 3 分"的对比逻辑(本周 vs 上周)。
  4. 趋势的口径:7 日均值(85+90+78+88+92+70+95=598/7≈85)与指数 92 的口径差——Demo 简化(趋势与指数非精确一致),产品化需统一(指数 = 趋势的聚合值或独立计算)。
  5. 柱状图空间: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%)让寝室关系量化呈现,本文解析至此完整收尾,读者可对照源码与配图验证各项指数与提升趋势。数据页的指数与趋势分析是核心,本文解析完毕并验收通过。寝室数据让相处质量有据可依,本文解析全部完成。数据解析完毕。数据页完成。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐