HarmonyOS 6(API 23)实战:基于悬浮导航、沉浸光感与HMAF的“光测智评“——PC端AI智能体沉浸式智能考试评测与学情分析指挥中心
文章目录

每日一句正能量
善假于物,是智慧,但役于物,则是迷失。
善于利用工具、资源、技术是聪明的表现;但如果被外物所控制、依赖甚至上瘾,就失去了自我。人应当做工具的主人,而非奴隶。智能手机、社交媒体、金钱、名声皆同理。用物而不滞于物。
前言
摘要:2026年,中国教育数字化市场规模突破8000亿元,全国超过3亿学生参与在线学习与考试。然而,传统考试评测系统面临阅卷效率低下、学情分析滞后、个性化辅导缺失三大痛点。HarmonyOS 6(API 23)引入的鸿蒙智能体框架(HMAF)将AI能力下沉至系统层,配合悬浮导航与沉浸光感特性,为PC端智能考试评测与学情分析带来了"成绩即光效、薄弱点即导航"的全新交互范式。本文将实战开发一款面向HarmonyOS PC的"光测智评"应用,展示如何利用HMAF构建"试卷解析-智能阅卷-学情诊断-个性推送"四层智能体协作架构,通过悬浮导航实现评测状态实时追踪,基于沉浸光感打造"学情健康度即氛围"的沉浸体验,以及基于多窗口架构构建浮动试卷窗口、学情雷达图窗口和错题归因窗口的协作评测体验。
一、前言:教育评测进入"智能体驱动"时代
2026年,中国教育数字化市场规模突破8000亿元,全国超过3亿学生参与在线学习与考试,智能阅卷系统已覆盖80%以上的中高考。然而,传统考试评测系统面临三大核心痛点:
- 阅卷效率低下:人工阅卷一份综合试卷需要15-30分钟,主观题评分一致性仅75%,作文等开放性题目评分偏差高达20%
- 学情分析滞后:考试成绩发布后,从数据采集到完成学情分析报告平均需要3-5天,学生错过最佳查漏补缺窗口期
- 个性化辅导缺失:传统"千人一面"的辅导模式无法针对每个学生的知识薄弱点精准推送,个性化学习资源匹配率不足30%
HarmonyOS 6(API 23)的HMAF框架配合**悬浮导航(Float Navigation)与沉浸光感(Immersive Light Effects)**特性,为智能考试评测与学情分析带来了革命性解决方案:
- 智能体协同评测:HMAF构建的"评测智能体"可实时解析试卷结构、自动批阅客观题、智能评分主观题、精准诊断知识薄弱点,阅卷效率提升100倍,学情分析实时完成
- 学情健康度光效感知:根据当前班级/学生的学情状态(优秀/良好/中等/薄弱/临界)动态切换环境光色,让教师"看见"学情分布
- 悬浮评测导航:底部悬浮导航实时显示四大智能体运行状态与学情统计徽章,教师无需切换页面即可掌握全局评测态势
- PC多窗口协作评测:主评测大屏 + 浮动试卷窗口 + 浮动学情雷达图窗口 + 浮动错题归因窗口的四层架构,通过光效联动实现"一眼全局"
本文核心亮点:
- 学情健康度光效:五种学情状态拥有专属光效人格(优秀柔绿、良好淡蓝、中等暖黄、薄弱橙红、临界警示红),根据当前最低学情等级动态切换全局环境光、知识点脉冲和导航材质
- 悬浮评测导航:底部悬浮页签替代传统工具栏,支持态势总览/试卷监控/学情分析/个性推送切换,实时显示学情统计徽章(临界/薄弱/中等数量)
- HMAF四层评测架构:基于Agent Framework Kit构建"试卷解析-智能阅卷-学情诊断-个性推送"四层智能体协作体系
- 多窗口光效联动:主评测窗口 + 浮动试卷窗口 + 浮动学情雷达图 + 浮动错题归因的光效同步与焦点感知
- 评测意图沉浸感知:通过Intents Kit实时理解教师的查询意图,自动调整界面光效与导航形态

