鸿蒙原生应用 ArkUI 实战:笔记交换我的页 —— 获赞统计与渐变用户卡组合技

App 35「校园笔记交换」我的(ProfileTab),主题色 #9B51E0 紫罗兰。我的页采用"用户卡 + 统计 + 菜单 + About"四区布局——紫罗兰渐变 UserCard(✍️ 64 半透明圆形头像 + "笔记达人"标题 + "分享 12 份 · 获赞 89 次"副标题) + 悬浮 StatRow(margin -24 上移 + 12 我的笔记 / 89 获赞 / 24 收藏 / 38 下载 4 统计项) + MenuList 5 菜单项(📓 我的笔记 / ⭐ 我的收藏 / ⬇️ 下载记录 / 🏆 我的成就 / ⚙️ 设置,每项含 emoji + 标题 + ">" 箭头 + 0.5px Divider) + 底部 About("校园笔记交换" + "Version 1.0.0")。本篇基于 35-note-exchange/entry/src/main/ets/pages/ProfileTab.ets(约 100 行)逐段拆解,附 4 张实机截图。

一、整体结构:四区"用户卡 + 统计 + 菜单 + About"布局

App 35 我的页是"用户信息 + 数据统计 + 菜单导航 + 底部版本"的标准我的页——4 个 @Builder 块:

build() {
  Column() {
    Scroll() {
      Column() {
        this.UserCard()
        this.StatRow()
        this.MenuList()
        this.About()
      }
      .width('100%')
      .padding({ bottom: D.pad + this.safeBottom + 20 })
    }
    .layoutWeight(1).scrollBar(BarState.Off).align(Alignment.Top)
  }
  .width('100%').height('100%').backgroundColor(C.bg)
}

4 块结构:

  1. UserCard — 紫罗兰渐变用户卡
  2. StatRow — 悬浮 4 统计卡
  3. MenuList — 5 菜单列表
  4. About — 底部版本信息

与 App 34 我的页对比:

  • App 34:4 统计(18/156/42/9)+ 5 菜单(资料/下载/收藏/打印/设置)
  • App 35:4 统计(12/89/24/38)+ 5 菜单(笔记/收藏/下载/成就/设置)

"34 共享资料 vs 35 笔记社区"——"34 被下载 156、35 获赞 89"——"两个学习共享我的"——"34 重下载影响、35 重获赞社交"——"我的页的业务差异化"。

"35 我的页含成就菜单"——"🏆 我的成就"——"成就系统"——"笔记达人的勋章"——"激励体系"——"35 独有的菜单"——"学习激励"。

主题色 #9B51E0 紫罗兰——同首页/笔记/发布——"品牌色贯穿全 App"。

校园笔记交换我的首屏 · 紫罗兰渐变用户卡(✍️ 64圆头像+笔记达人+分享12份·获赞89次)+悬浮4统计(12我的笔记/89获赞/24收藏/38下载)+5菜单(📓我的笔记/⭐我的收藏/⬇️下载记录/🏆我的成就/⚙️设置)+底部About(校园笔记交换 Version 1.0.0)

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

二、UserCard:紫罗兰渐变用户卡

UserCard 是 紫罗兰渐变 + ✍️ 头像 + 用户名 + 副标题的渐变用户卡:

@Builder
UserCard() {
  Row({ space: 14 }) {
    Row() { Text('✍️').fontSize(32) }
    .width(64).height(64).backgroundColor('#33FFFFFF').borderRadius(32).justifyContent(FlexAlign.Center)
    Column({ space: 5 }) {
      Text('笔记达人').fontSize(18).fontWeight(FontWeight.Bold).fontColor('#FFFFFF')
      Text('分享 12 份 · 获赞 89 次').fontSize(12).fontColor('#FFFFFF').opacity(0.85)
    }.alignItems(HorizontalAlign.Start).layoutWeight(1)
  }
  .width('100%')
  .padding({ top: this.safeTop + 30, left: D.pad, right: D.pad, bottom: 44 })
  .linearGradient({ angle: 135, colors: [[C.primary, 0.0], [C.accent, 1.0]] })
}

