HarmonyOS 手持弹幕官方教程复现技术笔记
这篇笔记基于华为官方“零基础 2 小时完成第一个鸿蒙应用:手持弹幕”的学习路径整理。目标不是复述教程步骤,而是把一次可复现的 HarmonyOS NEXT 入门实践拆成工程检查点:环境是否正确、页面如何组织、状态如何驱动 UI、哪些地方容易写成不可维护代码。
“手持弹幕”适合作为第一篇复现项目,原因很直接:它的业务足够小,能把注意力集中在 ArkTS、ArkUI、页面状态、预览调试和真机运行这些基础能力上;同时它又有动态显示、样式配置、横竖屏体验等真实 UI 问题,不会停留在只显示一段文本的玩具示例。
一、复现目标
这次复现要得到一个最小但完整的 HarmonyOS 应用:
- 首页或设置页用于输入弹幕文本,并配置字号、颜色、滚动速度等参数。
- 展示页以更适合手持展示的方式渲染弹幕内容。
- 页面之间通过明确的数据结构传参,而不是依赖全局变量。
- 所有 UI 变化都由状态驱动,避免手工操作 DOM 或命令式刷新界面。
- 代码结构能继续扩展,例如后续加入预设模板、历史记录、横屏锁定或多设备流转。
复现完成后,重点验收三件事:
- 能在 DevEco Studio 中正常编译、预览和运行。
- 修改设置项后,展示页能得到确定的显示结果。
- 代码里能清楚地区分“数据模型、页面状态、界面描述、导航跳转”。
二、官方资料对应关系
我把官方资料分成四层来看:
| 层级 | 官方资料对应能力 | 在手持弹幕中的作用 |
|---|---|---|
| 入门教程 | 华为开发者联盟 HarmonyOS 应用开发入口中的“手持弹幕”教程 | 给出第一个应用的复现路径 |
| 开发语言 | ArkTS 官方入门 | 理解类型、类、对象和函数约束 |
| UI 框架 | ArkUI 与声明式开发文档 | 理解组件、状态和布局 |
| 页面组织 | Navigation / NavDestination 文档 | 理解页面栈、目的页和生命周期 |
这四层的关系很重要。教程告诉你“先写什么、后写什么”;ArkTS 和 ArkUI 解释“为什么这样写”;Navigation 解决“页面多起来之后怎么组织”。如果只按教程敲代码,很容易完成一遍但无法迁移到自己的项目。
三、环境准备检查
复现前先做环境检查,避免把工具链问题误判为代码问题。
1. DevEco Studio
确认 DevEco Studio 已经安装,并且 SDK、模拟器或真机调试环境可用。华为开发者平台将 DevEco Studio 定位为 HarmonyOS 应用及元服务开发的一站式平台,包含代码开发、编译构建和调测能力。
建议检查:
- SDK 已按目标 API 版本安装。
- 项目能正常完成 Gradle Sync。
- 预览器可以打开 ArkUI 页面。
- 如果使用真机,开发者模式、USB 调试、签名配置都已完成。
2. 工程创建
入门复现建议使用 ArkTS 工程模板,不要从复杂模板开始。第一轮复现的目标是理解应用结构,而不是一次性引入网络、数据库、账号、推送等能力。
重点看这些目录:
entry/
src/main/
ets/
entryability/
pages/
module.json5
其中 ets 是 ArkTS 页面和业务代码的主要位置,module.json5 则描述模块、Ability 和页面入口等配置。入门阶段至少要知道:页面代码能显示出来,不只取决于 .ets 文件,也取决于模块配置和入口 Ability。
四、数据模型:先约束弹幕配置
手持弹幕虽然界面简单,但不要把所有参数散落在页面变量里。建议先抽出一个配置模型:
export class BannerSettings {
text: string = 'HarmonyOS NEXT'
fontSize: number = 72
speed: number = 1
textColor: string = '#FFFFFF'
backgroundColor: string = '#000000'
}
这样做有三个好处:
- 页面传参只传一个结构,不会出现多个参数顺序错乱。
- 后续保存历史记录时,可以直接序列化这个对象。
- 编译期能发现字段名和类型错误,符合 ArkTS 强调静态检查的开发思路。
这里不要偷懒使用 any。入门项目越小,越应该训练类型边界;否则项目一复杂,就会把问题留到运行期。
五、页面拆分:设置页和展示页分开
手持弹幕至少可以拆成两个页面:
Index:编辑弹幕内容和显示参数。BannerDisplay:只负责展示最终效果。
这是一条很实用的边界:设置页处理输入,展示页处理阅读。不要在展示页里继续塞大量表单逻辑,也不要让设置页承担动画展示职责。
页面跳转时,建议传递明确的 BannerSettings,展示页只读取参数并渲染。
const settings = new BannerSettings()
settings.text = this.text
settings.fontSize = this.fontSize
settings.speed = this.speed
// 伪代码:实际调用以当前项目的 Navigation 封装为准
this.pathStack.pushPath({
name: 'BannerDisplay',
param: settings
})
实际工程里要根据当前模板选择路由方式。如果项目使用 Navigation,就应该把页面作为 NavDestination 管理;如果是更基础的页面路由,也要保持“参数对象清晰、页面职责清晰”的原则。
六、Navigation 的理解重点
HarmonyOS 的 Navigation 不只是“跳页面”的按钮工具。它更像页面结构容器:页面栈、目的页、生命周期和不同设备宽度下的显示方式,都可以在这一层组织。
复现手持弹幕时,不一定一开始就要写复杂的分栏模式,但要提前建立三个概念:
1. 页面栈
设置页进入展示页,本质是向页面栈压入一个目的页。返回时再弹出。这样页面之间的关系是结构化的,而不是到处写硬编码路径。
2. 目的页
NavDestination 更适合承载一个独立页面。展示页可以在进入时读取参数,在离开时释放动画或计时任务。
3. 生命周期
如果展示页存在滚动动画、定时器或高频刷新,必须考虑页面隐藏和退出时的释放。入门项目也要形成习惯:页面不可见后,不应该继续消耗资源。
七、状态驱动 UI:不要把 UI 当成手工刷新的结果
ArkUI 的核心体验是声明式 UI。你描述“状态是什么,界面应该长什么样”,框架负责在状态变化时更新界面。
设置页可以维护这些状态:
@State text: string = 'HarmonyOS NEXT'
@State fontSize: number = 72
@State speed: number = 1
@State textColor: string = '#FFFFFF'
@State backgroundColor: string = '#000000'
然后在 build() 中描述输入组件、预览区域和按钮。不要把状态变化写成“找到某个控件,然后改它的属性”。那是传统命令式 UI 的思路,不适合 ArkUI。
实践中要注意:
- 真正影响界面的数据才放进状态变量。
- 临时计算值可以用普通变量或函数得到。
- 不要在
build()里做复杂耗时计算。 - 如果动画或定时器依赖状态,要设计好停止条件。
八、展示页的性能边界
手持弹幕的展示页看起来只是文字移动,但它天然容易触发性能问题:字号大、颜色强、滚动连续、可能横屏展示。入门阶段至少要守住以下边界:
- 不在 UI 线程做耗时计算。
- 不在高频动画中频繁创建临时对象。
- 页面隐藏或退出时停止动画、计时器或任务。
- 参数变化通过状态触发,不手工堆叠多个刷新入口。
- 先保证布局简单,再考虑动效复杂度。
草稿中提到的 SmartGC、可变刷新率、多线程等方向,可以作为后续性能学习主题;但在这篇复现笔记里,我更建议先把可控的工程边界做好。入门项目最容易犯的错不是性能优化不够高级,而是没有清晰的状态和生命周期。
九、我的复现检查清单
复现完成后,我会按下面顺序检查:
编译检查
- 工程可以正常 Sync。
- 没有 ArkTS 类型错误。
- 页面注册和入口配置正确。
- 真机或模拟器能启动应用。
功能检查
- 默认弹幕文本能显示。
- 修改文本后展示页同步更新。
- 修改字号、颜色、速度后效果符合预期。
- 返回设置页后能继续编辑。
架构检查
- 弹幕配置有明确模型。
- 设置页和展示页职责分离。
- 页面传参有类型边界。
- 展示页退出时没有遗留动画或任务。
体验检查
- 大字号不截断关键文字。
- 横屏或宽屏下布局仍可用。
- 背景和文字对比度足够。
- 操作按钮不会遮挡展示内容。
十、这次复现得到的工程结论
这类官方入门教程的价值,不只是教你写出第一个页面,而是帮助建立 HarmonyOS NEXT 的开发心智:
- ArkTS 负责把数据结构和类型边界立住。
- ArkUI 负责用状态描述界面。
- Navigation 负责组织页面关系和生命周期。
- DevEco Studio 负责把开发、预览、构建和调试串起来。
“手持弹幕”项目规模很小,但它包含了移动应用最常见的闭环:输入、配置、跳转、展示、返回、再编辑。只要这一轮复现能做到结构清楚,后续再学习网络请求、数据持久化、分布式能力和 AI Agent 场景时,就不会把所有复杂度混在一个页面里。
后续扩展方向
下一步可以在这个项目上继续做四类扩展:
- 配置持久化:保存最近使用的弹幕文本和样式。
- 模板化:预设“会议提示”“现场应援”“临时通知”等模板。
- 多端适配:针对手机、平板、折叠屏调整设置区和展示区布局。
- Agent 辅助生成:让 AI agent 根据场景自动生成短句、颜色和展示节奏。
这些扩展都不应该破坏当前的边界:数据模型独立、页面职责清楚、状态驱动 UI、生命周期可控。