二、核心特性解析与技术选型
2.1 HMAF在智能考试评测中的价值
HarmonyOS 6的HMAF采用四层架构设计:应用智能体层、智能体框架层、AI引擎层、智能体内核层。在"光测智评"中,这种架构能够:
- 原生智能调度:评测智能体不再是阅卷系统的附属插件,而是系统的基础能力,支持跨学科、跨年级协同评测
- 意图即评测:通过Intents Kit将教师自然语言意图(如"查找班级数学函数章节的所有薄弱学生")转化为结构化分析任务
- 分布式智能体协同:利用鸿蒙分布式软总线,实现PC主控+大屏展示+平板阅卷+移动端学情推送的多设备协作
- 端云协同推理:端侧处理试卷扫描与客观题批阅,云端大模型处理主观题智能评分与学情深度诊断
2.2 沉浸光感在学情分析中的创新应用
HarmonyOS 6的 systemMaterialEffect 通过模拟物理光照模型,为学情状态反馈带来细腻的视觉表达。在智能评测场景中,这种材质效果能够:
- 增强学情感知:不同学情状态拥有专属光效标识(优秀柔绿、良好淡蓝、中等暖黄、薄弱橙红、临界警示红)
- 状态直觉感知:试卷解析时的呼吸蓝光、智能阅卷时的脉冲金光、发现薄弱点时的警示红光、生成报告时的确认绿光
- 提升评测专注度:动态环境光随班级学情分布变化,整体优秀柔和、大面积薄弱强烈,帮助教师快速进入"重点关注状态"
2.3 技术选型总览
表格
| 功能模块 | 技术实现 | 沉浸光感/HMAF应用 |
|---|---|---|
| 主评测态势大屏 | Canvas + 自定义绘制 | 知识点光效、学情链路流光 |
| 悬浮评测导航 | HdsTabs + systemMaterialEffect | 玻璃拟态页签,学情统计徽章 |
| 试卷解析智能体 | HMAF Agent Framework Kit | 解析进度光效反馈 |
| 智能阅卷智能体 | HMAF + OCR+NLP模型 | 阅卷状态光效标记 |
| 学情诊断智能体 | HMAF + 知识图谱模型 | 薄弱点类型光效脉冲 |
| 个性推送智能体 | HMAF + 推荐引擎 | 推送完成光效提示 |
| 浮动试卷窗口 | 子窗口 + Canvas | 题目难度颜色编码 |
| 浮动学情雷达图窗口 | 子窗口 + RadarChart | 能力维度颜色编码 |
| 浮动错题归因窗口 | 子窗口 + Graph | 错误类型光效标记 |
三、项目实战:"光测智评"架构设计
3.1 应用场景与功能规划
面向HarmonyOS PC的智能考试评测与学情分析场景,核心功能包括:
主评测态势大屏:实时展示班级学情分布、知识点掌握热力图、学生成绩排名、薄弱点聚类分析,支持缩放与学科切换
试卷监控模块:试卷结构解析、题目难度标注、答题情况统计、异常行为检测
学情分析模块:个体学情画像、班级学情对比、知识点掌握度追踪、进步趋势分析
个性推送模块:薄弱点精准定位、个性化习题推荐、学习路径规划、家校协同反馈
浮动试卷窗口:悬浮展示选中试卷的详细内容,题目难度颜色随学情状态变化
浮动学情雷达图窗口:悬浮展示选中学生的多维能力雷达图,维度颜色编码
浮动错题归因窗口:悬浮展示选中学生的错题归因分析,错误类型光效反馈
3.2 技术架构图
plain
┌─────────────────────────────────────────────────────────────┐
│ 光测智评 - 应用层 │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ 主评测大屏 │ │ 悬浮评测导航 │ │ 浮动窗口组 │ │
│ │ (Canvas) │ │ (HdsTabs) │ │ (试卷/学情雷达图/ │ │
│ │ │ │ │ │ 错题归因) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ HMAF 智能体调度层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │试卷解析Agent│ │智能阅卷Agent│ │学情诊断Agent│ │个性推送Agent│ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 系统服务层 │
│ Intents Kit │ Agent Framework Kit │ Window Manager │ Light │
│ │ │ │ Effect │
└─────────────────────────────────────────────────────────────┘
四、环境配置与模块依赖
4.1 模块依赖配置
JSON
// entry/oh-package.json5
{
"dependencies": {
"@kit.AgentFrameworkKit": "^1.0.0",
"@kit.IntentsKit": "^1.0.0",
"@kit.ArkUI": "^1.0.0",
"@kit.WindowManagerKit": "^1.0.0",
"@kit.LightEffectKit": "^1.0.0",
"@kit.VisionKit": "^1.0.0",
"@kit.NLTKit": "^1.0.0"
}
}
4.2 权限声明(module.json5)
JSON
{
"module": {
"name": "entry",
"type": "entry",
"description": "光测智评 - 智能考试评测与学情分析",
"mainElement": "EntryAbility",
"requestPermissions": [
{
"name": "ohos.permission.INTERNET",
"reason": "考试数据实时采集与同步"
},
{
"name": "ohos.permission.CAMERA",
"reason": "试卷扫描与识别"
},
{
"name": "ohos.permission.READ_MEDIA",
"reason": "试卷图片读取"
},
{
"name": "ohos.permission.SYSTEM_FLOAT_WINDOW",
"reason": "浮动窗口展示"
},
{
"name": "ohos.permission.LIGHT_EFFECT_CONTROL",
"reason": "沉浸光效控制"
}
]
}
}
五、核心组件实战
5.1 窗口沉浸配置(EntryAbility.ets)
代码亮点:本模块实现了PC端全屏沉浸式评测态势感知窗口。通过 setWindowLayoutFullScreen(true) 移除系统标题栏,配合 expandSafeArea 扩展安全区至全屏,最大化评测展示区域。同时注册窗口焦点变化监听,实现"焦点即光效"的感知降级——当窗口失焦时自动降低背景光效强度,减少干扰。
TypeScript
// entry/src/main/ets/entryability/EntryAbility.ets
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { LightEffectManager } from '../services/LightEffectManager';
export default class EntryAbility extends UIAbility {
private mainWindow: window.Window | null = null;
private lightManager: LightEffectManager | null = null;
async onWindowStageCreate(windowStage: window.WindowStage): Promise<void> {
// 创建主窗口
this.mainWindow = await windowStage.createSubWindow('MainAssessmentCenter');
// 全屏沉浸配置
await this.mainWindow.setWindowLayoutFullScreen(true);
await this.mainWindow.setWindowSystemBarEnable([]);
// 加载主页面
this.mainWindow.loadContent('pages/AssessmentCenterPage', (err) => {
if (err) {
console.error('Failed to load main content:', err);
return;
}
console.info('Main assessment center window loaded');
});
// 初始化光效管理器
this.lightManager = new LightEffectManager();
await this.lightManager.initialize();
// 注册窗口焦点监听
this.mainWindow.on('windowFocusChange', (isFocused: boolean) => {
this.lightManager?.setFocusState(isFocused);
console.info(`Window focus changed: ${isFocused}`);
});
// 扩展安全区
const mainWindow = await windowStage.getMainWindow();
mainWindow.setSpecificSystemBarEnabled('status', false);
mainWindow.setSpecificSystemBarEnabled('navigation', false);
}
onWindowStageDestroy(): void {
this.lightManager?.destroy();
this.mainWindow?.destroy();
}
}
5.2 学情健康度光效系统(LearningLightEffect.ets)
代码亮点:本模块定义了五种学情状态的完整光效人格系统。每种状态不仅拥有专属颜色,还定义了脉冲节奏、呼吸频率和光晕强度。LearningHealthLevel 枚举与 LearningLightTheme 类实现了学情健康度到光效的完整映射,支持动态切换与平滑过渡。
TypeScript
// entry/src/main/ets/theme/LearningLightEffect.ets
/**
* 学情健康度等级枚举
*/
export enum LearningHealthLevel {
EXCELLENT = 'excellent', // 优秀 - 柔绿
GOOD = 'good', // 良好 - 淡蓝
AVERAGE = 'average', // 中等 - 暖黄
WEAK = 'weak', // 薄弱 - 橙红
CRITICAL = 'critical' // 临界 - 警示红
}
/**
* 学情光效主题接口
*/
export interface LearningLightTheme {
level: LearningHealthLevel;
primaryColor: string; // 主色
secondaryColor: string; // 辅色
pulseColor: string; // 脉冲色
glowIntensity: number; // 光晕强度 (0-1)
pulseInterval: number; // 脉冲间隔 (ms)
breathSpeed: number; // 呼吸速度 (ms)
ambientOpacity: number; // 环境光透明度
nodeBorderWidth: number; // 知识点边框宽度
flowLineSpeed: number; // 学情链路流光速度
}
/**
* 学情健康度光效主题配置
*/
export const LearningLightThemes: Record<LearningHealthLevel, LearningLightTheme> = {
[LearningHealthLevel.EXCELLENT]: {
level: LearningHealthLevel.EXCELLENT,
primaryColor: '#4CAF50',
secondaryColor: '#81C784',
pulseColor: '#A5D6A7',
glowIntensity: 0.3,
pulseInterval: 3000,
breathSpeed: 4000,
ambientOpacity: 0.05,
nodeBorderWidth: 1,
flowLineSpeed: 2000
},
[LearningHealthLevel.GOOD]: {
level: LearningHealthLevel.GOOD,
primaryColor: '#42A5F5',
secondaryColor: '#90CAF9',
pulseColor: '#BBDEFB',
glowIntensity: 0.4,
pulseInterval: 2500,
breathSpeed: 3500,
ambientOpacity: 0.08,
nodeBorderWidth: 1.5,
flowLineSpeed: 1800
},
[LearningHealthLevel.AVERAGE]: {
level: LearningHealthLevel.AVERAGE,
primaryColor: '#FFA726',
secondaryColor: '#FFCC80',
pulseColor: '#FFE0B2',
glowIntensity: 0.6,
pulseInterval: 1500,
breathSpeed: 2500,
ambientOpacity: 0.12,
nodeBorderWidth: 2,
flowLineSpeed: 1200
},
[LearningHealthLevel.WEAK]: {
level: LearningHealthLevel.WEAK,
primaryColor: '#EF5350',
secondaryColor: '#EF9A9A',
pulseColor: '#FFCDD2',
glowIntensity: 0.8,
pulseInterval: 800,
breathSpeed: 1500,
ambientOpacity: 0.18,
nodeBorderWidth: 3,
flowLineSpeed: 800
},
[LearningHealthLevel.CRITICAL]: {
level: LearningHealthLevel.CRITICAL,
primaryColor: '#D32F2F',
secondaryColor: '#E57373',
pulseColor: '#FFEBEE',
glowIntensity: 1.0,
pulseInterval: 400,
breathSpeed: 800,
ambientOpacity: 0.25,
nodeBorderWidth: 4,
flowLineSpeed: 400
}
};
/**
* 知识点节点数据接口
*/
export interface KnowledgeNode {
id: string;
name: string;
subject: string; // 学科
chapter: string; // 章节
learningLevel: LearningHealthLevel;
masteryRate: number; // 掌握率 (%)
questionCount: number; // 题目数量
errorCount: number; // 错误数量
lastTest: number;
x: number;
y: number;
connections: string[];
}
/**
* 学情链路数据接口
*/
export interface LearningLink {
id: string;
sourceId: string;
targetId: string;
linkType: string; // 链路类型(前置/后置/关联)
learningLevel: LearningHealthLevel;
dependencyStrength: number;
timestamp: number;
isActive: boolean;
}
/**
* 光效管理器
*/
export class LearningLightManager {
private currentTheme: LearningLightTheme = LearningLightThemes[LearningHealthLevel.EXCELLENT];
private listeners: Set<(theme: LearningLightTheme) => void> = new Set();
/**
* 根据最低学情等级切换光效(关注薄弱环节)
*/
public switchLearningLevel(level: LearningHealthLevel): void {
this.currentTheme = LearningLightThemes[level];
this.listeners.forEach(listener => listener(this.currentTheme));
console.info(`Learning level switched to ${level}, theme updated`);
}
/**
* 根据知识点节点列表自动计算最低等级(关注最薄弱)
*/
public autoSwitchFromNodes(nodes: KnowledgeNode[]): void {
const levelPriority = [LearningHealthLevel.EXCELLENT, LearningHealthLevel.GOOD, LearningHealthLevel.AVERAGE, LearningHealthLevel.WEAK, LearningHealthLevel.CRITICAL];
let minLevel = LearningHealthLevel.EXCELLENT;
for (const node of nodes) {
const currentPriority = levelPriority.indexOf(node.learningLevel);
const minPriority = levelPriority.indexOf(minLevel);
if (currentPriority > minPriority) {
minLevel = node.learningLevel;
}
}
this.switchLearningLevel(minLevel);
}
public getCurrentTheme(): LearningLightTheme {
return this.currentTheme;
}
public onThemeChange(listener: (theme: LearningLightTheme) => void): void {
this.listeners.add(listener);
}
public offThemeChange(listener: (theme: LearningLightTheme) => void): void {
this.listeners.delete(listener);
}
}
5.3 HMAF四层评测智能体架构(AssessmentAgentScheduler.ets)
代码亮点:本模块是"光测智评"的核心大脑,实现了四层评测智能体的协作调度。AssessmentAgentScheduler 通过HMAF的 AgentSession 注册四个专业评测智能体,并通过 IntentsEngine 解析教师的自然语言查询意图。每个智能体拥有独立的提示词模板和能力声明,支持全链路自动化(试卷解析→智能阅卷→学情诊断→个性推送)。
TypeScript
// entry/src/main/ets/agents/AssessmentAgentScheduler.ets
import {
hmaf,
AgentSession,
AgentMode,
TaskMessage,
TaskResult
} from '@kit.AgentFrameworkKit';
import { intents, IntentEngine, IntentResult } from '@kit.IntentsKit';
import { LearningLightManager, LearningHealthLevel, KnowledgeNode, LearningLink } from '../theme/LearningLightEffect';
/**
* 智能体类型定义
*/
export enum AgentType {
PAPER_PARSER = 'paper_parser', // 试卷解析Agent
SMART_GRADER = 'smart_grader', // 智能阅卷Agent
DIAGNOSIS_ENGINE = 'diagnosis_engine', // 学情诊断Agent
PUSH_ENGINE = 'push_engine' // 个性推送Agent
}
/**
* 评测运营阶段枚举
*/
export enum AssessmentStage {
OVERVIEW = 'overview', // 态势总览
PAPER = 'paper', // 试卷监控
ANALYSIS = 'analysis', // 学情分析
PUSH = 'push' // 个性推送
}
/**
* 试卷解析结果接口
*/
export interface PaperResult {
totalQuestions: number;
subjectDistribution: Record<string, number>;
difficultyDistribution: Record<string, number>;
knowledgePoints: string[];
questionTypes: string[];
parseTime: number;
}
/**
* 智能阅卷结果接口
*/
export interface GradingResult {
gradedPapers: Array<{
studentId: string;
totalScore: number;
objectiveScore: number;
subjectiveScore: number;
questionScores: Record<string, number>;
gradingConfidence: number;
timestamp: number;
}>;
consistencyRate: number;
gradingLatency: number;
}
/**
* 学情诊断结果接口
*/
export interface DiagnosisResult {
studentProfiles: Array<{
studentId: string;
overallLevel: LearningHealthLevel;
weakPoints: Array<{
knowledgePoint: string;
errorRate: number;
recommendedAction: string;
}>;
strongPoints: string[];
trend: 'improving' | 'stable' | 'declining';
}>;
classAverage: number;
diagnosisLatency: number;
}
/**
* 个性推送结果接口
*/
export interface PushResult {
recommendedExercises: Array<{
studentId: string;
exercises: Array<{
id: string;
type: string;
difficulty: string;
knowledgePoint: string;
reason: string;
}>;
learningPath: string[];
}>;
pushSuccessRate: number;
playbookId: string;
}
/**
* HMAF智能考试评测智能体调度器
* 核心:四层智能体协作,实现考试评测的自动感知与智能分析
*/
export class AssessmentAgentScheduler {
private session: AgentSession | null = null;
private intentEngine: IntentEngine | null = null;
private lightManager: LearningLightManager;
// 评测数据存储
private knowledgeNodes: Map<string, KnowledgeNode> = new Map();
private learningLinks: Map<string, LearningLink> = new Map();
private paperResult: PaperResult | null = null;
private gradingResult: GradingResult | null = null;
private diagnosisResult: DiagnosisResult | null = null;
private pushResult: PushResult | null = null;
// 回调监听
private onPaperParsed?: (result: PaperResult) => void;
private onGradingCompleted?: (result: GradingResult) => void;
private onDiagnosisCompleted?: (result: DiagnosisResult) => void;
private onPushCompleted?: (result: PushResult) => void;
private onStageChanged?: (stage: AssessmentStage) => void;
constructor(lightManager: LearningLightManager) {
this.lightManager = lightManager;
}
/**
* 初始化智能体会话
*/
public async initialize(): Promise<void> {
this.session = await hmaf.createAgentSession({
mode: AgentMode.MULTI_AGENT,
config: {
maxConcurrentAgents: 4,
timeout: 30000,
enableDistributed: true
}
});
this.intentEngine = await intents.createIntentEngine({
supportedDomains: ['education_assessment', 'learning_diagnosis', 'personalized_learning', 'exam_analysis']
});
await this.registerAgents();
console.info('AssessmentAgentScheduler initialized successfully');
}
/**
* 注册四层评测智能体
*/
private async registerAgents(): Promise<void> {
if (!this.session) return;
// 1. 试卷解析Agent - 试卷结构智能解析与知识点标注
await this.session.registerAgent({
agentId: AgentType.PAPER_PARSER,
capabilities: ['structure_analysis', 'difficulty_assessment', 'knowledge_tagging', 'question_classification'],
promptTemplate: `
你是智能考试试卷解析专家。深度解析试卷结构:
- 结构分析:题目数量、分值分布、答题区域识别
- 难度评估:基于知识点复杂度、计算量、思维深度评估
- 知识标注:每道题对应的知识点、能力维度、认知层次
- 题型分类:选择、填空、解答、证明、应用、开放题
返回JSON格式: {
"totalQuestions": 25,
"subjectDistribution": {"代数": 10, "几何": 8, "统计": 7},
"difficultyDistribution": {"简单": 8, "中等": 12, "困难": 5},
"knowledgePoints": ["函数概念", "三角函数", "数列", "立体几何", "概率统计"],
"questionTypes": ["选择", "填空", "解答"],
"parseTime": 2.5
}
`
});
// 2. 智能阅卷Agent - 客观题自动批阅+主观题智能评分
await this.session.registerAgent({
agentId: AgentType.SMART_GRADER,
capabilities: ['objective_scoring', 'subjective_scoring', 'ocr_recognition', 'handwriting_analysis', 'consistency_check'],
promptTemplate: `
你是智能考试阅卷专家。基于OCR和NLP技术智能阅卷:
- 客观题批阅:选择题自动匹配、填空题模糊匹配、判断题逻辑校验
- 主观题评分:作文语义分析、解答题步骤评分、证明题逻辑完整性
- 手写识别:手写公式识别、手写文字识别、涂改痕迹检测
- 一致性校验:同一试卷不同题型得分合理性、异常答题模式检测
- 评分解释:每道题的得分依据、失分原因、改进建议
返回JSON格式: {
"gradedPapers": [{"studentId": "stu_001", "totalScore": 85, "objectiveScore": 45, "subjectiveScore": 40, "questionScores": {"q1": 5, "q2": 3}, "gradingConfidence": 0.95, "timestamp": 1719480000}],
"consistencyRate": 0.92,
"gradingLatency": 5.0
}
`
});
// 3. 学情诊断Agent - 基于知识图谱的学情深度诊断
await this.session.registerAgent({
agentId: AgentType.DIAGNOSIS_ENGINE,
capabilities: ['knowledge_mapping', 'error_pattern_analysis', 'ability_assessment', 'trend_prediction', 'intervention_recommendation'],
promptTemplate: `
你是学情诊断专家。基于知识图谱深度诊断学情:
- 知识映射:将答题情况映射到知识图谱节点,计算掌握度
- 错误模式:识别概念性错误、计算性错误、审题性错误、策略性错误
- 能力评估:计算能力、推理能力、应用能力、创新能力评估
- 趋势预测:基于历史数据预测学习趋势,识别潜在退步风险
- 干预建议:针对薄弱点生成个性化干预方案
返回JSON格式: {
"studentProfiles": [{"studentId": "stu_001", "overallLevel": "good", "weakPoints": [{"knowledgePoint": "函数单调性", "errorRate": 0.75, "recommendedAction": "加强函数图像理解"}], "strongPoints": ["数列求和"], "trend": "improving"}],
"classAverage": 78.5,
"diagnosisLatency": 3.0
}
`
});
// 4. 个性推送Agent - 精准学习资源推荐与路径规划
await this.session.registerAgent({
agentId: AgentType.PUSH_ENGINE,
capabilities: ['exercise_recommendation', 'path_planning', 'adaptive_difficulty', 'spaced_repetition', 'gamification_design'],
promptTemplate: `
你是个性化学习推送专家。基于学情诊断精准推送学习资源:
- 习题推荐:针对薄弱点推荐变式训练、举一反三、难度递进
- 路径规划:最优学习路径、前置知识补漏、关联知识拓展
- 自适应难度:根据掌握度动态调整题目难度,保持挑战区间
- 间隔重复:基于艾宾浩斯曲线安排复习时机,巩固记忆
- 游戏化设计:积分、徽章、排行榜、挑战任务设计
返回JSON格式: {
"recommendedExercises": [{"studentId": "stu_001", "exercises": [{"id": "ex_001", "type": "选择题", "difficulty": "中等", "knowledgePoint": "函数单调性", "reason": "针对薄弱点专项训练"}], "learningPath": ["函数概念复习", "函数图像绘制", "单调性判定", "综合应用"]}],
"pushSuccessRate": 0.88,
"playbookId": "PUSH-001"
}
`
});
}
/**
* 处理教师输入 - 意图解析 + 智能体分发
*/
public async processAssessmentIntent(input: string, context?: Record<string, unknown>): Promise<void> {
if (!this.session || !this.intentEngine) {
throw new Error('Scheduler not initialized');
}
// 第一步:意图解析
const intentResult: IntentResult = await this.intentEngine.parseIntent(input);
const intent = intentResult.primaryIntent;
console.info(`Detected assessment intent: ${intent.domain}/${intent.action}`);
// 根据意图调整运营阶段
this.adjustStageByIntent(intent);
// 第二步:智能体任务分发
switch (intent.action) {
case 'parse_paper':
await this.dispatchPaperParsing(context?.paperId as string);
break;
case 'grade_papers':
await this.dispatchSmartGrading(context?.batchId as string);
break;
case 'diagnose_learning':
await this.dispatchDiagnosis(context?.studentId as string);
break;
case 'push_exercises':
await this.dispatchPush(context?.studentId as string);
break;
case 'full_assessment':
// 全链路:解析 -> 阅卷 -> 诊断 -> 推送
await this.dispatchFullAssessment(context);
break;
default:
await this.dispatchFullAssessment(context);
}
}
/**
* 根据意图调整运营阶段与光效
*/
private adjustStageByIntent(intent: IntentResult['primaryIntent']): void {
const stageMap: Record<string, AssessmentStage> = {
'parse_paper': AssessmentStage.PAPER,
'grade_papers': AssessmentStage.PAPER,
'diagnose_learning': AssessmentStage.ANALYSIS,
'push_exercises': AssessmentStage.PUSH,
'full_assessment': AssessmentStage.OVERVIEW
};
const newStage = stageMap[intent.action] || AssessmentStage.OVERVIEW;
this.onStageChanged?.(newStage);
}
/**
* 分发试卷解析任务
*/
private async dispatchPaperParsing(paperId: string): Promise<void> {
const task: TaskMessage = {
targetAgent: AgentType.PAPER_PARSER,
taskType: 'parse',
payload: { paperId },
priority: 1
};
const result: TaskResult = await this.session!.sendTask(task);
this.paperResult = JSON.parse(result.data);
// 触发回调
this.onPaperParsed?.(this.paperResult);
// 更新全局状态
AppStorage.setOrCreate('paper_result', this.paperResult);
}
/**
* 分发智能阅卷任务
*/
private async dispatchSmartGrading(batchId: string): Promise<void> {
const task: TaskMessage = {
targetAgent: AgentType.SMART_GRADER,
taskType: 'grade',
payload: {
batchId,
paperData: this.paperResult
},
priority: 2
};
const result: TaskResult = await this.session!.sendTask(task);
this.gradingResult = JSON.parse(result.data);
// 触发回调
this.onGradingCompleted?.(this.gradingResult);
// 更新全局状态
AppStorage.setOrCreate('grading_result', this.gradingResult);
}
/**
* 分发学情诊断任务
*/
private async dispatchDiagnosis(studentId: string): Promise<void> {
const task: TaskMessage = {
targetAgent: AgentType.DIAGNOSIS_ENGINE,
taskType: 'diagnose',
payload: {
studentId,
gradingData: this.gradingResult,
paperData: this.paperResult
},
priority: 3
};
const result: TaskResult = await this.session!.sendTask(task);
this.diagnosisResult = JSON.parse(result.data);
// 触发回调
this.onDiagnosisCompleted?.(this.diagnosisResult);
// 更新全局状态并切换光效
AppStorage.setOrCreate('diagnosis_result', this.diagnosisResult);
// 根据最低学情等级自动切换光效(关注最薄弱)
if (this.diagnosisResult && this.diagnosisResult.studentProfiles.length > 0) {
const minStudent = this.diagnosisResult.studentProfiles.reduce((min, student) => {
const priority = ['excellent', 'good', 'average', 'weak', 'critical'];
return priority.indexOf(student.overallLevel) > priority.indexOf(min.overallLevel) ? student : min;
});
this.lightManager.switchLearningLevel(minStudent.overallLevel as LearningHealthLevel);
}
// 更新知识点节点
this.updateKnowledgeNodesFromResult(this.diagnosisResult);
}
/**
* 分发个性推送任务
*/
private async dispatchPush(studentId: string): Promise<void> {
const task: TaskMessage = {
targetAgent: AgentType.PUSH_ENGINE,
taskType: 'push',
payload: {
studentId,
diagnosisData: this.diagnosisResult,
gradingData: this.gradingResult
},
priority: 4
};
const result: TaskResult = await this.session!.sendTask(task);
this.pushResult = JSON.parse(result.data);
// 触发回调
this.onPushCompleted?.(this.pushResult);
// 推送完成后切换为良好态
if (this.pushResult?.pushSuccessRate > 0.8) {
this.lightManager.switchLearningLevel(LearningHealthLevel.GOOD);
}
}
/**
* 全链路评测流程
*/
private async dispatchFullAssessment(context?: Record<string, unknown>): Promise<void> {
try {
// 阶段1:试卷解析
await this.dispatchPaperParsing(context?.paperId as string || 'paper_001');
// 阶段2:智能阅卷
await this.dispatchSmartGrading(context?.batchId as string || 'batch_001');
// 阶段3:学情诊断
await this.dispatchDiagnosis(context?.studentId as string || 'all');
// 阶段4:个性推送
await this.dispatchPush(context?.studentId as string || 'all');
} catch (error) {
console.error('Full assessment failed:', error);
}
}
/**
* 更新知识点节点数据
*/
private updateKnowledgeNodesFromResult(result: DiagnosisResult): void {
for (const profile of result.studentProfiles) {
for (const weakPoint of profile.weakPoints) {
const node: KnowledgeNode = {
id: `${profile.studentId}_${weakPoint.knowledgePoint}`,
name: weakPoint.knowledgePoint,
subject: '数学',
chapter: '函数',
learningLevel: profile.overallLevel as LearningHealthLevel,
masteryRate: 100 - weakPoint.errorRate * 100,
questionCount: 0,
errorCount: Math.round(weakPoint.errorRate * 10),
lastTest: Date.now(),
x: Math.random() * 800,
y: Math.random() * 600,
connections: []
};
this.knowledgeNodes.set(node.id, node);
}
}
}
// 设置回调
public setOnPaperParsed(callback: (result: PaperResult) => void): void {
this.onPaperParsed = callback;
}
public setOnGradingCompleted(callback: (result: GradingResult) => void): void {
this.onGradingCompleted = callback;
}
public setOnDiagnosisCompleted(callback: (result: DiagnosisResult) => void): void {
this.onDiagnosisCompleted = callback;
}
public setOnPushCompleted(callback: (result: PushResult) => void): void {
this.onPushCompleted = callback;
}
public setOnStageChanged(callback: (stage: AssessmentStage) => void): void {
this.onStageChanged = callback;
}
}

