在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

作者:duluo
SDK 版本:HarmonyOS API 24 (Next)
开发工具:DevEco Studio
语言框架:ArkTS + ArkUI
字数:约 10600 字


目录

  1. 引言
  2. 产品概念与适老化设计
  3. 两页架构设计
  4. 首页 Grid 卡片网格
  5. 教程详情页设计
  6. 10 大教程内容设计
  7. 步骤进度条实现
  8. 收藏系统
  9. 编译错误全记录
  10. 适老化设计原则总结
  11. 第二十七款 App 全景回顾
  12. 结语

1. 引言

1.1 为什么要做"长辈数字说明书"

我的父亲今年六十七岁。他有一部智能手机,但会用的大概只有三个功能:打电话、看微信、刷抖音。每次回家,他都会拿出手机问我:

  • “这个绿色的图标是什么?点一下会不会扣钱?”
  • “他们说可以在手机上挂号,怎么弄?”
  • “有人说发了一个链接给我,我能点吗?”

他不是个例。中国 60 岁以上人口超过 2.8 亿,其中智能手机普及率超过 60%。但真正能熟练使用手机各种功能的老年人,比例极低。

市面上不是没有"手机使用指南"——书店里有一大摞《老年人学手机》的书。但问题是:长辈不愿意看说明书。他们会觉得"说明书"三个字就很吓人。

所以这个 App 的设计原则很简单:看起来不像说明书。它看起来像一个"功能菜单"——点击一个功能,一步步跟着做。没有术语、没有流程图、没有目录树。

1.2 与之前 App 的定位差异

本 App(#27)与系列中之前的 App 有本质不同:

之前 26 款 App 长辈数字说明书
目标用户 开发者自己 65 岁以上的长辈
使用场景 日常工具/娱乐 学习使用智能手机
交互要求 快速高效 大字体、慢步骤
内容来源 程序生成 人工撰写
视觉风格 多样化 高对比、暖色调
成功标准 功能完整 长辈能看懂

这是一款内容驱动型 App——核心价值不在于代码有多巧妙,而在于 10 个教程、50 个步骤的内容质量。

1.3 本 App 的技术特色

  1. 两页架构:首页(Grid 列表)+ 详情页(步骤引导),零 Tab、零弹窗
  2. 适老化 UI:20sp 最小字号、高对比色、大圆角、大点击区域
  3. 步骤进度条:可视化当前进度,明确还剩几步
  4. 收藏系统:标记常用教程,快速找到
  5. 内容驱动:10 个教程 × 5 步 = 50 条人工撰写的手把手指南
  6. 零编译错误:最简单的架构 → 最少的错误

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 中添加 bgLightdonedoneBg 三个字段,并在 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 给开发者的建议

  1. 适老化不是增加功能,是减少功能:去掉 Tab、去掉弹窗、去掉手势——剩下的就是长辈需要的
  2. 内容比代码重要:50 条人工撰写的步骤指南,比任何聪明的算法都更有价值
  3. 20sp 是最小字号:如果正文小于 20sp,就应该调大
  4. 所有错误都变成了"低级错误":当你发现错误全部是颜色名漏写、API 记错——说明架构已经足够好了
  5. 为一个人写代码,和为一百万人写代码一样有价值:如果这款 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)
□ 所有状态可逆
□ 内容口语化
□ 每个步骤有图标
□ 有明确的完成信号

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