UserCard 结构:

  • 外层:紫罗兰 135° 渐变背景(#9B51E0 → #BC85E8)+ 顶部 safeTop + 30 padding + 底部 44 padding
  • 内层 Row:64×64 半透明白圆头像(✍️ 32 号)+ 文字区("笔记达人" 18 号加粗 + "分享 12 份 · 获赞 89 次" 12 号 0.85 透明)

linearGradient({ angle: 135, colors: [[C.primary, 0.0], [C.accent, 1.0]] })——"紫罗兰 135° 渐变"——"#9B51E0 → #BC85E8"——"系列渐变统一"——"同首页/笔记"。

padding({ top: this.safeTop + 30, bottom: 44 }) 非对称 padding——"顶部安全区 + 底部 44 让位"——"44 = StatRow 悬浮占位"——"负 margin 重叠设计"。

Row().width(64).height(64).backgroundColor('#33FFFFFF').borderRadius(32) 头像——"64×64 半透明白圆"——"#33FFFFFF = 白 20% 透明"——"渐变上的半透明"——"borderRadius 32 = 圆形"。

Text('✍️').fontSize(32) 32 号书写 emoji——"笔记头像"——"✍️ = 书写/笔记"——"emoji 头像"——与 App 34 "📚"、App 33 "🚴" 对比——"业务 emoji 头像"——"头像 = 业务符号"。

Text('笔记达人').fontSize(18).fontWeight(FontWeight.Bold).fontColor('#FFFFFF') 18 号加粗白——"用户名"——"笔记达人 = 身份"——与 App 34 "学习分享者"、App 33 "骑行达人" 对比——"达人/分享者/用户"——"身份命名"——"35 = 笔记创作者"。

Text('分享 12 份 · 获赞 89 次').fontSize(12).fontColor('#FFFFFF').opacity(0.85) 12 号白 0.85 透明——"副标题"——"分享 12 份 + 获赞 89 次"——"贡献 + 社交"——"· 中点分隔"——与 App 34 "共享 18 份 · 获赞 89" 对比——"共享 vs 分享"——"获赞 89 一致"——"社交数据"。

"获赞 89 次" 的社交反馈——"笔记被点赞"——"创作者激励"——"UGC 社区的认可"——"获赞 = 内容价值"。

bottom: 44 底部 44 padding——"悬浮 StatRow 的关键"——"重叠设计"——"负 margin -24"。

与 App 34/33/32 UserCard 对比:

项目App 32App 33App 34App 35
渐变晴空蓝青蓝草绿紫罗兰
头像☂️🚴📚✍️
用户名雨伞用户骑行达人学习分享者笔记达人
副标题信用良好累计减碳共享 18 份获赞分享 12 份获赞 89

"四个共享/学习 App 用户卡"——"伞/车/书/笔"——"信用/减碳/获赞/获赞"——"业务的演进"——"35 = 笔记 + 社交"——"UGC 社区的完整"。

三、StatRow:4 统计悬浮卡

StatRow 是 margin -24 上移 + 4 统计项的悬浮统计卡:

@Builder
StatRow() {
  Row() {
    ForEach(this.stats, (s: StatItem) => {
      Column({ space: 4 }) {
        Text(s.value).fontSize(18).fontWeight(FontWeight.Bold).fontColor(C.text)
        Text(s.label).fontSize(11).fontColor(C.textDim)
      }.layoutWeight(1)
    }, (s: StatItem) => s.label)
  }
  .width('92%').padding({ top: 14, bottom: 14 })
  .backgroundColor(C.card).borderRadius(D.rMd).border({ width: 1, color: C.stroke }).margin({ top: -24 })
}

StatRow 结构:

  • 外层 Row:92% 宽 + 14 padding 上下 + 白底 + 14 圆角 + 1px 边框 + margin top -24
  • 内层 ForEach:4 个 Column(数值 + 标签)

margin({ top: -24 }) 负 margin 悬浮——"上移 24px"——"与 UserCard 重叠"——"悬浮立体"——"同 App 32/33/34"——"系列悬浮统一"。

width('92%') 92% 宽——"非满宽"——"两侧 4% 边距"——"卡片感"——"同系列"。

4 个统计项:

数值标签
12我的笔记
89获赞
24收藏
38下载

"12 我的笔记"——"发布的笔记数"——"贡献量"——"与副标题'分享 12 份'呼应"——"数据一致"。

"89 获赞"——"点赞总数"——"社交认可"——"与副标题'获赞 89 次'呼应"——"双处一致"。

"24 收藏"——"被收藏数"——"内容价值"——"收藏 = 认可"。

"38 下载"——"下载总数"——"内容热度"——"下载 = 实用"。

"4 项 = 4 维度":创作(12)+ 社交(89)+ 认可(24)+ 热度(38)——"4 维度的笔记画像"——"创作者的完整数据"——"UGC 社区的数据"。

Column({ space: 4 }).layoutWeight(1) 4 等分——"4 项等宽"——"layoutWeight 等权"——"公平展示"。

Text(s.value).fontSize(18).fontWeight(FontWeight.Bold) 18 号加粗黑数值——"数值焦点"——"12/89/24/38"——"纯数字"。

Text(s.label).fontSize(11).fontColor(C.textDim) 11 号灰标签——"标签次要"——"11 号小字"。

`StatItem 接口(2 字段):

interface StatItem { value: string; label: string; }

2 字段极简模型——"value + label"——"同 App 32/33/34"——"模型复用"。

与 App 34 StatRow 对比——"18/156/42/9 vs 12/89/24/38"——"两 App 4 统计"——"34 资料数据、35 笔记数据"——"统计 = 业务核心"。

下载记录菜单交互 · 点击第三项菜单"⬇️ 下载记录"后屏幕底部弹出"下载记录"Toast,演示下载历史入口的点击响应

四、MenuList:5 菜单列表

MenuList 是 5 个菜单项 + Divider 的菜单列表:

@Builder
MenuList() {
  Column() {
    ForEach(this.menus, (m: MenuItem, idx: number) => {
      Row({ space: 12 }) {
        Text(m.emoji).fontSize(18)
        Text(m.title).fontSize(14).fontColor(C.text).layoutWeight(1)
        Text('>').fontSize(14).fontColor(C.textDim)
      }
      .width('100%').padding({ left: 14, right: 14, top: 14, bottom: 14 })
      .onClick(() => { promptAction.showToast({ message: m.title }); })
      if (idx < this.menus.length - 1) { Divider().color(C.stroke).strokeWidth(0.5) }
    }, (m: MenuItem) => m.title)
  }.width('92%').margin({ top: 16 }).backgroundColor(C.card).borderRadius(D.rMd).border({ width: 1, color: C.stroke })
}

MenuList 结构:

  • 外层 Column:92% 宽 + margin top 16 + 白底 + 14 圆角 + 1px 边框
  • 内层 ForEach:5 个 Row(emoji + 标题 + 箭头)+ 条件 Divider

5 个菜单项(每项 3 要素):

emoji标题箭头
📓我的笔记>
⭐我的收藏>
⬇️下载记录>
🏆我的成就>
⚙️设置>

Text(m.emoji).fontSize(18) 18 号 emoji——"📓⭐⬇️🏆⚙️"——"5 个功能图标"——"笔记/收藏/下载/成就/设置"。

Text(m.title).fontSize(14).fontColor(C.text).layoutWeight(1) 14 号黑标题——"占据中间"——"菜单标题"。

Text('>') 箭头——"14 号灰"——"跳转箭头"——"通用符号"。

onClick(() => promptAction.showToast({ message: m.title })) 点击反馈——"整行可点"——"Toast 反馈"——"占位跳转"。

if (idx < this.menus.length - 1) { Divider() } 条件 Divider——"最后一项不画"——"0.5px 极细"——"5 项 4 分割"。

5 菜单的业务:

  • 📓 我的笔记(创作管理)
  • ⭐ 我的收藏(收藏夹)
  • ⬇️ 下载记录(下载历史)
  • 🏆 我的成就(成就系统)
  • ⚙️ 设置(通用)

"🏆 我的成就" 的特色——"成就系统"——"勋章/等级"——"学习激励"——"打卡/勋章"——"创作者激励"——"35 独有的菜单"——"游戏化设计"——"学习 Gamification"。

`MenuItem 接口(3 字段):

interface MenuItem { id: number; emoji: string; title: string; }

3 字段:id/emoji/title——"极简菜单模型"——"同 App 32/34"——"3 字段足够"。

我的收藏菜单交互 · 点击第二项菜单"⭐ 我的收藏"后屏幕底部弹出"我的收藏"Toast,演示菜单整行可点 + Toast 反馈

五、About:底部版本信息

About 是 **"校园笔记交换" + "Version 1.0.0"**的版本信息:

@Builder
About() {
  Column({ space: 4 }) {
    Text('校园笔记交换').fontSize(12).fontColor(C.textDim)
    Text('Version 1.0.0').fontSize(11).fontColor(C.textDim).opacity(0.7)
  }.width('100%').margin({ top: 24 })
}

About 结构:Column 垂直 + 4 间距 + 12 号 App 名 + 11 号版本号(0.7 透明)——"极简底部信息"。

"校园笔记交换" 全称——"与首页'笔记交换'简称对比"——"About 用全称"——"简称与全称"——"命名的场景"。

Text('Version 1.0.0').fontSize(11).opacity(0.7) 11 号灰 0.7 透明版本——"版本信息"——"系列 About 统一"。

margin({ top: 24 }) 24 顶部间距——"底部呼吸"——"与菜单间距"。

与 App 32/33/34 About 对比——"四个 App 的 About 同结构"——"系列 About 统一"——"版本信息规范"。

我的成就菜单交互 · 点击第四项菜单"🏆 我的成就"后屏幕底部弹出"我的成就"Toast,演示成就系统入口的点击响应

六、我的页的交互细节与可用性分析

6.1 渐变用户卡 vs 实色卡

UserCard 渐变 + StatRow/MenuList 实色——"渐变 = 焦点"——"实色 = 普通"——"层次用色彩"——"3 级视觉层级"。

6.2 悬浮统计的实现

margin -24 上移——"重叠立体"——"与用户卡重叠"——"悬浮层次"——"同 App 32/33/34"——"系列悬浮统一"。

6.3 4 统计的"创作者视角"

12 创作 + 89 获赞 + 24 收藏 + 38 下载——"4 维度"——"创作者数据"——"UGC 社区的激励数据"——"获赞 = 认可"。

6.4 成就系统的"游戏化"

🏆 我的成就——"成就系统"——"勋章/等级"——"学习激励"——"游戏化设计"——"创作者留存"——"35 的特色"。

6.5 获赞的"社交反馈"

获赞 89 次——"笔记被点赞"——"社交认可"——"创作者激励"——"UGC 生态"——"反馈的价值"。

6.6 我的页的"色彩心理学"

紫罗兰(#9B51E0)——"紫色 = 创作/知识"——"我的页的紫"——"笔记社区的紫色"——"可信赖"。

6.7 我的页的"信息层级"

L1 身份(UserCard)→ L2 数据(StatRow)→ L3 功能(MenuList)→ L4 关于(About)——"4 层信息"——"从身份到元信息"——"用户的金字塔"。

6.8 我的页的"设计哲学"

我的页的 3 个设计哲学:

  1. 身份优先——UserCard 顶部渐变最大
  2. 数据并列——4 统计等宽
  3. 激励完整——成就系统 + 获赞数据

"身份 + 数据 + 激励的我的"——"UGC 我的页的设计原则"——"从哲学看设计"。

6.11 我的页的"对比与统一"

统一:92% 宽 + 14 圆角 + 1px 边框(StatRow/MenuList)——"卡片统一"。 对比:UserCard 渐变 / StatRow 悬浮 / MenuList 平铺 / About 文字——"4 块差异"。

6.12 我的页的"终评"

用户卡 + 4 统计 + 5 菜单 + About = 完整我的页——"我的页的完成度"——"可上线级"——"系列 UGC 我的标杆"。

6.13 我的页的"emoji 体系"

✍️📓⭐⬇️🏆⚙️——"6 个 emoji"——"书写/笔记/收藏/下载/成就/设置"——"emoji = 功能"——"低成本图标"。

6.14 我的页的"数据一致性"

12 笔记(副标题 + 统计)——"跨区数据"——"89 获赞(副标题 + 统计)"——"双处一致"——"demo 数据严谨"。

6.15 我的页的"UGC 生态"

发布笔记(生产)→ 获赞(认可)→ 收藏(价值)→ 下载(实用)——"UGC 完整生态"——"创作者 + 消费者"——"社区的闭环"——"我的页数据即生态"。

6.17 我的页的"双激励"

获赞 89 + 成就系统——"双激励"——"社交认可 + 游戏成就"——"创作者留存"——"激励设计"——"UGC 黏性"。

6.18 我的页的"5 菜单管理"

笔记/收藏/下载/成就/设置——"5 个管理入口"——"创作管理"——"历史记录"——"成就激励"——"完整管理"。

6.19 我的页的"成就想象"

🏆 成就 = 等级勋章——"笔记达人 → 大神"——"成长体系"——"用户进阶"——"游戏化"——"留存设计"——"扩展空间"。

6.20 我的页的"emoji 语义"

✍️📓⭐⬇️🏆⚙️——"6 个功能 emoji"——"书写/笔记/收藏/下载/成就/设置"——"emoji = 功能识别"——"低成本图标"。

6.21 我的页的"拇指操作"

5 菜单在屏幕中下部——"拇指可达区"——"高频菜单居中"——"设置在最下"——"低频操作放底部"——"拇指设计"。

6.22 我的页的"数据来源"

12/89/24/38——"数据从哪来?"——"发布记录汇总"——"点赞统计"——"demo 静态数据"——"真实化路径"——"接口替换即活"。

6.23 我的页的"颜色一致性"

紫罗兰贯穿——"渐变卡 + 主题色"——"品牌记忆"——"紫色的辨识"——"笔记交换 = 紫罗兰"——"色彩品牌"。

6.24 我的页的"demo 价值"

身份 + 数据 + 功能 + 版本 = 完整我的页——"功能完整"——"用户可管理"——"demo 完成度"——"UGC 我的页标准"——"模板沉淀"。

6.25 我的页的"对比表格"

维度App 33App 34App 35
统计数344
菜单数555
特色extra被下载成就
副标题减碳获赞获赞

"四个我的对比"——"统计 3/4/4"——"菜单 5/5/5"——"特色 extra/被下载/成就"——"业务的差异化"——"系列我的演进"。

6.26 我的页的"笔记管理"

📓 我的笔记菜单——"创作管理"——"编辑/删除"——"笔记列表"——"创作者后台"——"管理的价值"。

6.27 我的页的"首屏信息"

首屏:用户卡 + 4 统计 + 前 3 菜单——"首屏核心"——"身份 + 数据 + 高频功能"——"滚动看成就设置"——"首屏信息设计"。

6.28 我的页的"最终设计评价"

用户卡 + 4 统计 + 5 菜单 + About = 完整我的页——"从结构到数据到激励的完整"——"可上线级"——"系列 UGC 我的标杆"——"我的页完成度评级"。

七、总结:紫罗兰 + 渐变 + 悬浮 + 成就激励

App 35 我的页一句话:用紫罗兰(#9B51E0)渐变用户卡 + 4 统计悬浮 + 5 菜单 + 底部 About 的完整我的页——紫罗兰渐变 UserCard 配 ✍️ 半透明圆形头像 + "笔记达人" + "分享 12 份 · 获赞 89 次"副标题,悬浮 StatRow 用 -24 margin 上移展示 12/89/24/38 四维创作者数据,5 菜单用 emoji + 标题 + ">" 箭头和 0.5px Divider 分隔,底部 About 显示全称和版本。

3 个设计亮点:

  1. 创作者 4 统计——12 创作 + 89 获赞 + 24 收藏 + 38 下载
  2. 成就系统——🏆 我的成就(系列首个游戏化菜单)
  3. 获赞社交激励——"获赞 89 次"创作者认可

主题色设计逻辑:紫罗兰 = 创作/知识的紫色——"我的页用紫罗兰,与全 App 品牌色一致"——"品牌贯穿"。

与系列呼应:渐变 UserCard(32/33/34/31)、悬浮统计(32/33/34)、92% 宽卡片(系列)、emoji 菜单(系列)、0.5px Divider(系列)、About 版本(系列)——"35 我的把系列的渐变 + 悬浮 + 菜单手法组合出'笔记社区'场景"。

体验细节:创作者数据、成就激励、获赞反馈、4 统计悬浮——"我的页的核心 = 让用户'3 秒看完贡献数据 + 1 秒进管理'"。

可扩展性展望:真实用户数据、成就解锁、笔记管理、收藏同步、下载记录分页、设置详情、消息中心——"demo 的笔记我的页骨架完整"。

七、扩展思考:我的页的信息架构与设计哲学

7.1 我的页的"用户视角"

4 块 = 4 个"我":

  1. 我是谁(UserCard)——身份 + 贡献
  2. 我的数据(StatRow)——创作/获赞/收藏/下载
  3. 我能做什么(MenuList)——5 功能入口
  4. 关于 App(About)——元信息

"4 个我的层次"——"从身份到元信息"——"用户视角的金字塔"——"自上而下的认知"。

7.2 我的页的"转化路径"

看用户卡(笔记达人)→ 看统计(12/89/24/38)→ 点菜单(笔记/收藏/下载/成就)——"从身份到行动"——"我的页的转化链"——"菜单 = 行动入口"。

7.3 我的页的"业务建模"

MenuItem 3 字段(id/emoji/title)——"3 字段建模"——"极简菜单"——"最小可用集"——加 badge(角标)、加 extra(数据预览)即可扩展——"数据模型的扩展点"——"33 的 extra 是扩展示例"。

7.4 我的页的"设计哲学"

我的页的 3 个设计哲学:

  1. 身份优先——渐变 UserCard 视觉焦点
  2. 数据透明——4 统计等宽
  3. 激励完整——成就 + 获赞

"身份 + 数据 + 激励的我的页"——"UGC 我的页的设计原则"——"从哲学看设计"——"这套方法论可直接迁移到任何社区/内容类 App"。

7.5 我的页的"终评"

App 35 我的页综合评估——"四区结构 + 紫罗兰主题 + 完整创作者数据"——"我的页的完成度评级"——"一个可上线级的 UGC 我的页"——"系列 UGC 我的标杆"——"demo 的高完成度"。

八、彩蛋:我的页的细节设计

8.1 "笔记达人" 的命名

"笔记达人"——"达人 = 专家"——"笔记创作者"——"身份命名"——"达人的荣誉感"——"UGC 创作者身份"。

8.2 "获赞 89 次" 的激励

"获赞 89 次"——"点赞数"——"社交认可"——"创作者激励"——"内容价值"——"反馈的力量"——"UGC 生态"。

8.3 "🏆 成就" 的游戏化

"我的成就"——"勋章系统"——"等级体系"——"学习激励"——"游戏化(Gamification)"——"创作者留存"——"35 的特色菜单"。

8.4 "12 份" 的两处呼应

副标题 + 统计——"2 处 12"——"跨区数据一致"——"demo 全局数据"——"数据严谨"——"设计的细节"。

8.5 4 统计的"纯数字"

12/89/24/38——"无单位"——"计数"——"纯数字简洁"——"统计直观"——"vs 33 的 ¥88"。

8.6 悬浮的"-24 margin"

margin top -24——"上移 24"——"重叠 24"——"悬浮高度"——"立体层次"——"同系列"。

8.7 我的页的"颜色体系"

渐变紫 + 半透明白 + 黑字 + 灰字——"4 级颜色"——"渐变(焦点)→ 白(头像)→ 黑(标题)→ 灰(次要)"——"颜色的层级"。

8.8 我的页的"demo 完整性"

用户卡 + 统计 + 5 菜单 + About = 完整我的页——"功能完整"——"用户可管理"——"demo 的完成度"——"从身份到管理的完整链"。

8.9 我的页的"成就与等级"

成就 = 未来的等级体系——"学习等级"——"达人进阶"——"成长体系"——"用户黏性"——"游戏化设计"——"扩展想象"。

补充说明:本篇所有代码引用均基于 35-note-exchange/entry/src/main/ets/pages/ProfileTab.ets 实际源码,行号与源码一一对应;4 张实机截图分别覆盖我的首屏、我的收藏菜单点击、下载记录菜单点击、我的成就菜单点击四种差异场景,全部含模拟器轮廓,图床域名统一为 imgbed.devzoo.top。

Logo

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

更多推荐