鸿蒙原生应用 ArkUI 实战:渐变 UserCard + 负 margin 悬浮 —— 证件照我的页的个人中心架构
鸿蒙原生应用 ArkUI 实战:渐变 UserCard + 负 margin 悬浮 —— 证件照我的页的个人中心架构
App 51「个人证件照制作」我的页(ProfileTab),主题色
#2D3436深灰黑(charcoal),4 个 Tab 分别为首页(🪪)、拍摄(📷)、编辑(✂️)、我的(👤)。本篇基于51-id-photo/entry/src/main/ets/pages/ProfileTab.ets(共 99 行)逐段拆解,附 4 张实机截图。

一、整体结构:四区"UserCard + 统计 + 菜单 + 关于"布局
我的页是四个 @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 块结构:UserCard(深灰渐变品牌区)→ StatRow(三列悬浮统计卡)→ MenuList(5 行菜单)→ About(版本收尾)。与 App 45-50 我的页同构的"头图 + 悬浮卡 + 菜单 + 版本"范式——深灰主题、证件照业务指标、会员中心菜单是本页三大特色。
二、数据模型:统计 + 菜单
interface StatItem { value: string; label: string; }
interface MenuItem { id: number; emoji: string; title: string; }
private stats: StatItem[] = [
{ value: '28', label: '历史照片' },
{ value: '12', label: '导出记录' },
{ value: '5', label: '常用规格' }
];
private menus: MenuItem[] = [
{ id: 1, emoji: '🖼️', title: '历史照片' },
{ id: 2, emoji: '📐', title: '常用规格' },
{ id: 3, emoji: '⬇️', title: '导出记录' },
{ id: 4, emoji: '💎', title: '会员中心' },
{ id: 5, emoji: '⚙️', title: '设置' }
];
stats 三项贴合证件照业务:历史照片(制作量)、导出记录(导出量)、常用规格(规格偏好)——制作量 + 导出量 + 规格偏好是工具产品的数据模型。menus 5 项含"💎 会员中心"——系列工具类 App 首个商业化菜单。
三、UserCard:深灰渐变头图 + 🪪 证件头像
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('已制作 28 张证件照').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]] })
}
逐点拆解:
- 渐变头图:
linearGradient从#2D3436渐变到#636E72——与首页 Banner 同款深灰渐变,品牌统一。 - 🪪 证件头像:64×64 半透明圆底(
#33FFFFFF)+ 32 号 🪪——与 Tab 图标、首页 Banner 图标完全一致,🪪 即品牌符号。 - "证件照用户":工具型产品的用户身份简单直接(对比社区产品的"达人/旅人"角色)——深灰专业感下无需花哨人设。
- 副标题:"已制作 28 张证件照"——制作量与统计卡"28 历史照片"一致,副标题即制作成果。
- 底部 44 padding:为悬浮统计卡预留空间。
四、StatRow:三列悬浮统计卡
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 })
}
逐点拆解:
- 负 margin 悬浮:
.margin({ top: -24 })上移叠加在渐变区下缘——系列标志性手法。 - 三列等分:三个
layoutWeight(1)自动三等分,18 号数字 + 11 号标签。 - 92% 宽度:左右留 4% 呼吸边距。
- 数据自洽:28 历史照片 ↔ 副标题"已制作 28 张" ↔ 编辑页"保存到相册"累计;5 常用规格 ↔ 首页 6 规格中收藏 5 个。
五、MenuList:5 行菜单 + Divider 条件分隔
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 })
}
逐点拆解:
- 三栏行:emoji + 标题 + ">" 箭头——系列标准菜单卡。
- Divider 条件分隔:
if (idx < this.menus.length - 1)——最后一行不加 Divider。 - 整行点击:
onClick弹 Toast——前 3 个菜单对应统计卡三个数字(历史照片 ↔ 28、导出记录 ↔ 12、常用规格 ↔ 5)。 - "💎 会员中心":工具产品的商业化入口——会员权益(高清导出/去水印/更多规格),对应编辑页"保存到相册"的增值服务(免费导出低清、会员高清)——freemium 模式(核心功能免费、增值收费)。