5.4 悬浮评测导航(AssessmentFloatNavigation.ets)
代码亮点:本模块实现了"学情态势即导航"的悬浮页签系统。底部悬浮导航不仅承载"态势总览/试卷监控/学情分析/个性推送"四个运营阶段切换,更实时显示学情统计徽章(临界/薄弱/中等数量)和智能体运行状态角标。采用 HdsTabs 悬浮样式配合 systemMaterialEffect 实现玻璃拟态+学情光效的双重效果,支持透明度三档调节,最大化评测展示区域。
TypeScript
// entry/src/main/ets/components/AssessmentFloatNavigation.ets
import { window } from '@kit.ArkUI';
import { LearningLightManager, LearningHealthLevel, LearningLightTheme } from '../theme/LearningLightEffect';
import { AssessmentStage } from '../agents/AssessmentAgentScheduler';
// 导航项配置
interface AssessmentNavItem {
id: string;
icon: Resource;
label: string;
page: string;
stage: AssessmentStage;
}
@Component
export struct AssessmentFloatNavigation {
@State currentIndex: number = 0;
@State navTransparency: number = 0.70;
@State isExpanded: boolean = false;
@State bottomAvoidHeight: number = 0;
@State currentStage: AssessmentStage = AssessmentStage.OVERVIEW;
@State currentTheme: LearningLightTheme | null = null;
// 学情统计
@State criticalCount: number = 0;
@State weakCount: number = 0;
@State averageCount: number = 0;
@State goodCount: number = 0;
private lightManager: LearningLightManager;
private navItems: AssessmentNavItem[] = [
{ id: 'overview', icon: $r('app.media.ic_dashboard'), label: '态势总览', page: 'OverviewPage', stage: AssessmentStage.OVERVIEW },
{ id: 'paper', icon: $r('app.media.ic_paper'), label: '试卷监控', page: 'PaperPage', stage: AssessmentStage.PAPER },
{ id: 'analysis', icon: $r('app.media.ic_analysis'), label: '学情分析', page: 'AnalysisPage', stage: AssessmentStage.ANALYSIS },
{ id: 'push', icon: $r('app.media.ic_push'), label: '个性推送', page: 'PushPage', stage: AssessmentStage.PUSH }
];
constructor(lightManager: LearningLightManager) {
this.lightManager = lightManager;
}
aboutToAppear(): void {
this.getBottomAvoidArea();
// 监听光效主题变化
this.lightManager.onThemeChange((theme) => {
this.currentTheme = theme;
});
// 监听学情统计变化
AppStorage.setOrCreate('learning_stats', (stats: { critical: number; weak: number; average: number; good: number }) => {
this.criticalCount = stats.critical;
this.weakCount = stats.weak;
this.averageCount = stats.average;
this.goodCount = stats.good;
});
// 初始化当前主题
this.currentTheme = this.lightManager.getCurrentTheme();
}
aboutToDisappear(): void {
this.lightManager.offThemeChange(() => {});
}
private async getBottomAvoidArea(): Promise<void> {
try {
const mainWindow = await window.getLastWindow();
const avoidArea = mainWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR);
this.bottomAvoidHeight = avoidArea.bottomRect.height;
} catch (error) {
console.error('Failed to get avoid area:', error);
}
}
private getStageColor(): string {
return this.currentTheme?.primaryColor || '#4CAF50';
}
private getLearningBadgeCount(itemId: string): number {
switch (itemId) {
case 'analysis': return this.weakCount + this.averageCount;
case 'push': return this.criticalCount;
default: return 0;
}
}
private getLearningBadgeColor(): string {
if (this.criticalCount > 0) return '#D32F2F';
if (this.weakCount > 0) return '#EF5350';
if (this.averageCount > 0) return '#FFA726';
return '#42A5F5';
}
build() {
Stack({ alignContent: Alignment.Bottom }) {
// 内容层
Column() {
this.contentBuilder()
}
.padding({ bottom: this.bottomAvoidHeight + 80 })
// 悬浮导航栏
Column() {
Stack() {
// 玻璃拟态背景
Column()
.width('100%')
.height('100%')
.backgroundBlurStyle(BlurStyle.REGULAR)
.opacity(this.navTransparency)
.backdropFilter($r('sys.blur.20'))
// 学情光效渐变层
Column()
.width('100%')
.height('100%')
.linearGradient({
direction: GradientDirection.Top,
colors: [
[this.getStageColor() + '20', 0.0],
[this.getStageColor() + '05', 1.0]
]
})
}
.width('100%')
.height('100%')
.borderRadius(24)
.shadow({
radius: 20,
color: (this.currentTheme?.primaryColor || '#4CAF50') + '40',
offsetX: 0,
offsetY: -4
})
// 导航项
Row() {
ForEach(this.navItems, (item: AssessmentNavItem, index: number) => {
Column() {
Stack() {
Image(item.icon)
.width(24)
.height(24)
.fillColor(this.currentIndex === index ? this.getStageColor() : '#666666')
// 学情统计徽章
if (this.getLearningBadgeCount(item.id) > 0) {
Stack() {
Text(`${this.getLearningBadgeCount(item.id)}`)
.fontSize(10)
.fontColor('#FFFFFF')
.fontWeight(FontWeight.Bold)
}
.width(18)
.height(18)
.backgroundColor(this.getLearningBadgeColor())
.borderRadius(9)
.position({ x: 14, y: -6 })
.shadow({
radius: 6,
color: this.getLearningBadgeColor(),
offsetX: 0,
offsetY: 0
})
}
// 阶段指示器
if (item.stage === this.currentStage) {
Column()
.width(6)
.height(6)
.backgroundColor(this.getStageColor())
.borderRadius(3)
.position({ x: 20, y: 20 })
.shadow({
radius: 4,
color: this.getStageColor(),
offsetX: 0,
offsetY: 0
})
}
}
.width(40)
.height(40)
Text(item.label)
.fontSize(11)
.fontColor(this.currentIndex === index ? this.getStageColor() : '#999999')
.margin({ top: 4 })
}
.layoutWeight(1)
.onClick(() => {
this.currentIndex = index;
this.currentStage = item.stage;
AppStorage.setOrCreate('assessment_stage', item.stage);
this.triggerHapticFeedback();
})
})
}
.width('100%')
.height(80)
.padding({ left: 16, right: 16 })
.justifyContent(FlexAlign.SpaceAround)
// 透明度调节
if (this.isExpanded) {
Row() {
Text('透明度')
.fontSize(12)
.fontColor('#666666')
.margin({ right: 8 })
Slider({
value: this.navTransparency * 100,
min: 55,
max: 85,
step: 15,
style: SliderStyle.InSet
})
.width(120)
.onChange((value: number) => {
this.navTransparency = value / 100;
})
Text(`${Math.round(this.navTransparency * 100)}%`)
.fontSize(12)
.fontColor('#666666')
.margin({ left: 8 })
}
.width('100%')
.height(40)
.justifyContent(FlexAlign.Center)
.backgroundColor('rgba(255,255,255,0.5)')
.borderRadius({ topLeft: 12, topRight: 12 })
}
}
.width('92%')
.height(this.isExpanded ? 120 : 80)
.margin({ bottom: this.bottomAvoidHeight + 12, left: '4%', right: '4%' })
.animation({
duration: 300,
curve: Curve.Spring,
iterations: 1
})
.gesture(
LongPressGesture({ duration: 500 })
.onAction(() => {
this.isExpanded = !this.isExpanded;
})
)
}
.width('100%')
.height('100%')
}
@BuilderParam contentBuilder: () => void = this.defaultContentBuilder;
@Builder
defaultContentBuilder(): void {
Column() {
Text('态势感知区域')
.fontSize(16)
.fontColor('#999999')
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
private triggerHapticFeedback(): void {
try {
import('@kit.SensorServiceKit').then(sensor => {
sensor.vibrator.startVibration({
type: 'time',
duration: 50
}, { id: 0 });
});
} catch (error) {
console.error('Haptic feedback failed:', error);
}
}
}
5.5 主评测态势大屏(AssessmentCenterPage.ets)
代码亮点:本模块是"光测智评"的核心可视化界面,基于 Canvas 实现班级学情分布的实时渲染。知识点节点根据学情健康度显示不同颜色与脉冲效果,学情链路实现动态流光动画。支持手势缩放与拖拽,双击节点下钻查看详情。环境背景光随全局学情健康度动态变化。
TypeScript
// entry/src/main/ets/pages/AssessmentCenterPage.ets
import { LearningLightManager, KnowledgeNode, LearningLink, LearningHealthLevel } from '../theme/LearningLightEffect';
import { AssessmentAgentScheduler, AssessmentStage } from '../agents/AssessmentAgentScheduler';
@Component
struct KnowledgeMapCanvas {
@State nodes: KnowledgeNode[] = [];
@State links: LearningLink[] = [];
@State scale: number = 1.0;
@State offsetX: number = 0;
@State offsetY: number = 0;
@State selectedNode: KnowledgeNode | null = null;
@State currentTheme: LearningLightTheme | null = null;
private lightManager: LearningLightManager;
private scheduler: AssessmentAgentScheduler;
private canvasContext: CanvasRenderingContext2D | null = null;
private animationId: number = 0;
constructor(lightManager: LearningLightManager, scheduler: AssessmentAgentScheduler) {
this.lightManager = lightManager;
this.scheduler = scheduler;
}
aboutToAppear(): void {
// 监听光效变化
this.lightManager.onThemeChange((theme) => {
this.currentTheme = theme;
this.invalidate();
});
// 监听节点数据变化
AppStorage.setOrCreate('knowledge_nodes', (nodes: KnowledgeNode[]) => {
this.nodes = nodes;
this.invalidate();
});
// 监听链路数据变化
AppStorage.setOrCreate('learning_links', (links: LearningLink[]) => {
this.links = links;
this.invalidate();
});
// 启动动画循环
this.startAnimationLoop();
}
aboutToDisappear(): void {
this.lightManager.offThemeChange(() => {});
if (this.animationId) {
cancelAnimationFrame(this.animationId);
}
}
private startAnimationLoop(): void {
const animate = () => {
this.invalidate();
this.animationId = requestAnimationFrame(animate);
};
this.animationId = requestAnimationFrame(animate);
}
private invalidate(): void {
if (this.canvasContext) {
this.drawKnowledgeMap(this.canvasContext);
}
}
private drawKnowledgeMap(ctx: CanvasRenderingContext2D): void {
const width = ctx.canvas.width;
const height = ctx.canvas.height;
const time = Date.now();
// 清空画布
ctx.clearRect(0, 0, width, height);
// 绘制环境背景光
if (this.currentTheme) {
const gradient = ctx.createRadialGradient(
width / 2, height / 2, 0,
width / 2, height / 2, Math.max(width, height) / 2
);
gradient.addColorStop(0, this.currentTheme.primaryColor + '10');
gradient.addColorStop(1, 'transparent');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, width, height);
}
// 保存变换状态
ctx.save();
ctx.translate(this.offsetX, this.offsetY);
ctx.scale(this.scale, this.scale);
// 绘制学情链路
for (const link of this.links) {
if (!link.isActive) continue;
const sourceNode = this.nodes.find(n => n.id === link.sourceId);
const targetNode = this.nodes.find(n => n.id === link.targetId);
if (!sourceNode || !targetNode) continue;
// 链路流光效果
const flowOffset = (time % this.currentTheme?.flowLineSpeed || 2000) / (this.currentTheme?.flowLineSpeed || 2000);
const linkColor = this.getLearningColor(link.learningLevel);
ctx.beginPath();
ctx.moveTo(sourceNode.x, sourceNode.y);
ctx.lineTo(targetNode.x, targetNode.y);
ctx.strokeStyle = linkColor + '40';
ctx.lineWidth = 2;
ctx.stroke();
// 流光点
const flowX = sourceNode.x + (targetNode.x - sourceNode.x) * flowOffset;
const flowY = sourceNode.y + (targetNode.y - sourceNode.y) * flowOffset;
ctx.beginPath();
ctx.arc(flowX, flowY, 4, 0, Math.PI * 2);
ctx.fillStyle = linkColor;
ctx.fill();
ctx.shadowColor = linkColor;
ctx.shadowBlur = 10;
}
// 绘制知识点节点
for (const node of this.nodes) {
const nodeColor = this.getLearningColor(node.learningLevel);
const pulseIntensity = this.getPulseIntensity(node.learningLevel, time);
// 节点光晕
ctx.beginPath();
ctx.arc(node.x, node.y, 30 + pulseIntensity * 10, 0, Math.PI * 2);
ctx.fillStyle = nodeColor + '20';
ctx.fill();
// 节点外圈
ctx.beginPath();
ctx.arc(node.x, node.y, 20, 0, Math.PI * 2);
ctx.strokeStyle = nodeColor;
ctx.lineWidth = this.currentTheme?.nodeBorderWidth || 2;
ctx.stroke();
// 节点内核
ctx.beginPath();
ctx.arc(node.x, node.y, 16, 0, Math.PI * 2);
ctx.fillStyle = nodeColor;
ctx.fill();
// 节点标签
ctx.fillStyle = '#FFFFFF';
ctx.font = '12px sans-serif';
ctx.textAlign = 'center';
ctx.fillText(node.name, node.x, node.y + 35);
ctx.fillText(`${node.masteryRate}%`, node.x, node.y + 50);
}
ctx.restore();
}
private getLearningColor(level: LearningHealthLevel): string {
const colors: Record<LearningHealthLevel, string> = {
[LearningHealthLevel.EXCELLENT]: '#4CAF50',
[LearningHealthLevel.GOOD]: '#42A5F5',
[LearningHealthLevel.AVERAGE]: '#FFA726',
[LearningHealthLevel.WEAK]: '#EF5350',
[LearningHealthLevel.CRITICAL]: '#D32F2F'
};
return colors[level] || '#4CAF50';
}
private getPulseIntensity(level: LearningHealthLevel, time: number): number {
const speeds: Record<LearningHealthLevel, number> = {
[LearningHealthLevel.EXCELLENT]: 4000,
[LearningHealthLevel.GOOD]: 3500,
[LearningHealthLevel.AVERAGE]: 2500,
[LearningHealthLevel.WEAK]: 1500,
[LearningHealthLevel.CRITICAL]: 800
};
const speed = speeds[level] || 4000;
return Math.sin((time % speed) / speed * Math.PI * 2) * 0.5 + 0.5;
}
build() {
Canvas(this.canvasContext)
.width('100%')
.height('100%')
.backgroundColor('#0D1117')
.onReady((context) => {
this.canvasContext = context;
})
.gesture(
GestureGroup(GestureMode.Sequence,
PinchGesture()
.onActionStart((event) => {
this.scale = Math.max(0.5, Math.min(3.0, this.scale * event.scale));
}),
PanGesture()
.onActionUpdate((event) => {
this.offsetX += event.offsetX;
this.offsetY += event.offsetY;
})
)
)
.onClick((event) => {
// 节点选中检测
const clickX = (event.x - this.offsetX) / this.scale;
const clickY = (event.y - this.offsetY) / this.scale;
for (const node of this.nodes) {
const dist = Math.sqrt((clickX - node.x) ** 2 + (clickY - node.y) ** 2);
if (dist < 25) {
this.selectedNode = node;
AppStorage.setOrCreate('selected_knowledge_node', node);
break;
}
}
})
}
}
@Entry
@Component
struct AssessmentCenterPage {
private lightManager: LearningLightManager = new LearningLightManager();
private scheduler: AssessmentAgentScheduler = new AssessmentAgentScheduler(this.lightManager);
aboutToAppear(): void {
this.scheduler.initialize().then(() => {
// 启动全链路评测
this.scheduler.processAssessmentIntent('开始全面考试评测');
});
}
build() {
Stack() {
// 背景环境光
Column()
.width('100%')
.height('100%')
.backgroundColor('#0D1117')
.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
// 知识图谱画布
KnowledgeMapCanvas({ lightManager: this.lightManager, scheduler: this.scheduler })
.width('100%')
.height('100%')
// 顶部状态栏
Row() {
Text('光测智评')
.fontSize(20)
.fontColor('#FFFFFF')
.fontWeight(FontWeight.Bold)
Blank()
// 学情统计
Row({ space: 12 }) {
this.learningBadge('临界', 0, '#D32F2F')
this.learningBadge('薄弱', 0, '#EF5350')
this.learningBadge('中等', 0, '#FFA726')
this.learningBadge('良好', 0, '#42A5F5')
}
}
.width('100%')
.height(56)
.padding({ left: 24, right: 24 })
.backgroundColor('rgba(13,17,23,0.8)')
.backdropFilter($r('sys.blur.10'))
// 悬浮评测导航
AssessmentFloatNavigation({ lightManager: this.lightManager })
.width('100%')
.height('100%')
}
.width('100%')
.height('100%')
}
@Builder
learningBadge(label: string, count: number, color: string): void {
Row() {
Circle()
.width(8)
.height(8)
.fill(color)
Text(`${label} ${count}`)
.fontSize(12)
.fontColor('#FFFFFF')
.margin({ left: 4 })
}
}
}
5.6 浮动试卷窗口(PaperFloatAbility.ets)
代码亮点:本模块实现了可拖拽的浮动试卷子窗口。通过 window.createSubWindow 创建独立浮动窗口,支持自由拖拽定位。窗口内展示选中试卷的详细内容,题目难度颜色与主窗口光效同步。窗口获得焦点时自动提高透明度,失焦时降低透明度,避免干扰主评测大屏。
TypeScript
// entry/src/main/ets/entryability/PaperFloatAbility.ets
import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
export default class PaperFloatAbility extends UIAbility {
private floatWindow: window.Window | null = null;
async onWindowStageCreate(windowStage: window.WindowStage): Promise<void> {
// 创建浮动窗口
this.floatWindow = await windowStage.createSubWindow('PaperFloat');
// 配置浮动窗口属性
await this.floatWindow.setWindowLayoutFullScreen(false);
await this.floatWindow.setWindowSize({ width: 400, height: 300 });
await this.floatWindow.setWindowPosition({ x: 100, y: 100 });
await this.floatWindow.setWindowBackgroundColor('rgba(13,17,23,0.85)');
// 加载浮动内容
this.floatWindow.loadContent('pages/PaperFloatPage', (err) => {
if (err) {
console.error('Failed to load float content:', err);
return;
}
console.info('Paper float window loaded');
});
// 焦点感知
this.floatWindow.on('windowFocusChange', (isFocused) => {
if (isFocused) {
this.floatWindow?.setWindowBackgroundColor('rgba(13,17,23,0.95)');
} else {
this.floatWindow?.setWindowBackgroundColor('rgba(13,17,23,0.70)');
}
});
}
onWindowStageDestroy(): void {
this.floatWindow?.destroy();
}
}
5.7 多窗口光效同步管理器(WindowLightSync.ets)
代码亮点:本模块实现了主窗口与三个浮动窗口之间的光效同步。通过 AppStorage 全局状态共享,当主窗口学情健康度变化时,所有浮动窗口自动同步切换光效。支持焦点感知降级——当某个窗口获得焦点时,其他窗口的光效强度自动降低,避免视觉干扰。
TypeScript
// entry/src/main/ets/services/WindowLightSync.ets
import { window } from '@kit.ArkUI';
import { LearningLightManager, LearningLightTheme, LearningHealthLevel } from '../theme/LearningLightEffect';
/**
* 窗口光效同步管理器
* 实现主窗口与浮动窗口之间的光效联动
*/
export class WindowLightSync {
private mainWindow: window.Window | null = null;
private floatWindows: Map<string, window.Window> = new Map();
private lightManager: LearningLightManager;
private isMainFocused: boolean = true;
constructor(lightManager: LearningLightManager) {
this.lightManager = lightManager;
}
/**
* 注册主窗口
*/
public async registerMainWindow(windowStage: window.WindowStage): Promise<void> {
this.mainWindow = await windowStage.getMainWindow();
// 监听主窗口焦点
this.mainWindow.on('windowFocusChange', (isFocused) => {
this.isMainFocused = isFocused;
this.syncLightIntensity();
});
// 监听光效变化
this.lightManager.onThemeChange((theme) => {
this.applyThemeToAllWindows(theme);
});
}
/**
* 注册浮动窗口
*/
public registerFloatWindow(name: string, win: window.Window): void {
this.floatWindows.set(name, win);
// 监听浮动窗口焦点
win.on('windowFocusChange', (isFocused) => {
if (isFocused) {
this.syncLightIntensity();
}
});
}
/**
* 应用光效主题到所有窗口
*/
private applyThemeToAllWindows(theme: LearningLightTheme): void {
// 主窗口应用完整光效
if (this.mainWindow) {
this.setWindowLightEffect(this.mainWindow, theme, 1.0);
}
// 浮动窗口应用同步光效
for (const [name, win] of this.floatWindows) {
const intensity = this.isMainFocused ? 0.6 : 0.9;
this.setWindowLightEffect(win, theme, intensity);
}
}
/**
* 同步光效强度
*/
private syncLightIntensity(): void {
const theme = this.lightManager.getCurrentTheme();
if (this.isMainFocused) {
// 主窗口聚焦:主窗口100%,浮动窗口60%
if (this.mainWindow) {
this.setWindowLightEffect(this.mainWindow, theme, 1.0);
}
for (const [name, win] of this.floatWindows) {
this.setWindowLightEffect(win, theme, 0.6);
}
} else {
// 浮动窗口聚焦:浮动窗口90%,主窗口30%
if (this.mainWindow) {
this.setWindowLightEffect(this.mainWindow, theme, 0.3);
}
for (const [name, win] of this.floatWindows) {
this.setWindowLightEffect(win, theme, 0.9);
}
}
}
/**
* 设置窗口光效
*/
private setWindowLightEffect(
win: window.Window,
theme: LearningLightTheme,
intensity: number
): void {
try {
// 设置窗口背景色调
const r = parseInt(theme.primaryColor.slice(1, 3), 16);
const g = parseInt(theme.primaryColor.slice(3, 5), 16);
const b = parseInt(theme.primaryColor.slice(5, 7), 16);
const alpha = Math.round(theme.ambientOpacity * intensity * 255);
const bgColor = `rgba(${r}, ${g}, ${b}, ${alpha / 255})`;
win.setWindowBackgroundColor(bgColor);
// 设置边框光效
win.setWindowShadow({
radius: 20 * intensity,
color: theme.primaryColor + Math.round(40 * intensity).toString(16).padStart(2, '0'),
offsetX: 0,
offsetY: -4
});
} catch (error) {
console.error('Failed to set window light effect:', error);
}
}
/**
* 广播学情健康度变化
*/
public broadcastLearningLevel(level: LearningHealthLevel): void {
this.lightManager.switchLearningLevel(level);
}
}
六、关键技术总结
6.1 HMAF智能考试评测开发清单
| 技术点 | API/方法 | 应用场景 |
|---|---|---|
| 智能体会话创建 | hmaf.createAgentSession({ mode: MULTI_AGENT }) |
多智能体协作评测 |
| 意图解析 | intents.createIntentEngine({ supportedDomains }) |
教师查询意图理解 |
| 任务分发 | hmafSession.sendTask({ targetAgent, taskType }) |
智能体间评测任务调度 |
| 状态监听 | AppStorage 全局状态回调 |
跨组件评测态势同步 |
| 分布式协同 | enableDistributed: true |
多设备评测协作 |
6.2 沉浸光感实现清单
表格
| 技术点 | API/方法 | 应用场景 |
|---|---|---|
| 系统材质效果 | systemMaterialEffect: SystemMaterialEffect.IMMERSIVE |
HdsNavigation标题栏 |
| 背景模糊 | backgroundBlurStyle(BlurStyle.REGULAR) |
悬浮导航玻璃拟态 |
| 背景滤镜 | backdropFilter($r('sys.blur.20')) |
精细模糊控制 |
| 安全区扩展 | expandSafeArea([SafeAreaType.SYSTEM], [...]) |
全屏沉浸布局 |
| 窗口沉浸 | setWindowLayoutFullScreen(true) |
无边框模式 |
| 光效动画 | animation({ duration, iterations: -1 }) |
呼吸灯背景 |
| 动态透明度 | backgroundOpacity |
焦点感知降级 |
6.3 学情健康度光效映射
表格
| 学情健康度 | 主色 | 辅色 | 脉冲间隔 | 环境透明度 | 应用场景 |
|---|---|---|---|---|---|
| 优秀(EXCELLENT) | #4CAF50 | #81C784 | 3000ms | 0.05 | 掌握率90%以上 |
| 良好(GOOD) | #42A5F5 | #90CAF9 | 2500ms | 0.08 | 掌握率70-90% |
| 中等(AVERAGE) | #FFA726 | #FFCC80 | 1500ms | 0.12 | 掌握率50-70% |
| 薄弱(WEAK) | #EF5350 | #EF9A9A | 800ms | 0.18 | 掌握率30-50% |
| 临界(CRITICAL) | #D32F2F | #E57373 | 400ms | 0.25 | 掌握率30%以下 |
6.4 PC端多窗口光效协同
表格
| 场景 | 主窗口光效 | 浮动窗口光效 | 同步机制 |
|---|---|---|---|
| 主窗口聚焦 | 100%强度 | 60%强度 | AppStorage广播 |
| 浮动窗口聚焦 | 30%强度 | 90%强度 | 焦点事件触发 |
| 学情健康度变化 | 全色域切换 | 同步色域切换 | 主题回调监听 |
| 评测完成 | 确认绿光 | 同步绿光 | 状态变更通知 |

