【OpenHarmony/HarmonyOs 】从近场快传到实况窗:物理视界的全场景智慧学习体验设计

本文基于我的 OpenHarmony/HarmonyOS 项目「物理视界 PhysicsVision」整理。当前项目已经完成了物理实验室、公式计算器、知识挑战、收藏、最近浏览、成就系统与备份扩展。
这一篇不只看已有功能,还会结合近场快传、实况窗、全场景智慧生活等方向,聊聊一个物理学习 App 如何扩展成跨设备、跨场景的学习体验。📱📚

一、项目当前具备的“全场景”基础

「物理视界」不是一个单页 Demo,而是一个完整学习工具。它目前包含:

  • 🔬 28 个物理实验模型,覆盖力学、电磁学、光学、热学、波动;
  • 🧮 物理专用计算器,支持牛顿第二定律、欧姆定律、库仑力、单摆周期等;
  • 🎯 知识挑战模块,支持年级、分类、题目数量和限时模式;
  • ❤️ 收藏模型,方便复习重点内容;
  • 🕐 最近浏览,帮助用户回到上次学习位置;
  • 🏅 成就系统,记录学习进度;
  • ☁️ BackupExtensionAbility,为后续数据备份和恢复预留能力。

这些功能其实已经形成了“学习状态”:用户学了哪些模型、收藏了哪些内容、挑战到了哪里、最高正确率是多少。
全场景体验的核心,就是让这些状态能在更多设备和场景中流动起来。

二、手机和平板适配:项目已经声明多设备类型

项目的 module.json5 中已经声明支持 phone 和 tablet:

"deviceTypes": [
  "phone",
  "tablet"
]

这给全场景学习打下了基础:

  • 手机适合碎片化学习,比如刷挑战题、快速查公式;
  • 平板适合课堂和自习场景,比如观察 Canvas 模型、调参数、做对比;
  • 后续还可以扩展到智慧屏,用于老师课堂演示。

当前 UI 中大量使用 width('100%')layoutWeightScrollRow/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
}

目前这里还是基础实现,但已经说明项目有继续做数据连续性的空间。后续可以把这些学习状态纳入备份:

  • 收藏模型;
  • 最近浏览;
  • 挑战次数;
  • 最高正确率;
  • 成就解锁状态。

这样用户换机、重装或跨设备使用时,不会丢失学习进度。

八、全场景智慧生活中的学习闭环

我理解的“全场景智慧学习”不是把所有能力都接一遍,而是围绕真实学习路径构建闭环:

  1. 早上在手机上用 5 分钟做挑战;
  2. 课间通过近场快传和同学分享错题;
  3. 晚上在平板上打开最近浏览,继续观察物理模型;
  4. 挑战进行中切到后台,通过实况窗知道剩余时间;
  5. 换设备后,通过备份恢复保留收藏、成就和挑战记录。

这时候 App 就不再是一个孤立工具,而是贯穿学习、复习、课堂、讨论和总结的入口。

九、可以落地的功能设计清单

结合当前项目,我认为最适合继续开发的是:

  • 🚀 实况窗:挑战计时、当前题号、暂停状态;
  • 📤 近场分享:分享模型卡片、错题卡片、成就卡片;
  • 📚 学习续接:跨设备恢复最近浏览与收藏;
  • 🧑‍🏫 教师模式:一键打开课堂演示模型;
  • 🏠 家庭场景:展示孩子本周挑战次数和学习进度;
  • 📱 平板优化:实验模型页面做双栏布局,左边参数,右边 Canvas。

十、总结

「物理视界」当前已经具备全场景学习的雏形:模型足够丰富,学习状态也已经沉淀。
下一步如果接入 HarmonyOS 的近场快传、实况窗、备份恢复和多设备适配,就能把“一个物理学习 App”升级成“一个连续的学习体验”。

对于教育应用来说,全场景不是炫技,而是让学习不断线。
学生能在任何设备、任何时间点,快速回到自己的学习状态,这就是最实在的智慧体验。✨

img

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