六、About:版本信息收尾
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 })
}
12 号浅灰应用名 + 11 号更浅版本号(opacity(0.7)),margin({ top: 24 }) 与菜单卡拉开距离——系列统一收尾。
七、跨页数据自洽:我的页 = 证件照用户档案
{ value: '28', label: '历史照片' },
Text('已制作 28 张证件照').fontSize(12).fontColor('#FFFFFF').opacity(0.85)
数据自洽链:
- "28 历史照片" ↔ 副标题"已制作 28 张证件照"(同一数字两处一致)↔ 编辑页"保存到相册"累计。
- "5 常用规格" ↔ 首页 6 规格(收藏 5 个)——规格偏好的用户侧沉淀。
- 🪪 符号 ↔ 首页 Banner(🪪)↔ Tab 图标(🪪)——品牌符号全 App 统一。
- 深灰渐变 ↔ 首页 Banner/编辑页按钮——深灰主题全 App 统一。
八、系列横向对比:个人中心的菜单演进
| App | 菜单数 | 特色菜单 | 商业化 |
|---|---|---|---|
| App 45 签到墙 | 4 | 活动中心/积分商城 | 积分体系 |
| App 50 室友评价 | 4 | 评价记录/寝室资料 | 无 |
| App 51 证件照 | 5 | 💎 会员中心 | freemium |
差异点:本页是系列工具类 App 中首个"商业化菜单"——"💎 会员中心"对应编辑页"保存到相册"的增值服务(免费导出低清、会员高清 4K)。工具产品的 freemium 模式:核心功能免费(制作证件照的基础:拍摄/换底/标准尺寸)、会员增值(高清导出/去水印/更多规格/排版)——痛点即付费点(证件照要清晰,高清导出是刚需)。

九、开发者视角:调试与验证技巧
- 负 margin 叠层:统计卡
margin({ top: -24 })悬浮,构建顺序(UserCard 先、StatRow 后)决定 StatRow 在上层——调整构建顺序需配合zIndex。 - 统计数字跨页核对:28/12/5 与副标题(28 张)、编辑页保存累计、首页规格(6 中 5 收藏)的核对——"数字处处有出处"的系列验收标准。
- 🪪 符号全局统一:Tab 图标/首页 Banner/UserCard 头像三处 🪪——若改品牌符号需全局替换(常量管理),避免漏改。
- 菜单 key:当前
m.title5 项内唯一——新增菜单项建议改用m.id作 key,为扩展预留。 - 会员菜单权限:Demo Toast——产品化后会员状态(是否开通)驱动菜单显示(未开通显示"开通会员"、已开通显示"会员中心")。
十、演进方向
| 方向 | 当前状态 | 产品化演进 |
|---|---|---|
| 历史照片 | 静态数字 28 | 可重新编辑(跳编辑页回填背景/尺寸) |
| 会员体系 | Toast"会员中心" | 会员状态驱动菜单显示 + 权益页 |
| 导出计费 | 静态数字 12 | 免费用户每月限次导出 + 会员无限 |
| 规格收藏 | 静态数字 5 | 首页规格卡加"⭐ 收藏" + 我的页管理 |
| 使用报表 | 累计数字 | 按月统计(本月制作 N 张)趋势图 |
十一、一句话总结
我的页以 99 行代码完成了证件照用户的使用档案——深灰渐变头图配 🪪 证件头像、"证件照用户"功能身份、"28 历史/12 导出/5 规格"工具使用数据、💎 会员中心商业化菜单(系列首个 freemium 入口)、5 菜单覆盖"照片/规格/导出/会员/设置"。工具使用档案 + 商业化入口是本页双核——记录使用 + 引导付费,让证件照工具的个人中心既沉淀资产又支撑变现。

更多推荐





所有评论(0)