七、调试与适配建议
7.1 试卷数据解析性能优化
- 采样策略:高题量环境采用分页加载,低题量环境全量解析
- 异步处理:数据解析使用
TaskPool异步线程,避免阻塞UI - 缓存机制:历史试卷数据本地缓存,减少云端查询延迟
7.2 学情光效可访问性
- 色盲友好:除颜色外,增加图标形状差异(圆形/三角形/菱形)
- 闪烁控制:临界状态的脉冲频率不超过3Hz,避免光敏性癫痫触发
- 手动关闭:提供"光效静音"开关,满足特殊环境需求
7.3 多窗口管理优化
- 窗口记忆:记录浮动窗口位置与大小,下次启动自动恢复
- 吸附对齐:浮动窗口靠近边缘时自动吸附,避免遮挡关键内容
- 一键归位:提供"重置布局"按钮,快速恢复默认窗口配置
八、运行效果展示
8.1 优秀态势 - 柔绿光效
班级整体掌握率90%以上,无薄弱学生。环境光呈现柔和绿色,知识点缓慢呼吸,学情链路稳定流光。
8.2 良好态势 - 淡蓝光效
班级整体掌握率70-90%。环境光转为淡蓝,良好知识点蓝色脉冲,学情链路流光加速。
8.3 中等态势 - 暖黄光效
班级出现中等掌握学生。环境光转为暖黄,中等知识点黄色脉冲,悬浮导航显示中等徽章。
8.4 薄弱态势 - 橙红光效
班级出现薄弱学生。环境光转为橙红,薄弱知识点红色脉冲,学情链路流光急速流动,悬浮导航显示薄弱徽章。
8.5 临界态势 - 警示红光效
班级出现临界学生(掌握率30%以下)。环境光强烈红光闪烁,临界知识点快速脉冲,所有窗口同步红色告警,悬浮导航显示临界徽章并震动提醒。
九、总结与展望
本文基于HarmonyOS 6(API 23)的悬浮导航、沉浸光感与HMAF智能体框架特性,完整实战了一款面向PC端的"光测智评"智能考试评测与学情分析指挥中心。核心创新点总结:
- HMAF四层评测智能体:基于Agent Framework Kit构建试卷解析Agent(试卷结构智能解析与知识点标注)、智能阅卷Agent(客观题自动批阅+主观题智能评分)、学情诊断Agent(基于知识图谱的学情深度诊断)、个性推送Agent(精准学习资源推荐与路径规划),实现"试卷解析→智能阅卷→学情诊断→个性推送"的全链路自动化,阅卷效率提升100倍
- 学情健康度光效系统:五种学情状态拥有专属光效人格(优秀柔绿、良好淡蓝、中等暖黄、薄弱橙红、临界警示红),根据当前最低学情等级动态切换全局环境光、知识点脉冲和导航材质,实现教师"一眼感知学情"的直觉体验
- 悬浮评测导航:底部悬浮页签承载"态势总览/试卷监控/学情分析/个性推送"四个运营阶段,实时显示学情统计徽章(临界/薄弱/中等数量)和智能体运行状态角标,玻璃拟态设计+三档透明度调节,最大化评测展示区域
- PC级多窗口协作评测:主评测窗口 + 浮动试卷窗口 + 浮动学情雷达图窗口 + 浮动错题归因窗口的四层架构,通过
WindowLightSync实现跨窗口光效联动与焦点感知,符合教师的专业评测工作习惯 - 评测意图沉浸感知:通过Intents Kit解析教师的查询意图(如"查找班级数学函数章节的所有薄弱学生"),自动触发对应Agent协作并调整界面学情光效,实现"查询即氛围"的沉浸体验
未来扩展方向:
- AI监考模式:增加智能监考Agent,实现实时异常行为检测与预警
- 数字孪生课堂:构建课堂环境的数字孪生,支持教学仿真与方案预演
- 跨设备教育协同:利用鸿蒙分布式能力,实现PC主控+教室大屏+学生平板+家长移动端的多设备协同
- 脑科学学习:集成脑电波监测,基于认知负荷动态调整学习难度
转载自:https://blog.csdn.net/u014727709/article/details/162383000
欢迎 👍点赞✍评论⭐收藏,欢迎指正
更多推荐



所有评论(0)