鸿蒙 Next 长辈数字说明书 App 开发实战:适老化设计 + 10 大教程 + 步骤式引导



鸿蒙 Next 长辈数字说明书 App 开发实战:适老化设计 + 10 大教程 + 步骤式引导
作者:duluo
SDK 版本:HarmonyOS API 24 (Next)
开发工具:DevEco Studio
语言框架:ArkTS + ArkUI
字数:约 10600 字
目录
- 引言
- 产品概念与适老化设计
- 两页架构设计
- 首页 Grid 卡片网格
- 教程详情页设计
- 10 大教程内容设计
- 步骤进度条实现
- 收藏系统
- 编译错误全记录
- 适老化设计原则总结
- 第二十七款 App 全景回顾
- 结语
1. 引言
1.1 为什么要做"长辈数字说明书"
我的父亲今年六十七岁。他有一部智能手机,但会用的大概只有三个功能:打电话、看微信、刷抖音。每次回家,他都会拿出手机问我:
- “这个绿色的图标是什么?点一下会不会扣钱?”
- “他们说可以在手机上挂号,怎么弄?”
- “有人说发了一个链接给我,我能点吗?”
他不是个例。中国 60 岁以上人口超过 2.8 亿,其中智能手机普及率超过 60%。但真正能熟练使用手机各种功能的老年人,比例极低。
市面上不是没有"手机使用指南"——书店里有一大摞《老年人学手机》的书。但问题是:长辈不愿意看说明书。他们会觉得"说明书"三个字就很吓人。
所以这个 App 的设计原则很简单:看起来不像说明书。它看起来像一个"功能菜单"——点击一个功能,一步步跟着做。没有术语、没有流程图、没有目录树。
1.2 与之前 App 的定位差异
本 App(#27)与系列中之前的 App 有本质不同:
| 之前 26 款 App | 长辈数字说明书 | |
|---|---|---|
| 目标用户 | 开发者自己 | 65 岁以上的长辈 |
| 使用场景 | 日常工具/娱乐 | 学习使用智能手机 |
| 交互要求 | 快速高效 | 大字体、慢步骤 |
| 内容来源 | 程序生成 | 人工撰写 |
| 视觉风格 | 多样化 | 高对比、暖色调 |
| 成功标准 | 功能完整 | 长辈能看懂 |
这是一款内容驱动型 App——核心价值不在于代码有多巧妙,而在于 10 个教程、50 个步骤的内容质量。
1.3 本 App 的技术特色
- 两页架构:首页(Grid 列表)+ 详情页(步骤引导),零 Tab、零弹窗
- 适老化 UI:20sp 最小字号、高对比色、大圆角、大点击区域
- 步骤进度条:可视化当前进度,明确还剩几步
- 收藏系统:标记常用教程,快速找到
- 内容驱动:10 个教程 × 5 步 = 50 条人工撰写的手把手指南
- 零编译错误:最简单的架构 → 最少的错误
1.4 二十七款 App 全景
App 数量: 27
代码总行数: ~16,400 行
编译错误数: ~261 个
博客总字数: ~272,000 字
技术博客数: 27 篇
2. 产品概念与适老化设计
2.1 功能需求
用户故事 1:我想学会在手机上挂号,但不想看复杂的说明书
用户故事 2:我想知道哪些链接是骗人的
用户故事 3:我想把最常用的功能收藏起来
用户故事 4:我眼神不好,字要大一点
用户故事 5:我记性不好,同一个功能可能要看好几遍
功能清单:
├── F1: 10 个教程的 Grid 展示
├── F2: 每个教程 5 步步骤引导
├── F3: 步骤进度提示
├── F4: 上一页/下一页导航
├── F5: 收藏/取消收藏
├── F6: 收藏计数展示
├── F7: 完成引导(最后一步显示"学完了")
└── F8: 所有文字不小于 18sp
2.2 适老化设计原则
本 App 的设计遵循 WCAG 2.1(Web 内容无障碍指南)中针对老年人的扩展建议:
原则一:可感知
正常 App: 正文 14-16sp,辅助文字 11-12sp
本 App: 正文 20sp,辅助文字 16-18sp,标题 24sp
对比度:
正常 App: #666 灰文字在白色背景上(对比度约 4.5:1)
本 App: #2D1F14 深棕文字在白色背景上(对比度约 10:1)
原则二:可操作
点击区域:
正常 App: 最小 44×44px
本 App: 最小 60×60px,按钮 padding 24px
交互方式:
正常 App: 支持滑动、长按、拖动、双击
本 App: 仅点击,无手势
原则三:可理解
语言风格:
正常 App: "网络连接失败,错误码 0x80070005"
本 App: "手机连不上网了,可以试试关掉再打开"
步骤数量:
正常 App: 一言难尽
本 App: 每个教程固定 5 步
原则四:稳健
所有操作有反馈:点击 → toast 提示
所有状态可逆:收藏了可以取消
视觉一致:10 个教程共用同一个模板
2.3 数据模型
interface GuideStep {
icon: string; // 步骤图标 emoji
title: string; // 步骤标题(6-10 字)
desc: string; // 步骤说明(40-80 字)
}
interface GuideTopic {
id: number;
name: string; // 教程名
emoji: string; // 图标
color: string; // 主题色
summary: string; // 一句话简介
steps: GuideStep[]; // 5 个步骤
}
steps 数组固定 5 个元素,没有可变长度。这是面向老年人的有意识设计——5 步不长不短,刚好是"看一遍能记住、做一遍能学会"的长度。
3. 两页架构设计
3.1 架构选择
本 App 没有使用系列标准的 Tab 架构,而是选择了两页切换:
build() {
Stack() {
Column().backgroundColor(C.bg)
if (!this.showGuide) {
this.buildMainPage() // 首页:教程 Grid
} else {
this.buildGuidePage() // 详情页:步骤引导
}
}
}
为什么不使用 Tab:因为长辈不需要 Tab。Tab 的概念对年轻开发者来说理所当然,但对长辈来说"三个底部按钮,每次点进去内容完全不一样"是一件需要学习的事情。
两页架构(首页列表 → 点击进入详情 → 返回)的操作逻辑更接近物理世界的经验——像一本书,翻开封面是目录,点开一页是内容。
3.2 首页布局
┌──────────────────────────────────┐
│ 📖 长辈数字说明书 │
│ 大字大图,慢慢看 ❤️ 3 │
│ │
│ 点击想学的功能,一步步跟着做 │
│ │
│ ┌───────┐ ┌───────┐ │
│ │ 📞 │ │ 💬 │ │
│ │ 打电话 │ │ 发微信 │ │
│ │ 学会拨…│ │ 学会用…│ │
│ └───────┘ └───────┘ │
│ ┌───────┐ ┌───────┐ │
│ │ 📷 │ │ 🎬 │ │
│ │ 拍照录像│ │ 看视频 │ │
│ └───────┘ └───────┘ │
│ ... 共 10 个 │
└──────────────────────────────────┘
3.3 详情页布局
┌──────────────────────────────────┐
│ ‹ 返回 📞 打电话 🤍 │
│ │
│ ● ─ ○ ─ ○ ─ ○ ─ ○ │
│ 第 1 步,共 5 步 │
│ │
│ ┌────────────────────────────┐ │
│ │ 📱 │ │
│ │ │ │
│ │ 找到电话图标 │ │
│ │ ───────────────── │ │
│ │ 在手机屏幕上找一个绿色的 │ │
│ │ 电话图标,上面有一个听筒 │ │
│ │ 的图案。点击它打开拨号... │ │
│ └────────────────────────────┘ │
│ │
│ ◀ 上一步 下一步 ▶ │
└──────────────────────────────────┘
3.4 数据流
首页(Grid 列表)
↓ 点击卡片
设置 currentTopic + currentStep = 0 + showGuide = true
↓
详情页(显示第 0 步内容)
↓ 点"下一步"
currentStep++
↓ 点到最后一步
显示"✅ 学完了" → 点击返回首页
↓ 点"‹ 返回"(任何时候)
showGuide = false → 回到首页
状态只有三个:showGuide(显示哪一页)、currentTopic(哪个教程)、currentStep(第几步)。这是 27 款 App 中最少的状态量。
4. 首页 Grid 卡片网格
4.1 2 列 Grid
Grid() {
ForEach(TOPICS, (t: GuideTopic, idx: number) => {
GridItem() {
Column() {
Text(t.emoji).fontSize(44)
Text(t.name).fontSize(18).fontColor(C.text).fontWeight(FontWeight.Bold)
Text(t.summary).fontSize(14).fontColor(C.textLight)
if (this.favorites[idx]) {
Text('❤️ 已收藏')
}
}.height(190).backgroundColor(C.bgCard).borderRadius(20)
.onClick(() => {
this.currentTopic = idx;
this.currentStep = 0;
this.showGuide = true;
})
}
}, (t: GuideTopic) => t.id.toString())
}.columnsTemplate('1fr 1fr').rowsGap(12).columnsGap(12)
卡片设计要点:
- 高度 190px:足够展示 4 行内容(emoji + 标题 + 简介 + 收藏标签)
- 圆角 20px:比常规 12-16px 更大,视觉上更柔和
- 图标 44sp:比常规 24-28sp 大接近一倍,远距离可见
- 2 列布局:在手机屏幕上,2 列每项宽度约 160px,刚好容纳 4-6 字的中文标题
4.2 收藏标记
if (this.favorites[idx]) {
Text('❤️ 已收藏').fontSize(13).fontColor(C.primary).margin({ top: 6 })
}
收藏的教程在卡片底部显示"❤️ 已收藏"标签。收藏按钮仅在详情页顶部可用(🤍/❤️),首页只读。
4.3 收藏计数
getFavCount(): number {
let c = 0;
for (let i = 0; i < this.favorites.length; i++) {
if (this.favorites[i]) c++;
}
return c;
}
顶部栏右侧显示"❤️ N",告诉长辈"你有 N 个收藏的教程"。这个数字本身就是一个导航提示——“已经收藏了 3 个,下次可以直接从收藏里找”。
5. 教程详情页设计
5.1 顶部导航栏
Row() {
Text('‹ 返回').fontSize(20).fontColor(C.primary).fontWeight(FontWeight.Bold)
.onClick(() => { this.showGuide = false; })
Blank()
Text(TOPICS[this.currentTopic].emoji + ' ' + TOPICS[this.currentTopic].name)
.fontSize(20).fontColor(C.text).fontWeight(FontWeight.Bold)
Blank()
Text(this.favorites[this.currentTopic] ? '❤️' : '🤍').fontSize(22)
.onClick(() => { this.toggleFav(this.currentTopic); })
}.width('100%').padding({ left: 16, right: 16, top: 48, bottom: 4 })
三个元素:返回按钮(左)、教程名称(中)、收藏开关(右)。返回按钮使用 ‹ 符号而非 <,在视觉上更柔和。左右两个 Blank() 将标题居中。
5.2 步骤内容卡片
Column() {
Text(TOPICS[this.currentTopic].steps[this.currentStep].icon).fontSize(72)
.margin({ top: 16 })
Text(TOPICS[this.currentTopic].steps[this.currentStep].title)
.fontSize(24).fontColor(C.text).fontWeight(FontWeight.Bold).margin({ top: 12 })
Divider().height(1).color(C.border).margin({ top: 16, bottom: 12 }).width('80%')
Text(TOPICS[this.currentTopic].steps[this.currentStep].desc)
.fontSize(20).fontColor(C.text).lineHeight(32).padding({ left: 8, right: 8 })
}.backgroundColor(C.bgCard).borderRadius(24).padding(16)
字体与间距:
- 步骤图标:72sp — 占据卡片顶部的视觉中心
- 步骤标题:24sp — 醒目的标题
- 步骤说明:20sp + 32px 行高 — 适合长时间阅读
- 分割线:80% 宽度,不撑满,视觉上有呼吸感
- 圆角:24sp — 所有元素的圆角都偏大
5.3 底部导航
Row() {
Text('◀ 上一步').fontSize(18).fontColor(this.currentStep > 0 ? C.primary : C.textMuted)
.padding({ left: 24, right: 24, top: 12, bottom: 12 })
.backgroundColor(this.currentStep > 0 ? C.primaryDim : C.bgLight).borderRadius(16)
.onClick(() => {
if (this.currentStep > 0) this.currentStep--;
})
Blank()
if (this.currentStep < TOPICS[this.currentTopic].steps.length - 1) {
Text('下一步 ▶').fontSize(18).fontColor(Color.White)
.padding({ left: 24, right: 24, top: 12, bottom: 12 })
.backgroundColor(C.primary).borderRadius(16)
.onClick(() => { this.currentStep++; })
} else {
Text('✅ 学完了').fontSize(18).fontColor(C.done)
.padding({ left: 24, right: 24, top: 12, bottom: 12 })
.backgroundColor(C.doneBg).borderRadius(16)
.onClick(() => {
promptAction.showToast({ message: '🎉 恭喜学会了!' });
this.showGuide = false;
})
}
}
上一步按钮:只有在 currentStep > 0 时才可用。不可用时显示为灰色(C.textMuted)+ 浅灰背景(C.bgLight)。
下一步/学完了按钮:最后一步替换为绿色"✅ 学完了"按钮,点击后显示庆祝 toast 并返回首页。这个设计给了长辈一个明确的"完成"信号——不是突然跳转,而是先祝贺再返回。
6. 10 大教程内容设计
6.1 教程选题
10 个教程覆盖了长辈日常生活中最常遇到的数字场景:
基础通信(2 个):
📞 打电话 — 拨打、接听、挂断
💬 发微信 — 打字、语音、发送
影音娱乐(2 个):
📷 拍照录像 — 拍照、录像、查看
🎬 看视频 — 刷视频、点赞、评论
生活服务(3 个):
🏥 医院挂号 — 选医院、选科室、预约
🚌 坐公交 — 查路线、打车、导航
💰 手机支付 — 扫码、付款码、密码
安全与设置(3 个):
🛡️ 防骗知识 — 识别骗局、保护隐私
⚙️ 手机设置 — 调字体、调音量
📹 视频通话 — 微信视频、切换摄像头
6.2 步骤模板设计
每个步骤的 desc 字段遵循统一的模板:
在[哪里],[做什么],[注意什么]。
示例(打电话第 1 步):
在手机屏幕上找一个绿色的电话图标,
上面有一个听筒的图案。
点击它打开拨号界面。
三步结构:定位 → 识别 → 操作。
措辞原则:
- 用"点"不用"点击"——"点一下"比"点击"更自然
- 用"手指"不用"光标"或"指针"
- 用"找"不用"定位"或"导航到"
- 描述图标的样子(“绿色的电话图标”)而不是图标的名字(“电话应用图标”)
6.3 防骗教程的特殊设计
防骗教程与其他教程不同——它不是操作步骤,而是认知步骤:
步骤 1:陌生链接不要点
"如果有人发短信或微信给你一个链接,
说'点击领红包'或'您的账号异常',
千万不要点!那是骗子。"
步骤 5:遇到问题找谁
"可以打110报警,或者打96110反诈专线咨询。
也可以先问问子女。"
每个步骤都是"情况描述 + 应该怎么做"。没有操作步骤,但遵循了相同的 5 步结构和"大字大图"的视觉。
7. 步骤进度条实现
7.1 进度条设计
Row() {
ForEach(TOPICS[this.currentTopic].steps, (s: GuideStep, idx: number) => {
Column() {
Column().width(12).height(12).borderRadius(6).backgroundColor(
idx === this.currentStep ? C.primary :
(idx < this.currentStep ? C.primaryLight : C.border)
)
}.layoutWeight(1).alignItems(HorizontalAlign.Center)
}, (s: GuideStep, idx: number) => idx.toString())
}
5 个 12×12 的圆点排成一行,用颜色区分状态:
| 状态 | 颜色 | 含义 |
|---|---|---|
| 当前步骤 | C.primary 橙色 |
“你现在在这里” |
| 已完成 | C.primaryLight 浅橙 |
“已经看过了” |
| 未完成 | C.border 米灰 |
“还没看到” |
每个圆点使用 layoutWeight(1) 等分宽度,确保 5 个圆点均匀分布。
7.2 步骤文字提示
Text('第 ' + (this.currentStep + 1) + ' 步,共 ' + TOPICS[this.currentTopic].steps.length + ' 步')
.fontSize(16).fontColor(C.textLight)
进度条下方显示文字说明(“第 3 步,共 5 步”)。对长辈来说,数字文字比圆点更明确。圆点用于快速定位,文字用于明确信息——双通道编码。
8. 收藏系统
8.1 收藏状态
@State favorites: boolean[] = new Array(TOPICS.length).fill(false);
收藏状态用与 TOPICS 等长的布尔数组表示。true = 已收藏。这个设计简单直接——不需要 Map、不需要 Set、不需要对象索引。
8.2 收藏切换
toggleFav(idx: number): void {
const fav = this.favorites.concat([]);
fav[idx] = !fav[idx];
this.favorites = fav;
if (fav[idx]) {
promptAction.showToast({ message: '❤️ 已收藏 ' + TOPICS[idx].name });
} else {
promptAction.showToast({ message: '已取消收藏' });
}
}
切换收藏时会显示 toast 提示,让长辈知道操作已生效。concat([]) 创建新数组触发 @State 更新。
8.3 收藏的视觉反馈
收藏状态有三个展示位置:
| 位置 | 已收藏 | 未收藏 |
|---|---|---|
| 首页卡片底部 | “❤️ 已收藏” 标签 | 不显示 |
| 首页顶部计数 | “❤️ 3” | “❤️ 0” |
| 详情页右上角 | ❤️ 红色实心 | 🤍 白心边框 |
9. 编译错误全记录
9.1 错误概览
本 App 共出现 5 个编译错误。
| # | 错误类型 | 错误代码 | 根因 |
|---|---|---|---|
| 1 | 属性不存在 | 10505001 | onLongClick 不是 Column 的有效属性 |
| 2 | 属性不存在 | 10505001 | C.bgLight 未在 ColorScheme 中定义 |
| 3 | 属性不存在 | 10505001 | C.done 未在 ColorScheme 中定义 |
| 4 | 属性不存在 | 10505001 | C.doneBg 未在 ColorScheme 中定义 |
| 5 | 类型不匹配 | 10605038 | onLongClick 移除后的残留 |
9.2 错误 1:onLongClick 不存在
// ❌ 错误:ArkTS 中 Column 没有 onLongClick 属性
Column() { /* ... */ }
.onClick(() => { /* ... */ })
.onLongClick(() => { /* ... */ })
ArkTS 的事实:Column 组件有 onClick,但没有 onLongClick。如果需要长按事件,必须使用 .gesture(LongPressGesture()) API。
修复方案:完全移除长按功能。长按收藏对长辈来说不是一个直观的操作(他们不知道"长按"是什么)。将收藏的入口移到详情页顶部,用 👤/❤️ 图标控制——更直观,也避免了复杂的 gesture API 使用。
9.3 错误 2-4:颜色常量不完整
// ❌ 错误:用了 C.bgLight、C.done、C.doneBg 但 interface 中未定义
interface ColorScheme {
bg: string; bgCard: string; bgWarm: string;
primary: string; primaryLight: string; primaryDim: string;
text: string; textLight: string; textMuted: string;
border: string; shadow: string;
// ❌ 缺少 bgLight、done、doneBg
}
根因:从上一个 App(断段打卡)迁移代码时,color scheme 沿用了旧版的定义,但新的 UI 使用了新版的色值。复制 ColorScheme 但忘记同步里面的字段。
修复:在 interface 中添加 bgLight、done、doneBg 三个字段,并在 const C 中补全对应的色值。
9.4 5 个错误的分布
错误类型分布:
10505001(属性不存在):4 个 → 80%
其他: 1 个 → 20%
错误根因分布:
未定义的 color 常量: 3 个 → 60%
不存在的组件属性: 1 个 → 20%
移除代码后的残留: 1 个 → 20%
5 个错误全部是"低级错误"——颜色常量忘记加、API 名称记错了、代码删不干净。没有任何架构层面的错误。这从侧面说明:当架构足够简单(两页 + 零弹窗)时,错误类型也会变得简单。
9.5 二十七款 App 的错误趋势
App 1: 16 ← 需要学习
App 8: 4 ← 模式成熟
App 16: 4 ← 稳定期
App 24: 48 ← 新领域探索
App 25: 3 ← 回归基线
App 26: 8 ← 全部同一类型
App 27: 5 ← 全部低级错误
App 27 的 5 个错误是 27 款 App 中**“含金量最低”**的 5 个错误——没有一个是"发现了新的 ArkTS 规则",全部是"忘记加颜色"和"API 名称记错了"这类可以通过代码审查发现的问题。
10. 适老化设计原则总结
10.1 字体与可读性
经过 27 款 App 的实践,以下是针对长辈用户的最佳字体配置:
| 元素 | 常规 App | 本 App | 变化 |
|---|---|---|---|
| 正文 | 14-15sp | 20sp | +40% |
| 辅助文字 | 11-12sp | 14-16sp | +30% |
| 标题 | 16-18sp | 22-24sp | +40% |
| 图标大小 | 24-28sp | 44-72sp | +100% |
| 行高 | 20-22px | 32px | +45% |
| 卡片高度 | 100-140px | 190px | +50% |
关键发现:对长辈来说,字体增大 30% 带来的可读性提升,比界面美观度提升 100% 更有价值。适老化设计不需要"好看",需要"好读"。
10.2 颜色与对比度
背景色: #FFF8F0 暖白
文字色: #2D1F14 深棕
主色: #FF8A4C 暖橙
浅色: #F5F0EB 米灰
对比度计算(近似):
深棕文字在暖白背景上 ≈ 10:1
符合 WCAG AAA 标准(≥ 7:1)
暖色调的选择:橙色和暖色系在心理学上与"温暖、友好、可亲近"相关联。对可能对科技产品有抵触情绪的长辈来说,暖色调比冷色调(蓝色、灰色)更能降低心理防线。
10.3 交互简化
适老化交互清单:
✅ 仅点击操作 → 没有双击、长按、滑动、拖动
✅ 大按钮(padding 24px)→ 手指粗也能准确点
✅ 明确的状态文字 → "第 3 步,共 5 步"而不是进度条
✅ 所有操作有反馈 → 点击后立即 toast 提示
✅ 可逆操作 → 收藏了可以取消
✅ 明确的完成信号 → "✅ 学完了"按钮
❌ 无底部 Tab → 两页切换更简单
❌ 无弹窗 → 所有内容内联展示
❌ 无手势 → 不支持任何手势操作
为什么去掉 Tab:Tab 栏是移动 App 中最常见的导航模式。但对长辈来说,底部的 3 个图标按钮需要学习才能理解"为什么点这个会去另一个页面"。两页架构(列表 → 详情 → 返回)更接近现实世界的经验——打开一本书,翻到某一页,看完合上。
为什么去掉弹窗:弹窗在视觉上"遮盖"了当前内容,对认知能力下降的长辈来说,可能会造成"我的手机是不是坏了"的困惑。
10.4 内容设计
适老化内容原则:
1. 口语化:用"点一下"不用"点击",用"找"不用"导航"
2. 有温度:不说"错误操作",说"没关系,再来一次"
3. 带图标:每个步骤有一个 Emoji 作为视觉锚点
4. 有结构:定位→识别→操作,三步一个步骤
5. 有长度:每条 40-80 字,手机屏幕 3-4 行
6. 有顺序:步骤必须按顺序执行,不能跳步
7. 有终点:最后一步有明确的"完成了"信号
11. 第二十七款 App 全景回顾
11.1 数据总览
| 指标 | 数值 |
|---|---|
| 代码行数 | 340 行 |
| 编译错误数 | 5 个(修复后 0) |
| @State 变量 | 3 个 |
| @Builder 方法 | 2 个 |
| 教程数 | 10 个 |
| 步骤总数 | 50 步 |
| 页面数 | 2 页 |
| Tab 数 | 0 个 |
| 弹窗数 | 0 个 |
| 外部依赖 | 0 个 |
11.2 系列中代码最少的 App
本 App(340 行)位列系列代码量第二少,仅次于"极简Logo"(364 行)。
但"最少"不是目标——真实的系列最少是 340 行,原因是:内容数据占了大头。10 个教程 × 5 步 ×(1 个 icon + 1 个 title + 1 个 desc)= 150 个字符串字段,每行数据虽然少,但加起来就多了。
真正用于 UI 和业务逻辑的代码大约是 120 行——这是本系列真正的"最少记录"。
11.3 二十七款 App 的功能维度对比
| 维度 | 常规 App | 长辈数字说明书 |
|---|---|---|
| 创新度 | 解决新问题 | 解决老问题的新方式 |
| 代码复杂度 | 中等 | 最低 |
| 内容密度 | 低(数据由用户生成) | 高(50 条人工内容) |
| 设计难度 | 中等 | 高(适老化约束多) |
| 用户价值 | 功能驱动 | 情感+功能驱动 |
这个对比揭示了一个事实:代码量不等于价值量。一款 340 行的 App,如果写得好、内容质量高,对目标用户的价值可能超过一款 1000 行的复杂工具。
11.4 适老化开发的三大建议
经过本 App 的开发,以下三条建议送给准备做适老化应用的开发者:
建议一:找一位真正的长辈做测试
你觉得自己写得够清楚了,让你的父亲或母亲打开 App 用一下。如果他能不用你指导就完成一个教程,你的设计就是合格的。
建议二:字体大,再大一点
你现在的设计稿上标题 20sp 看起来已经很大了。但把它打印出来贴在墙上,退后两米看——这才是 70 岁老人看手机的实际感觉。
建议三:去掉所有"高级功能"
长按、滑动、双击、摇一摇——这些你觉得"理所当然"的交互,对长辈来说都是需要学习的新概念。去掉它们,只保留点击。
12. 结语
12.1 从"科技产品"到"数字陪伴"
二十七款 App 走下来,从白噪音到 AI 树洞,从打卡到说明书,这个系列逐渐从"开发者的技术练习"变成了"解决真实问题的小工具"。
长辈数字说明书这个 App,技术上谈不上任何"先进"——没有 AI、没有动画、没有复杂的数据结构。但它解决了一个真实的问题:让长辈能够独立学会使用智能手机的基础功能。
12.2 科技的温度
在追逐新技术的时候,我们常常忘记了一件事:科技的价值不在于它有多"新",而在于它能让多少人的生活变得更好。
长辈数字说明书——从技术上它是本系列最简单的 App 之一。但从意义上看,它可能是最有价值的一个。
如果你的父母或祖父母也有一部"只会打电话"的智能手机,打开这个 App,陪他们一起从"打电话"教程开始,一步步走到"视频通话"教程。当你教会他们打视频电话的那一刻,你会发现——340 行代码的价值,远远超过了它本身。
12.3 从 1 到 27
第 1 款 App:白噪音,767 行,16 个错误
第 8 款 App:情绪垃圾桶,390 行,4 个错误
第 16 款 App:梦境解析,614 行,4 个错误
第 24 款 App:AI 树洞,907 行,48 个错误
第 27 款 App:长辈说明书,340 行,5 个错误
27 款 App,每一款都对应了一个具体的问题场景。它们不完美、不复杂、不会上架应用商店——但它们记录了 27 次从零开始构建一个完整产品的过程。
12.4 给开发者的建议
- 适老化不是增加功能,是减少功能:去掉 Tab、去掉弹窗、去掉手势——剩下的就是长辈需要的
- 内容比代码重要:50 条人工撰写的步骤指南,比任何聪明的算法都更有价值
- 20sp 是最小字号:如果正文小于 20sp,就应该调大
- 所有错误都变成了"低级错误":当你发现错误全部是颜色名漏写、API 记错——说明架构已经足够好了
- 为一个人写代码,和为一百万人写代码一样有价值:如果这款 App 能帮你的父母学会视频通话,它的价值就超过了百万下载量的游戏
12.5 感谢
27 款 App、27 篇博客、约 272,000 字。
这个系列最初只是一个"试试 ArkUI"的练习,不知不觉写到了第 27 篇。感谢每一位从第一篇读到第二十七篇的读者。如果这个系列中的哪怕一款 App、一段代码、一个错误修复方式对你有帮助,那这 272,000 字就没有白写。
现在,打开 DevEco Studio,去写属于你自己的第 1 款 App 吧。
附录 A:核心代码速查
两页架构
build() {
Stack() {
Column().backgroundColor(C.bg)
if (!this.showGuide) { this.buildMainPage() }
else { this.buildGuidePage() }
}
}
Grid 卡片
Grid() {
ForEach(TOPICS, (t, idx) => {
GridItem() {
Column() {
Text(t.emoji).fontSize(44)
Text(t.name).fontSize(18).fontWeight(FontWeight.Bold)
Text(t.summary).fontSize(14)
}.height(190).borderRadius(20).onClick(() => { /* 进入详情 */ })
}
}, t => t.id.toString())
}.columnsTemplate('1fr 1fr').rowsGap(12).columnsGap(12)
步骤进度条
Row() {
ForEach(TOPICS[t].steps, (_, idx) => {
Column().width(12).height(12).borderRadius(6)
.backgroundColor(idx === step ? C.primary :
idx < step ? C.primaryLight : C.border)
})
}
附录 B:色板
| 变量 | 值 | 用途 |
|---|---|---|
C.bg |
#FFF8F0 |
主背景(暖白) |
C.bgCard |
#FFFFFF |
卡片背景 |
C.bgWarm |
#FFE8D0 |
暖色装饰 |
C.bgLight |
#F5F0EB |
禁用态背景 |
C.primary |
#FF8A4C |
主色(暖橙) |
C.primaryLight |
#FFB080 |
浅橙 |
C.primaryDim |
rgba(255,138,76,0.1) |
橙色光晕 |
C.text |
#2D1F14 |
主文字(深棕) |
C.textLight |
#6B5A4A |
次要文字 |
C.textMuted |
#A09080 |
禁用态文字 |
C.border |
#F0E0D0 |
边框色 |
C.done |
#4ECB71 |
完成态 |
C.doneBg |
rgba(78,203,113,0.12) |
完成态背景 |
附录 C:适老化检查清单
□ 正文 ≥ 20sp
□ 标题 ≥ 24sp
□ 行高 ≥ 32px
□ 对比度 ≥ 7:1
□ 点击区域 ≥ 44×44px
□ 所有操作只有点击
□ 无弹窗(全部内联)
□ 无 Tab(最多两页)
□ 无长按/滑动/拖动
□ 所有操作有反馈(toast)
□ 所有状态可逆
□ 内容口语化
□ 每个步骤有图标
□ 有明确的完成信号
更多推荐

所有评论(0)