【OpenHarmony/HarmonyOs 】从近场快传到实况窗:物理视界的全场景智慧学习体验设计
【OpenHarmony/HarmonyOs 】从近场快传到实况窗:物理视界的全场景智慧学习体验设计
本文基于我的 OpenHarmony/HarmonyOS 项目「物理视界 PhysicsVision」整理。当前项目已经完成了物理实验室、公式计算器、知识挑战、收藏、最近浏览、成就系统与备份扩展。
这一篇不只看已有功能,还会结合近场快传、实况窗、全场景智慧生活等方向,聊聊一个物理学习 App 如何扩展成跨设备、跨场景的学习体验。📱📚
一、项目当前具备的“全场景”基础
「物理视界」不是一个单页 Demo,而是一个完整学习工具。它目前包含:
- 🔬 28 个物理实验模型,覆盖力学、电磁学、光学、热学、波动;
- 🧮 物理专用计算器,支持牛顿第二定律、欧姆定律、库仑力、单摆周期等;
- 🎯 知识挑战模块,支持年级、分类、题目数量和限时模式;
- ❤️ 收藏模型,方便复习重点内容;
- 🕐 最近浏览,帮助用户回到上次学习位置;
- 🏅 成就系统,记录学习进度;
- ☁️ BackupExtensionAbility,为后续数据备份和恢复预留能力。
这些功能其实已经形成了“学习状态”:用户学了哪些模型、收藏了哪些内容、挑战到了哪里、最高正确率是多少。
全场景体验的核心,就是让这些状态能在更多设备和场景中流动起来。
二、手机和平板适配:项目已经声明多设备类型
项目的 module.json5 中已经声明支持 phone 和 tablet:
"deviceTypes": [
"phone",
"tablet"
]
这给全场景学习打下了基础:
- 手机适合碎片化学习,比如刷挑战题、快速查公式;
- 平板适合课堂和自习场景,比如观察 Canvas 模型、调参数、做对比;
- 后续还可以扩展到智慧屏,用于老师课堂演示。
当前 UI 中大量使用 width('100%')、layoutWeight、Scroll、Row/Column 组合,也比较适合继续做响应式适配。
三、最近浏览:跨场景学习的入口
在实验室首页中,项目记录了用户访问过的模型:
@StorageLink('visitedModels') @Watch('onVisitedChange')
visitedModels: string = ''
recordVisit(idx: number): void {
if (this.visitedModels.length === 0) {
this.visitedModels = idx.toString()
return
}
let parts = this.visitedModels.split(',')
for (let i = 0; i < parts.length; i++) {
if (parseInt(parts[i]) === idx) return
}
this.visitedModels = this.visitedModels + ',' + idx.toString()
}
最近浏览列表取最近 6 个模型:
updateRecentList(): void {
if (this.visitedModels.length === 0) {
this.recentList = []
return
}
let parts: string[] = this.visitedModels.split(',')
let result: number[] = []
let start: number = parts.length > 6 ? parts.length - 6 : 0
for (let i = parts.length - 1; i >= start; i--) {
let val: number = parseInt(parts[i])
if (val >= 0 && val < this.names.length) {
result.push(val)
}
}
this.recentList = result
}
这看似只是一个小功能,但它非常适合全场景扩展:
- 在手机上学习了“光的干涉”;
- 回到平板后,首页直接展示最近浏览;
- 老师课堂演示后,学生可以快速继续同一模型;
- 后续可以把最近浏览同步到云端或跨设备流转。
四、推荐探索:让学习路径更智能
实验室页还有一个“推荐探索”逻辑:优先推荐未探索的基础模型,然后再推荐进阶模型。
getRecommended(): number[] {
let result: number[] = []
for (let i = 0; i < this.names.length; i++) {
if (!this.isVisited(i) && this.difficulties[i] === '基础') {
result.push(i)
if (result.length >= 4) break
}
}
if (result.length < 4) {
for (let i = 0; i < this.names.length; i++) {
if (!this.isVisited(i) && this.difficulties[i] === '进阶') {
result.push(i)
if (result.length >= 4) break
}
}
}
return result
}
这个逻辑很适合做成“学习助手”:
- 新手优先看基础模型;
- 已经学过的内容不重复推荐;
- 模型学习进度可以沉淀为学习画像;
- 未来可以接入端侧 AI,做更个性化的推荐。
五、实况窗思路:把挑战状态放到系统级可见区域
项目的挑战模块已经有“限时模式”和“暂停继续”。
@State timeLimit: number = 0
@State timeLeft: number = 0
@State hasPausedQuiz: boolean = false
pauseQuiz(): void {
this.stopQuestionTimer()
this.hasPausedQuiz = true
this.quizState = 'home'
}
resumeQuiz(): void {
this.hasPausedQuiz = false
this.cardAnim = false
this.quizState = 'playing'
}
计时器逻辑也已经存在:
startQuestionTimer(): void {
this.stopQuestionTimer()
if (this.timeLimit <= 0) return
this.timeLeft = this.timeLimit
this.questionTimerId = setInterval(() => {
this.timeLeft--
if (this.timeLeft <= 0) {
this.stopQuestionTimer()
if (!this.answered) {
this.answered = true
this.selectedAnswer = -1
this.streak = 0
}
}
}, 1000)
}
如果扩展到 HarmonyOS 实况窗,可以展示这些信息:
- 当前题目进度:
3 / 10; - 当前剩余时间:
15s; - 当前得分和连对数;
- 暂停后提示“有未完成挑战”;
- 点击实况窗回到答题页面。
对学习类 App 来说,实况窗不是为了刷存在感,而是让用户在切出去查资料、看公式、回消息后,还能知道挑战没有丢。
六、近场快传思路:分享模型、题目和学习成果
物理学习很适合同学之间分享。比如:
- 把“电场线分布”模型分享给同桌;
- 把一道错题分享给老师;
- 把自己的成就进度分享给家长;
- 课堂上老师把某个模型一键分发给学生。
当前项目中的模型数据已经结构化,例如实验室页中有模型名称、描述、分类、年级、难度、路由:
private names: string[] = [
'声音的传播', '光的反射', '串并联电路',
'匀变速直线运动', '自由落体', '力的合成与分解'
]
private categoryTags: string[] = [
'波动', '光学', '电磁学',
'力学', '力学', '力学'
]
private routes: string[] = [
'pages/SoundPropagation', 'pages/LightReflection', 'pages/SeriesParallelCircuit'
]
后续可以把单个模型封装成轻量分享数据:
interface SharedPhysicsModel {
name: string
category: string
grade: string
difficulty: string
route: string
}
近场快传时不需要传输复杂文件,只要传递模型索引或结构化数据即可。接收端打开 App 后,根据 route 进入对应模型页面。
这种分享非常轻,适合课堂、社团、家教和同学讨论场景。
七、备份与恢复:学习数据可持续
项目已经配置了备份扩展:
import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'
export default class EntryBackupAbility extends BackupExtensionAbility {
async onBackup() {
hilog.info(DOMAIN, 'testTag', 'onBackup ok')
await Promise.resolve()
}
async onRestore(bundleVersion: BundleVersion) {
hilog.info(DOMAIN, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion))
await Promise.resolve()
}
}
配置文件中也允许备份恢复:
{
"allowToBackupRestore": true
}
目前这里还是基础实现,但已经说明项目有继续做数据连续性的空间。后续可以把这些学习状态纳入备份:
- 收藏模型;
- 最近浏览;
- 挑战次数;
- 最高正确率;
- 成就解锁状态。
这样用户换机、重装或跨设备使用时,不会丢失学习进度。
八、全场景智慧生活中的学习闭环
我理解的“全场景智慧学习”不是把所有能力都接一遍,而是围绕真实学习路径构建闭环:
- 早上在手机上用 5 分钟做挑战;
- 课间通过近场快传和同学分享错题;
- 晚上在平板上打开最近浏览,继续观察物理模型;
- 挑战进行中切到后台,通过实况窗知道剩余时间;
- 换设备后,通过备份恢复保留收藏、成就和挑战记录。
这时候 App 就不再是一个孤立工具,而是贯穿学习、复习、课堂、讨论和总结的入口。
九、可以落地的功能设计清单
结合当前项目,我认为最适合继续开发的是:
- 🚀 实况窗:挑战计时、当前题号、暂停状态;
- 📤 近场分享:分享模型卡片、错题卡片、成就卡片;
- 📚 学习续接:跨设备恢复最近浏览与收藏;
- 🧑🏫 教师模式:一键打开课堂演示模型;
- 🏠 家庭场景:展示孩子本周挑战次数和学习进度;
- 📱 平板优化:实验模型页面做双栏布局,左边参数,右边 Canvas。
十、总结
「物理视界」当前已经具备全场景学习的雏形:模型足够丰富,学习状态也已经沉淀。
下一步如果接入 HarmonyOS 的近场快传、实况窗、备份恢复和多设备适配,就能把“一个物理学习 App”升级成“一个连续的学习体验”。
对于教育应用来说,全场景不是炫技,而是让学习不断线。
学生能在任何设备、任何时间点,快速回到自己的学习状态,这就是最实在的智慧体验。✨

更多推荐



所有评论(0)