鸿蒙 Next 小红书封面生成器 App 开发实战:6 套模板 + 实时预览 + 装饰系统



鸿蒙 Next 小红书封面生成器 App 开发实战:6 套模板 + 实时预览 + 装饰系统
作者:duluo
SDK 版本:HarmonyOS API 24 (Next)
开发工具:DevEco Studio 5.0+
语言框架:ArkTS + ArkUI
字数:约 10000 字
目录
- 引言:封面是内容的第一印象
- 产品概念与三 Tab 架构
- CoverTemplate 数据模型
- 编辑 Tab:输入与实时预览
- 模板 Tab:6 种风格选择
- 装饰系统与字体大小
- 预览与保存
- 历史记录管理
- 视觉设计:粉白柔美
- ArkTS 兼容性记录
- 第三十七款 App 全景回顾
- 结语
1. 引言:封面是内容的第一印象
1.1 封面图的价值
在内容平台(小红书、公众号、抖音)上,封面图是用户决定是否点击的第一要素。一张好的封面图可以提升 2-3 倍的点击率。但大多数创作者并不是设计师——他们需要一个工具来快速生成美观的封面。
小红书封面生成器 App 的定位就是:让不懂设计的创作者也能生成专业级封面。用户只需要输入标题、选择模板、调整样式——三步就能生成一张可用的封面图,整个过程不超过 10 秒。
为什么不做成网页工具而是 App:封面生成器需要实时预览和流畅的交互体验——输入文字时预览框即时更新、切换模板时背景色立即变化。这些交互在原生 App 中比在网页中更流畅。同时,作为手机 App,用户可以在移动端随时生成封面,不需要打开电脑。
1.2 小红书封面的特点
小红书封面与其他平台的封面有显著不同:
抖音封面:视频截图为主,文字简短,横屏 16:9
公众号封面:横版图片+标题文字,横屏
小红书封面:竖版比例(3:4),渐变色背景+居中大标题
小红书的竖版比例(3:4)决定了封面的设计逻辑——文字需要居中排列,背景需要足够的视觉空间。渐变色背景在小红书封面上非常常见,因为它比纯色背景更有层次感,又不会像图片背景那样分散注意力。本 App 的封面预览框虽然使用了 1:1 的方形比例(200×200px 迷你预览和 320×320px 全屏预览),但所有设计元素(居中标题、渐变色背景、装饰线)都是按照小红书封面的 3:4 竖版逻辑排列的。
1.3 从零到封面的三步流程
第 1 步:输入标题(3 秒)
输入封面主标题和副标题
在顶部的实时预览框中即时看到效果
第 2 步:选择模板(1 秒)
从 6 套配色模板中选择一套
预览框的背景色和文字色立即更新
第 3 步:调整样式(2 秒)
选择字体大小(大/中/小)
选择装饰(横线/圆点)
点击"预览"查看全屏效果
整个过程不超过 10 秒,用户不需要打开 Photoshop 或 Canva,不需要调整任何颜色数值——模板系统将所有设计决策封装为"选择"而不是"配置"。
与传统封面设计工具的对比:
| 步骤 | 传统方式(Canva) | 本 App |
|---|---|---|
| 创建画布 | 选择尺寸(3:4 竖版) | 自动 3:4 |
| 添加背景 | 选择颜色/图片 | 自动模板配色 |
| 输入文字 | 添加文本框 → 输入 → 调整字体 | 直接输入 |
| 调整样式 | 手动调整颜色/大小/位置 | 选择字号和装饰 |
| 导出 | 下载图片 | 保存到历史 |
传统方式需要 10+ 步和一定的设计经验,本 App 只需要 3 步且完全不需要设计经验。这种"极简"不是通过减少功能实现的,而是通过将设计决策封装到模板中实现的——用户不需要选择"用什么颜色",只需要选择"哪个模板"。颜色、渐变色、文字色、强调色都已经在模板中预定义了。
1.4 功能清单
功能清单:
├── F1: 封面标题输入(实时渲染到预览框)
├── F2: 副标题输入(可选,自动调整间距)
├── F3: 6 套配色模板(渐变背景 + 文字色 + 强调色)
├── F4: 3 档字体大小(大 28px / 中 22px / 小 18px)
├── F5: 5 种装饰(无/横线/圆点/方框/斜线)
├── F6: 编辑区实时迷你预览(200px 高)
├── F7: 全屏预览弹窗(320px 封面展示)
├── F8: 保存到历史记录(最多 20 条)
├── F9: 历史浏览与删除
└── F10: 一键复制标题
2. 产品概念与三 Tab 架构
2.1 三 Tab 设计
│ Tab 0: ✍️ 编辑 │ Tab 1: 🎨 模板 │ Tab 2: 📚 历史 │
三个 Tab 对应"输入→选择→管理"的完整工作流:
| Tab | 功能 | 核心交互 |
|---|---|---|
| 编辑 | 输入标题 + 实时预览 + 样式调节 | 文字输入、选项点击 |
| 模板 | 6 套风格切换 | 点击卡片选中 |
| 历史 | 最近 20 条记录管理 | 浏览、删除 |
Tab 布局与同类 App 的对比:封面生成器的三 Tab 布局与"博客一键转图文"(编辑→模板→记录)几乎相同。这是内容创作工具的标准 Tab 布局——"输入→选择→管理"的工作流在不同 App 之间具有高度一致性。
2.2 Header 设计
@Builder
buildHeader() {
Row() {
Text('📕 封面生成器')
Text(this.getHeaderSub())
if (this.activeTab === 0 && this.title.length > 0) {
Text('👁️ 预览').onClick(() => { this.showPreview = true; })
}
}
}
Header 右侧的预览按钮只在编辑 Tab 且有标题时显示——这是一个上下文感知的交互设计,用户填写标题后可以一键预览封面效果。
Header 的响应式设计:标题和副标题在 Header 中组合显示。编辑 Tab 的副标题是"输入标题 · 选择模板 · 生成封面",提示用户当前的操作流。模板 Tab 的副标题是"6 种风格 · 一键切换",强调模板的便捷性。历史 Tab 的副标题是"最近生成的封面",为空的列表提供上下文。三个副标题分别对应三个 Tab 的核心价值——“操作”、“选择”、“回顾”。
2.3 @State 状态变量
| 变量 | 类型 | 更新频率 | 用途 |
|---|---|---|---|
| activeTab | number | 低 | Tab 切换 |
| title | string | 高(每次输入) | 封面标题 |
| subtitle | string | 中 | 副标题 |
| selectedTpl | number | 低 | 选中模板 ID |
| fontSize | number | 低 | 字体大小索引(0-2) |
| decoration | number | 低 | 装饰类型索引(0-4) |
| showPreview | boolean | 中 | 预览弹窗显隐 |
| history | string[] | 中 | 历史记录数组 |
8 个 @State 变量——处于 36 款 App 的中间水平。其中 5 个(title/subtitle/selectedTpl/fontSize/decoration)直接控制预览框的渲染内容,这些变量的变化会触发 buildMiniPreview() 的重新渲染。其余 3 个(activeTab/showPreview/history)控制导航、弹窗和数据管理,不影响预览内容。
8 个变量的分类:
内容状态:title, subtitle(用户输入的内容)
样式状态:selectedTpl, fontSize, decoration(用户选择的样式)
UI 状态:activeTab, showPreview(页面导航)
数据状态:history(持久化记录)
3. CoverTemplate 数据模型
interface CoverTemplate {
id: number;
name: string; // 模板名(如"奶油粉")
bgColors: string[]; // 背景渐变(2 色,from/to)
fontColor: string; // 文字颜色
accentColor: string; // 强调色(装饰用)
style: string; // 风格描述
}
3.1 6 套模板参数
| ID | 名称 | 背景渐变 | 文字色 | 强调色 | 风格 |
|---|---|---|---|---|---|
| 1 | 奶油粉 | #FFF5F7→#FFE0E8 |
#2D1B1B |
#FF6B8A |
柔美 |
| 2 | 抹茶绿 | #F0FFF4→#D4EDDA |
#1B2D1B |
#38A169 |
清新 |
| 3 | 奶茶棕 | #FFF8F0→#F0E0D0 |
#2D1B1B |
#B8866B |
温暖 |
| 4 | 雾霾蓝 | #F0F8FF→#DDE8F5 |
#1B1B2D |
#5A8DB6 |
知性 |
| 5 | 高级黑 | #1A1A1A→#2D2D2D |
#FFFFFF |
#FFD700 |
极简 |
| 6 | 薰衣草 | #F8F0FF→#EDE0F5 |
#2D1B2D |
#9B6BB5 |
浪漫 |
模板配色的设计原则:每个模板使用相邻色相的 2 色渐变(如奶油粉:粉色→浅粉),而不是对比色相(如粉→绿)。相邻色相的渐变更柔和,不会在封面中产生视觉冲突。文字颜色使用深色(在浅色背景上)或白色(在深色背景上),确保可读性。
6 套模板的覆盖范围:
| 模板 | 适合内容类型 | 典型笔记标题 |
|---|---|---|
| 奶油粉 | 美妆、穿搭、日常生活 | “春季穿搭合集” |
| 抹茶绿 | 读书、学习、效率提升 | “30 天读书计划” |
| 奶茶棕 | 美食、探店、烘焙 | “周末 brunch 探店” |
| 雾霾蓝 | 职场、知识、干货分享 | “写给职场新人的建议” |
| 高级黑 | 科技、观点、文案 | “2024 数码产品推荐” |
| 薰衣草 | 情感、文艺、手账 | “写给十年后的自己” |
每套模板都对应一个内容类目,用户可以根据笔记的主题选择最合适的模板。模板的命名也采用了用户熟悉的命名方式(奶油粉、抹茶绿等),而不是"模板 A"、“模板 B”——熟悉的命名让选择更直观。
模板的扩展性:TEMPLATES 是一个常量数组,添加新模板只需要添加一条记录即可——不需要修改任何 UI 代码。如果需要扩展模板数量,只需要在数组中添加新的 CoverTemplate 对象,ForEach 会自动渲染新的模板卡片。这是"数据驱动 UI"的典型应用——UI 结构由数据决定,数据变化时 UI 自动适应。
4. 编辑 Tab:输入与实时预览
4.1 编辑 Tab 布局
┌────────────────────────────────┐
│ 封面实时预览 │ ← 200px 高
│ (根据输入实时渲染) │
├────────────────────────────────┤
│ [ 输入封面标题 ] │ ← TextInput
│ [ 副标题(可选) ] │ ← TextInput
│ │
│ 📐 标题大小 │
│ [大标题] [中标题] [小标题] │ ← 3 档选择
│ │
│ 🎀 装饰 │
│ [无] [横线] [圆点] [方框] [斜线] │ ← 5 种选择
└────────────────────────────────┘
4.2 实时预览
@Builder
buildMiniPreview() {
Column() {
if (this.decoration === 1) {
Column().width(40).height(3).backgroundColor(this.getTplAccent())
}
if (this.title.length > 0) {
Text(this.title).fontSize(this.getFontSize())
.fontColor(this.getTplFontColor()).fontWeight(FontWeight.Bold)
} else {
Text('输入标题').fontSize(18).fontColor(C.textMuted).opacity(0.5)
}
if (this.subtitle.length > 0) {
Text(this.subtitle).fontSize(13).fontColor(this.getTplFontColor()).opacity(0.7)
}
if (this.decoration === 2) {
// 三个圆点装饰
}
}
.linearGradient({
direction: GradientDirection.Bottom,
colors: [[this.getTplBg0(), 0], [this.getTplBg1(), 1]]
})
}
实时预览的渲染时机:每次 title、subtitle、fontSize、decoration、selectedTpl 任一变化时,预览框都会重新渲染。ArkTS 的响应式系统会自动检测 @State 变量的变化并触发对应的组件更新。
标题为空时显示灰色的"输入标题"占位文字(opacity 0.5),提示用户输入。这个设计在页面加载时提供了一个视觉锚点——用户能看到"这里会显示标题",而不是看到一个空的白色区域。
4 个 getter 方法:getTplFontColor()、getTplAccent()、getTplBg0()、getTplBg1() 从 getTemplate() 方法中提取单个字段值,避免了在 @Builder 中声明 const tpl 变量。每个 getter 方法的结构相同:调用 getTemplate 检查是否为空返回对应字段提供默认值。这种"查判返默"的四步模式是 @Builder 中安全获取数据的标准写法。4 个 getter 虽然比 1 个 const 变量多了 3 倍的方法调用,但在 ArkTS 中这是唯一正确的写法——因为 @Builder 中不能声明变量。而且这 4 个 getter 的执行开销极低(每次只遍历一次 6 个元素的数组),不会对性能产生任何影响。
5. 模板 Tab:6 种风格选择
@Builder
buildTemplateCard(tpl: CoverTemplate) {
Column() {
Row() {
// 左:色块预览(60×60 渐变方块 + "T" 文字)
Column() { Text('T').fontSize(20).fontColor(tpl.fontColor) }
.width(60).height(60).borderRadius(12)
.linearGradient({ direction: GradientDirection.Bottom,
colors: [[tpl.bgColors[0], 0], [tpl.bgColors[1], 1]] })
// 中:名称 + 风格描述
Column() {
Text(tpl.name).fontSize(16).fontColor(C.text).fontWeight(FontWeight.Medium)
Text(tpl.style + '风格').fontSize(11).fontColor(C.textLight)
}.margin({ left: 14 }).layoutWeight(1).alignItems(HorizontalAlign.Start)
// 右:选中标记
if (this.selectedTpl === tpl.id) { Text('✓').fontSize(20).fontColor(C.primary) }
}
}
.border({ width: this.selectedTpl === tpl.id ? 2 : 0, color: C.primary })
.onClick(() => { this.selectedTpl = tpl.id; })
}
模板卡片的选中态:选中后显示 2px 粉色边框 + ✓ 标记。未选中时无边框无标记。边框宽度的切换通过三元表达式实现——选中时 2px,未选中时 0px。
模板 Tab 的交互细节:点击模板卡片会切换 selectedTpl 的值,同时编辑 Tab 中预览框的背景色和文字色会立即变化。但用户不会自动跳转到编辑 Tab——他们可以继续浏览其他模板,预览框的变化作为"后台预览"存在。当用户满意时,点击底部 Tab 切换到编辑 Tab 查看详细信息。
模板与内容的解耦:模板只控制视觉样式(背景色、文字色、强调色),不影响用户输入的标题和副标题内容。这意味着用户可以在不丢失已输入内容的前提下自由切换模板——这在 UX 设计中称为"无损切换"。
6. 装饰系统与字体大小
6.1 三种装饰效果
| 索引 | 名称 | 实现代码 | 预览效果 |
|---|---|---|---|
| 0 | 无 | — | 纯文字封面 |
| 1 | 横线 | Column().width(40).height(3) 使用强调色 |
标题上方一条 3px 横线 |
| 2 | 圆点 | 3 个 6px 圆点排列 | 标题下方三个小圆点 |
| 3 | 方框 | 预留接口(当前未实现) | — |
| 4 | 斜线 | 预留接口(当前未实现) | — |
装饰的条件渲染:buildMiniPreview() 中使用 if (this.decoration === 1) 和 if (this.decoration === 2) 条件判断来决定是否渲染装饰元素。这种条件渲染方式确保未选中的装饰不会占用渲染资源。
强调色的使用:横线和圆点都使用 this.getTplAccent() 作为颜色——即当前模板的强调色。在奶油粉模板中横线是粉色,在抹茶绿模板中横线是绿色。强调色每次随模板切换而变化,用户不需要手动匹配颜色。
6.2 三档字号映射
fontSize 索引 0 → 编辑区 28px / 预览区 36px
fontSize 索引 1 → 编辑区 22px / 预览区 30px
fontSize 索引 2 → 编辑区 18px / 预览区 26px
编辑区字号 = this.getFontSize() // 28/22/18
预览区字号 = this.getFontSize() + 8 // 36/30/26
预览区的字号比编辑区大 8px,因为预览区的展示面积更大(全屏弹窗 320px vs 编辑区小预览 200px),更大的字号能更好地填充封面空间。
7. 预览与保存
@Builder
buildPreviewOverlay() {
Column() {
Blank().onClick(() => { this.showPreview = false; })
Column() {
// 封面大图(320px 高)
Column() {
Text(this.title).fontSize(this.getFontSize() + 8)
.fontColor(this.getTplFontColor()).fontWeight(FontWeight.Bold)
if (this.subtitle.length > 0) {
Text(this.subtitle).fontSize(15).fontColor(this.getTplFontColor()).opacity(0.7)
}
Text('小红书').fontSize(10).fontColor(this.getTplFontColor()).opacity(0.3)
}
.width('100%').height(320).borderRadius(16)
.linearGradient({ direction: GradientDirection.Bottom,
colors: [[this.getTplBg0(), 0], [this.getTplBg1(), 1]] })
.justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)
// 操作
Row() {
Button('💾 保存').onClick(() => { this.saveToHistory(); })
Button('📋 复制').onClick(() => { promptAction.showToast(...) })
}
}
}
}
预览弹窗中的"保存"按钮会调用 saveToHistory() 将当前封面信息保存到 history 数组。"复制"按钮使用 promptAction.showToast 模拟复制操作。
全屏预览的排版逻辑:预览弹窗中的封面展示区域为 320px 高的方形区域。标题使用 this.getFontSize() + 8 来放大字号(比编辑区大 8px),副标题固定 15px 且半透明(opacity(0.7)),底部版权文字"小红书"使用 10px 极低透明度(opacity(0.3))。文字大小从标题到副标题到版权逐步递减(36→15→10px),透明度逐步递增(100%→70%→30%),形成了清晰的视觉层级。
保存与复制的分工:
| 按钮 | 激励色 | 功能 | 使用场景 |
|---|---|---|---|
| 💾 保存到相册 | 粉色(主色) | 保存封面记录到历史列表 | 确定封面后存档 |
| 📋 复制标题 | 浅灰色 | 复制标题文字到剪贴板 | 写笔记时使用 |
两个按钮的分工明确——"保存"用于持久化封面记录,"复制"用于快速复用标题文字。粉色按钮是主要操作(保存),灰色按钮是次要操作(复制)。这个"一主一次"的按钮设计模式在本系列的多款 App 中反复使用。
8. 历史记录管理
saveToHistory(): void {
const entry = '📕 ' + this.title + ' · ' + this.getTemplate().name;
this.history = [entry, ...this.history].slice(0, 20);
}
头插法:最新生成的封面显示在列表顶部。上限 20 条:超过 20 条时自动丢弃最旧的记录。可删除:每条记录右侧有 🗑️ 按钮,点击后从数组中过滤掉该项。
为什么保存的是文字记录而非图片:当前版本的历史记录保存的是封面描述文字(“📕 标题 · 模板名”),而不是实际的封面图片。这是因为 ArkTS 的图片生成和保存涉及 Canvas 或文件系统 API,复杂度较高。文字记录的方式虽然没有视觉预览,但足以让用户回顾"我之前做过什么封面"。
删除操作的交互:点击 🗑️ 按钮后,使用 filter 方法生成新数组(排除被删除项),赋值给 this.history 触发重新渲染。没有确认弹窗——因为删除只是从文字列表中移除,不是从相册中删除真正的图片,误删的风险较低。
9. 视觉设计:粉白柔美
const C: ColorScheme = {
bg: '#FFF5F7', // 极浅粉(小红书底色)
bgLight: '#FFEBF0', // 浅粉背景
primary: '#FF6B8A', // 主色粉(按钮/强调)
accent: '#FFB347', // 暖橙(装饰)
text: '#2D1B1B', // 深棕
};
小红书平台的视觉风格以柔美、清新为主。本 App 的配色选择了粉色系作为主色调,配合不同模板的辅助色(绿/棕/蓝/黑/紫),覆盖了小红书上最常见的封面色彩。
粉色的使用策略:粉色在 App 的主界面中用于 Tab 选中态、按钮、边框选中态。粉色是一个"女性化"但不"幼稚"的颜色——它传达了柔美和亲和力,与小红书平台的用户画像一致。辅助色(#FFB347 暖橙)用于装饰选项的选中态,与粉色形成温暖的搭配。
37 款 App 的配色回顾:
| App 类型 | 代表 App | 主色 | 色相 |
|---|---|---|---|
| 情感陪伴 | AI 树洞 | 深紫 | 冷色 |
| 生产力工具 | 意愿清单 | 琥珀橙 | 暖色 |
| 氛围体验 | 复古电视 | 霓虹青 | 冷色 |
| 内容创作 | 封面生成器 | 粉色 | 暖色 |
内容创作工具倾向于使用暖色(橙色、粉色),因为暖色传递"创作"的能量感。氛围体验 App 倾向于使用冷色(青色、深紫),因为冷色传递"沉浸"的安静感。
10. ArkTS 兼容性记录
| # | 错误 | 位置 | 修复 |
|---|---|---|---|
| 1 | const tpl 在 @Builder |
buildMiniPreview | 改为 4 个 getter 方法 |
| 2 | const tpl 在 @Builder |
buildPreviewOverlay | 改为 getter 方法 |
实际错误数:2 个。这是 37 款 App 中错误最少的一款之一——与 App 32(复古未来风电视,2 个错误)并列最低。2 个错误全部是"老问题"(@Builder 中不能声明变量),说明 38 条之前的教训已经内化得非常好。
核心语法零错误:本 App 在 @Builder 之外的语法错误为零——没有 ForEach key 错误、没有类型错误、没有 import 错误、没有颜色格式错误。这说明经过 37 款 App 的训练,基础语法已经完全内化,编码时的错误率降到了极低水平。后续 App 的错误主要来自"新领域"(从未使用过的 API 或语法模式),而不是已有经验的遗忘。
11. 第三十七款 App 全景回顾
11.1 数据总览
| 指标 | 数值 |
|---|---|
| 代码行数 | 336 行 |
| 编译错误数 | 2 个 |
| @Builder 方法 | 10 个 |
| 模板数量 | 6 套 |
| 装饰类型 | 5 种 |
| Tab 数量 | 3 个 |
37 款 App 中,封面生成器是第 4 款"内容创作工具"(前 3 款是:博客一键转图文、爆款脚本库、AI 简历优化大师)。内容创作工具占总数的约 11%。
11.2 37 款 App 的错误数趋势
从 App 1 到 App 37,编译错误数的演变:
App 1: 22 → 第一次写 ArkTS,什么都不会
App 10: 15 → 学会了 ForEach 和 @Builder
App 20: 5 → 形成了自己的编码模式
App 24: 48 → 进入 AI 领域,全新错误类型
App 30: 5 → 回到熟悉领域,错误率回落
App 32: 2 → 最低记录(氛围型 App)
App 35: 7 → 社交训练 App(多 @Builder)
App 37: 2 → 并列最低(封面生成器)
App 37 的 2 个错误与 App 32 持平,并列 37 款 App 的最低记录。2 个错误全部是"在 @Builder 中声明了 const 变量"——这是一个从 App 13 开始就反复出现的教训,说明即使是最有经验的开发者,在快速编码时仍可能触犯这个规则。
37 款 App 的累计数据:总代码行数约 20,000 行,总编译错误约 265 个,平均每款 App 的错误数从 App 1 的 22 个下降到 App 37 的 2 个,下降了 91%。最大的单款错误数是 App 24(AI 树洞)的 48 个——那是进入 AI 对话领域时的新领域错误。最大的错误数降幅出现在 App 24 到 App 26(从 48 到 3),说明新领域的错误一旦被理解并记录,后续的同类 App 就能避免。
11.3 内容创作工具的四款 App
| App | 代码行数 | 创造的内容 | 核心交互 |
|---|---|---|---|
| AI 简历优化大师 | 758 行 | 简历文本 | 表单填写 + 评分 |
| 博客一键转图文 | 458 行 | 分享卡片 | 文本输入 + 模板 |
| 爆款脚本库 | 493 行 | 视频脚本 | 模板浏览 + 套用 |
| 封面生成器 | 336 行 | 封面图 | 文字输入 + 实时预览 |
四款内容创作工具的代码行数从 336 到 758 不等,但核心逻辑是相通的:用户输入内容 + 选择模板 = 生成输出。这个模式在本系列中反复出现,已经形成了一套成熟的"输入→选择→输出"的 UI 架构。
12. 结语
12.1 37 款 App 的产品矩阵
从 App 1 到 App 37,产品类型覆盖了 10 个类别:
情感陪伴(3 款):情绪垃圾桶、AI 树洞、漂流瓶
生活管理(3 款):愿望清单、习惯打卡、意愿清单
人生规划(1 款):遗愿清单
职业发展(1 款):AI 简历优化大师
内容创作(4 款):博客一键转图文、爆款脚本库、AI 简历、封面生成器
氛围体验(2 款):复古未来风电视、陀螺仪星空
健康引导(1 款):冥想与正念
记录分析(1 款):梦境解析日记
心理训练(1 款):社恐脱敏训练营
内容创作类是最大的类别(4 款),占全部 App 的 11%。这与"写代码本身就是一种创作"的理念一脉相承。
12.2 封面生成器的设计启示
封面生成器是内容创作工具中最"轻"的一款——336 行代码、6 套模板、3 档字号、5 种装饰。但它完整覆盖了"输入→预览→保存"的内容创作闭环。用户在编辑 Tab 输入标题、在模板 Tab 选择风格、在预览弹窗确认效果——整个过程不超过 10 秒。
它的核心设计启示是:让用户的操作集中在"输入内容"上,其他的(配色、排版、样式)交给模板。用户不需要知道什么是渐变色、什么是字重、什么是强调色——模板系统替用户做了所有设计决策。
12.3 感谢
37 款 App、37 篇博客、约 370,000 字。从 App 1 的 22 个编译错误到 App 37 的 2 个编译错误——错误数下降了 91%,只用 37 款 App 的时间。
第 37 款 App 是一个"内容创作工具"——它帮助创作者解决封面设计这个具体问题。从"情绪垃圾桶"到"封面生成器",从释放情绪到创作内容——产品的进化方向越来越贴近"创造"而非"消费"。
37 款 App 覆盖了 10 种产品类型、使用了 5 种系统 API、产生了 40 条 ArkTS 铁律。每一款 App 都是下一款 App 的基石。第 1 款学会了 ForEach,第 10 款学会了 @Builder,第 20 款学会了深色主题——没有前 36 款的积累,第 37 款不可能以 2 个错误完成。
37 款 App 的代码行数从 173(陀螺仪星空)到 758(AI 简历优化大师),覆盖了从极简到中等的全部范围。但无论代码量多少,每一款 App 都完成了"从打开 App 到完成核心目标"的完整用户体验。代码量不是衡量 App 质量的标准——用户打开后能不能在 10 秒内完成核心任务才是。
现在,打开 DevEco Studio,写下你的下一篇爆款笔记的标题。封面已经准备好了。从第一行代码到第 37 款 App,你已经证明了持续输出的力量——现在去帮更多人证明他们也能创造好内容。
附录:核心代码速查
模板系统
interface CoverTemplate {
id: number; name: string; bgColors: string[];
fontColor: string; accentColor: string; style: string;
}
getter 方法模式
getTplFontColor(): string { const t = this.getTemplate(); if (t) return t.fontColor; return '#2D1B1B'; }
getTplAccent(): string { const t = this.getTemplate(); if (t) return t.accentColor; return '#FF6B8A'; }
保存历史
saveToHistory(): void {
const entry = '📕 ' + this.title + ' · ' + this.getTemplate().name;
this.history = [entry, ...this.history].slice(0, 20);
}
(全文完,约 10000 字)
更多推荐



所有评论(0)