情绪分布图表:Stack 进度条 + 百分比计算

前言

在"海风日记"的回顾页中,情绪分布图表通过 Stack 进度条展示了不同情绪的比例,让用户直观地了解自己的情绪趋势。

本文将从 ReviewTab.ets 源码出发,深入讲解进度条图表的实现。


一、情绪数据模型

typescript 复制代码
interface MoodDataItem {
  label: string      // 标签,如 "😊 开心"
  count: number      // 数量
  color: string      // 颜色
}

private moodData: MoodDataItem[] = [
  { label: '😊 开心', count: 8, color: COLOR_MOOD_SUNNY },
  { label: '🙂 还不错', count: 5, color: COLOR_PRIMARY },
  { label: '😐 平静', count: 4, color: COLOR_MOOD_CALM },
  { label: '😕 低落', count: 2, color: COLOR_MOOD_LOW },
  { label: '😢 难过', count: 1, color: COLOR_MOOD_SAD },
]

private totalCount: number = 20

二、进度条实现

typescript 复制代码
ForEach(this.moodData, (item: MoodDataItem) => {
  Row({ space: 10 }) {
    // 情绪标签
    Text(item.label).fontSize(13).fontColor(COLOR_TEXT_MAIN).width(80)

    // 进度条
    Stack({ alignContent: Alignment.Start }) {
      // 背景条
      Row().height(8).width('100%')
        .backgroundColor('rgba(200,180,140,0.15)')
        .borderRadius(4)

      // 前景条
      Row().height(8)
        .width(`${(item.count / this.totalCount) * 100}%`)
        .backgroundColor(item.color)
        .borderRadius(4)
    }
    .layoutWeight(1)

    // 数量
    Text(`${item.count}`)
      .fontSize(12).fontColor(COLOR_TEXT_SECONDARY).width(24).textAlign(TextAlign.End)
  }
  .width('100%').alignItems(VerticalAlign.Center)
}, (item: MoodDataItem) => item.label)

三、百分比计算

typescript 复制代码
// 宽度百分比
.width(`${(item.count / this.totalCount) * 100}%`)

四、情绪颜色

情绪 颜色常量 颜色
开心 COLOR_MOOD_SUNNY #F5A623
还不错 COLOR_PRIMARY #F5A623
平静 COLOR_MOOD_CALM #7ECAAE
低落 COLOR_MOOD_LOW #8BAFD6
难过 COLOR_MOOD_SAD #B0A8C8

五、常见问题

5.1 进度条宽度异常

问题:进度条宽度超过了 100%。

原因 :百分比计算错误,item.count / totalCount 大于 1。

解决方案 :确保 totalCount 是所有 item.count 的总和。


总结

本文通过"海风日记"的情绪分布图表,深入讲解了进度条的实现:

  1. Stack 叠加:背景条 + 前景条
  2. 百分比计算:动态宽度
  3. 情绪颜色:每种情绪对应颜色
  4. 数据模型:MoodDataItem 接口

下一篇文章将深入讲解 时间维度切换,敬请期待。

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


相关资源:

相关推荐
天空鸟_时光不老6 分钟前
01-我不转Python把AI塞进Java里
java·人工智能·spring boot·后端·spring·spring cloud·架构
hsfxuebao11 分钟前
Hermes Agent能力篇:会话、工具、MCP、记忆
人工智能·后端
vx_Biye_Design18 分钟前
flask学生课程笔记共享系统29026-计算机课程设计、毕业设计
java·javascript·spring boot·后端·elasticsearch·flask·课程设计
卷无止境18 分钟前
用Rust重写:三条清晰的收益曲线
后端·rust
深入云栈32 分钟前
Netty 4.2.x 源码深度解析 (十七):Channel 底层读写 —— Unsafe 的 I/O 操作内核
java·后端·架构
DS小龙哥36 分钟前
STM32+华为云IoT+Qt:手把手教你打造跨平台智能家居控制系统
后端
量化分析码农44 分钟前
【Python量化策略评估体系 #02】5 个因子,谁真贡献 Alpha?单因子归因 + MPA 多因子分解实战
后端
SimonKing1 小时前
Qoder中Qwen3.8-Flash 限时免费使用
java·后端·程序员
爱勇宝1 小时前
裁员裁掉了那个干了14年的人:我这才看清职场的5条潜规则
前端·后端·程序员