文章目录
-
- 每日一句正能量
- 前言
- 一、前言:智能理财的范式跃迁
- 二、核心特性解析与技术选型
-
- [2.1 沉浸光感在金融理财中的价值](#2.1 沉浸光感在金融理财中的价值)
- [2.2 悬浮导航的理财适配](#2.2 悬浮导航的理财适配)
- [2.3 技术架构选型](#2.3 技术架构选型)
- 三、项目实战:"智财管家"架构设计
-
- [3.1 应用场景与功能规划](#3.1 应用场景与功能规划)
- [3.2 技术架构图](#3.2 技术架构图)
- 四、环境配置与模块依赖
-
- [4.1 模块依赖配置](#4.1 模块依赖配置)
- [4.2 权限声明(module.json5)](#4.2 权限声明(module.json5))
- 五、核心组件实战
-
- [5.1 市场状态光效系统(MarketLightSystem.ets)](#5.1 市场状态光效系统(MarketLightSystem.ets))
- [5.2 HMAF 2.0理财分析引擎(FinanceAnalysisEngine.ets)](#5.2 HMAF 2.0理财分析引擎(FinanceAnalysisEngine.ets))
- [5.3 悬浮理财导航(FinanceFloatNav.ets)](#5.3 悬浮理财导航(FinanceFloatNav.ets))
- [5.4 K线图组件(KLineChart.ets)](#5.4 K线图组件(KLineChart.ets))
- [5.5 跨设备理财协同(DistributedFinanceSync.ets)](#5.5 跨设备理财协同(DistributedFinanceSync.ets))
- 六、市场波动与光效映射
-
- [6.1 市场状态机设计](#6.1 市场状态机设计)
- 七、关键技术总结
-
- [7.1 HMAF 2.0金融智能体开发清单](#7.1 HMAF 2.0金融智能体开发清单)
- [7.2 沉浸光感实现清单](#7.2 沉浸光感实现清单)
- [7.3 悬浮导航适配要点](#7.3 悬浮导航适配要点)
- 八、调试与性能优化
-
- [8.1 真机调试建议](#8.1 真机调试建议)
- [8.2 性能优化策略](#8.2 性能优化策略)
- 九、总结与展望

每日一句正能量
"不为往事扰,不为余生忧,专注于眼前的一茶一饭一人。"
往事已逝,忧也无用;余生未至,虑亦徒劳。一茶一饭一人,不是小确幸的自我麻醉,而是把全部生命力灌注于此刻的具体事物上。
前言
摘要:2026年,智能理财从"被动查询"向"主动管理"进化。HarmonyOS 6(API 23)引入的鸿蒙智能体框架2.0(HMAF 2.0)与Intents Kit意图框架服务,为金融开发者提供了构建"AI理财管家"的全新可能。本文将实战开发一款名为"智财管家"的全场景金融智能体应用,展示如何利用HMAF 2.0构建支持市场行情分析、用户资产配置、风险评估和智能调仓的AI理财引擎,通过悬浮导航实现理财模块快速切换,基于沉浸光感打造"市场状态即光效"的沉浸式理财体验,以及结合分布式软总线实现跨设备理财协同。
一、前言:智能理财的范式跃迁
传统理财应用长期受限于"数据展示→手动操作→滞后决策"的被动模式------用户需要主动查看行情、手动分析数据、凭经验做出决策,系统无法理解市场趋势和用户风险偏好,更无法在风险来临前及时预警。当市场大幅波动时,传统应用往往只能在用户主动查看时才显示数据,错过了最佳调仓时机。
2026年,随着HMAF 2.0和Intents Kit的升级,鸿蒙智能体正式向主动理财管理演进。根据HDC 2026发布的信息,小艺已不再是单纯的语音助手,而是深度融入HarmonyOS的"智慧大脑",具备理解意图、调度工具、自主规划与闭环执行的能力。
HarmonyOS 6(API 23)的HMAF 2.0框架支持LLM模式、工作流模式、A2A模式和OpenClaw模式四种智能体编排方式,配合Intents Kit的"场景化上下文记忆"能力,开发者可以构建真正理解市场趋势、能主动预警和提供个性化理财建议的金融智能体。
本文核心亮点:
- 市场状态光效系统:6种市场状态(牛市上涨/熊市下跌/震荡整理/突破拉升/回调探底/风险预警)实时映射为环境光色与动画效果
- HMAF 2.0理财引擎:基于Intents Kit构建支持市场行情分析、资产配置、风险评估和智能调仓的AI理财系统
- 悬浮理财导航:底部悬浮页签实现理财模块快速切换(行情/资产/组合/调仓),支持PC端鼠标悬停预览
- 主动风险预警:基于实时市场数据分析,主动触发预警光效和语音提醒
- 跨设备理财协同:利用HarmonyOS分布式软总线,实现"手机查看+PC分析+大屏展示"的跨设备理财体验
二、核心特性解析与技术选型
2.1 沉浸光感在金融理财中的价值
HarmonyOS 6的systemMaterialEffect通过模拟物理光照模型,为UI组件带来细腻的光晕与反射效果。在金融理财场景中,这种材质效果能够:
- 市场状态可视化:当前市场状态直接映射为环境光色,用户无需查看数据即可感知市场趋势
- 氛围营造:玻璃拟态的半透明层让背景光效柔和过渡,营造"专业交易大厅"的沉浸感
- 异常即时预警:市场风险时红色脉冲光效,牛市上涨时翠绿流光,状态切换一目了然
2.2 悬浮导航的理财适配
与传统应用不同,理财应用需要处理:
- 高频模块切换:用户常在行情、资产、组合、调仓等模块间快速跳转
- 信息密度平衡:既要保证导航可见,又不能遮挡K线图和数据
- PC端操作优化:支持鼠标悬停查看趋势图、右键打开快捷操作
HarmonyOS 6的悬浮页签支持**强(85%)、平衡(70%)、弱(55%)**三档透明度自定义,结合PC端的自由窗口能力,可以实现"需要时出现,专注时隐退"的智能导航体验。
2.3 技术架构选型
| 技术模块 | 选用方案 | 说明 |
|---|---|---|
| 智能体框架 | HMAF 2.0 (HarmonyOS Multi-Agent Framework 2.0) | 系统级理财智能体能力 |
| 意图理解 | Intents Kit | 理财意图识别 |
| 行情数据 | 金融数据API | 实时市场行情 |
| 量化模型 | 自定义算法 | 资产配置与风险评估 |
| 分布式能力 | Distributed Service Kit | 跨设备理财协同 |
| 渲染引擎 | Canvas + ArkUI | K线图和数据可视化 |
| 状态管理 | AppStorage | 跨组件/跨窗口状态同步 |
| 光效系统 | SystemMaterialEffect + 自定义动画 | 市场状态光效实现 |
三、项目实战:"智财管家"架构设计
3.1 应用场景与功能规划
面向HarmonyOS PC/手机的全场景金融智能体应用,核心功能包括:
| 功能模块 | 技术实现 | 沉浸光感/HMAF应用 |
|---|---|---|
| 行情看板 | Canvas + 金融API |
市场状态光效背景 |
| 资产配置 | HMAF LLM Mode | 资产主题色光效 |
| 风险评估 | 量化模型 + HMAF | 风险等级光效反馈 |
| 智能调仓 | HMAF Workflow Mode | 调仓建议光效 |
| 悬浮理财导航 | HdsTabs + systemMaterialEffect |
玻璃拟态模块切换 |
| 组合分析 | List + Chart |
组合收益光效 |
| 风险预警 | HMAF + TTS Kit | 异常语音提醒+光效 |
| 跨设备协同 | Distributed Service Kit | 手机查看+PC分析+大屏展示 |
3.2 技术架构图

┌─────────────────────────────────────────────────────────────┐
│ 智财管家 - AI金融智能体理财系统 │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 沉浸光感层 │ │ 理财数据层 │ │ 悬浮导航层 │ │
│ │ (Ambient) │ │ (FinanceUI)│ │ (FloatNav) │ │
│ │ 市场状态光 │ │ K线/数据 │ │ 模块切换 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ HMAF 2.0 │ │ 量化模型 │ │ 分布式协同 │ │
│ │ 理财分析引擎 │ │ (资产配置) │ │ (Distributed)│ │
│ │ 风险预警 │ │ 风险评估 │ │ 跨设备同步 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 实时行情数据 (股票/基金/债券) + 用户资产数据 + 新闻舆情分析 │
└─────────────────────────────────────────────────────────────┘
四、环境配置与模块依赖
4.1 模块依赖配置
json
// entry/oh-package.json5
{
"dependencies": {
"@kit.UIDesignKit": "^1.0.0",
"@kit.ArkUI": "^1.0.0",
"@kit.AgentFrameworkKit": "^1.0.0",
"@kit.IntentsKit": "^1.0.0",
"@kit.DistributedServiceKit": "^1.0.0",
"@kit.TtsKit": "^1.0.0"
}
}
4.2 权限声明(module.json5)
json
{
"module": {
"name": "entry",
"type": "entry",
"description": "智财管家 - AI金融智能体理财系统",
"mainElement": "FinanceAbility",
"abilities": [
{
"name": "FinanceAbility",
"srcEntry": "./ets/financeability/FinanceAbility.ets",
"description": "理财智能体主窗口",
"icon": "$media:icon",
"label": "$string:FinanceAbility_label",
"startWindowIcon": "$media:icon",
"startWindowBackground": "$color:start_window_background",
"windowMode": "fullscreen",
"supportWindowMode": ["fullscreen", "split", "float"]
}
],
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
},
{
"name": "ohos.permission.DISTRIBUTED_DATASYNC"
}
]
}
}
五、核心组件实战
5.1 市场状态光效系统(MarketLightSystem.ets)
typescript
// entry/src/main/ets/systems/MarketLightSystem.ets
export enum MarketState {
BULL = 'bull',
BEAR = 'bear',
OSCILLATE = 'oscillate',
BREAKOUT = 'breakout',
PULLBACK = 'pullback',
RISK = 'risk'
}
export interface MarketLightConfig {
color: string;
intensity: number;
pulseSpeed: number;
blurRadius: number;
ambientColor: string;
animationType: 'pulse' | 'flow' | 'rotate' | 'flash' | 'fade';
}
@Component
export struct MarketLightSystem {
@State currentState: MarketState = MarketState.OSCILLATE;
@State lightIntensity: number = 0.5;
@State pulsePhase: number = 0;
// 市场状态-光效映射表
private stateLightMap: Map<MarketState, MarketLightConfig> = new Map([
[MarketState.BULL, {
color: '#00C853',
intensity: 0.7,
pulseSpeed: 2000,
blurRadius: 140,
ambientColor: 'rgba(0, 200, 83, 0.15)',
animationType: 'flow'
}],
[MarketState.BEAR, {
color: '#FF1744',
intensity: 0.8,
pulseSpeed: 1500,
blurRadius: 180,
ambientColor: 'rgba(255, 23, 68, 0.2)',
animationType: 'pulse'
}],
[MarketState.OSCILLATE, {
color: '#FFD700',
intensity: 0.5,
pulseSpeed: 3000,
blurRadius: 100,
ambientColor: 'rgba(255, 215, 0, 0.1)',
animationType: 'pulse'
}],
[MarketState.BREAKOUT, {
color: '#7B61FF',
intensity: 0.9,
pulseSpeed: 1000,
blurRadius: 200,
ambientColor: 'rgba(123, 97, 255, 0.25)',
animationType: 'flash'
}],
[MarketState.PULLBACK, {
color: '#4CC9F0',
intensity: 0.4,
pulseSpeed: 2500,
blurRadius: 90,
ambientColor: 'rgba(76, 201, 240, 0.1)',
animationType: 'fade'
}],
[MarketState.RISK, {
color: '#FF9F1C',
intensity: 0.9,
pulseSpeed: 800,
blurRadius: 220,
ambientColor: 'rgba(255, 159, 28, 0.3)',
animationType: 'flash'
}]
]);
aboutToAppear(): void {
// 监听市场状态变化
AppStorage.watch('market_state', (state: MarketState) => {
this.currentState = state;
this.triggerStateTransition(state);
});
}
private triggerStateTransition(state: MarketState): void {
const config = this.stateLightMap.get(state);
if (!config) return;
// 触发全局光效变化
AppStorage.setOrCreate('ambient_color', config.ambientColor);
AppStorage.setOrCreate('ambient_intensity', config.intensity);
// 触发状态光效变化
AppStorage.setOrCreate('market_glow_color', config.color);
AppStorage.setOrCreate('market_glow_intensity', config.intensity);
AppStorage.setOrCreate('market_pulse_speed', config.pulseSpeed);
}
build() {
Stack() {
// 底层环境光
this.buildAmbientLight()
// 中层市场光晕
this.buildMarketGlow()
// 顶层动画光效
this.buildAnimationEffect()
}
.width('100%')
.height('100%')
.pointerEvents(PointerEvents.None)
}
@Builder
buildAmbientLight(): void {
Column()
.width('100%')
.height('100%')
.backgroundColor(this.stateLightMap.get(this.currentState)?.ambientColor || 'transparent')
.animation({
duration: 1000,
curve: Curve.EaseInOut
})
}
@Builder
buildMarketGlow(): void {
Column()
.width('100%')
.height('100%')
.backgroundColor(this.stateLightMap.get(this.currentState)?.color || '#FFFFFF')
.blur(this.stateLightMap.get(this.currentState)?.blurRadius || 100)
.opacity(this.lightIntensity)
.animation({
duration: 800,
curve: Curve.EaseInOut
})
}
@Builder
buildAnimationEffect(): void {
Column()
.width('100%')
.height('100%')
.backgroundColor(this.stateLightMap.get(this.currentState)?.color || '#FFFFFF')
.opacity(this.lightIntensity * 0.3)
.animation({
duration: this.stateLightMap.get(this.currentState)?.pulseSpeed || 2000,
curve: Curve.EaseInOut,
iterations: -1,
playMode: PlayMode.Alternate
})
.scale({ x: 1.2, y: 1.2 })
.rotate({
angle: this.stateLightMap.get(this.currentState)?.animationType === 'rotate' ? 360 : 0,
centerX: '50%',
centerY: '50%'
})
.animation({
duration: this.stateLightMap.get(this.currentState)?.animationType === 'rotate' ? 3000 : 0,
curve: Curve.Linear,
iterations: -1
})
}
}
代码亮点:
- 6种市场状态光效:牛市上涨(翠绿流光)、熊市下跌(红色脉冲)、震荡整理(金色呼吸)、突破拉升(紫色闪烁)、回调探底(蓝色渐变)、风险预警(橙色急促)
- 三层光效架构:环境光层 → 市场光晕层 → 动画光效层,层次分明
- 平滑过渡动画:状态切换时800-1000ms的缓动动画,避免光效突变造成视觉割裂
- 无限循环动画:根据市场状态设置不同的脉冲速度和动画类型
5.2 HMAF 2.0理财分析引擎(FinanceAnalysisEngine.ets)
typescript
// entry/src/main/ets/engine/FinanceAnalysisEngine.ets
import { hmaf } from '@kit.AgentFrameworkKit';
import { intents } from '@kit.IntentsKit';
export interface AssetAllocation {
stocks: number;
bonds: number;
funds: number;
cash: number;
gold: number;
}
export interface RiskProfile {
riskLevel: number; // 1-5
riskTolerance: string;
investmentHorizon: string;
expectedReturn: number;
}
export interface MarketData {
symbol: string;
price: number;
change: number;
changePercent: number;
volume: number;
timestamp: number;
}
export interface PortfolioAnalysis {
totalValue: number;
dailyReturn: number;
totalReturn: number;
sharpeRatio: number;
maxDrawdown: number;
volatility: number;
}
export class FinanceAnalysisEngine {
private session: hmaf.AgentSession | null = null;
private intentEngine: intents.IntentEngine | null = null;
private marketData: Map<string, MarketData> = new Map();
private userPortfolios: Map<string, AssetAllocation> = new Map();
async initialize(): Promise<void> {
// 创建HMAF 2.0智能体会话
this.session = await hmaf.createAgentSession({
mode: hmaf.AgentMode.LLM,
enableDistributed: true,
maxConcurrentAgents: 10,
contextMemory: true
});
// 创建意图引擎
this.intentEngine = await intents.createIntentEngine({
supportedDomains: ['finance.allocation', 'finance.risk', 'finance.trade', 'finance.analysis'],
confidenceThreshold: 0.8,
enableMultiTurn: true
});
// 初始化示例数据
this.initializeMarketData();
this.initializePortfolios();
}
private initializeMarketData(): void {
this.marketData.set('AAPL', {
symbol: 'AAPL',
price: 185.50,
change: 2.30,
changePercent: 1.26,
volume: 52000000,
timestamp: Date.now()
});
this.marketData.set('GOOGL', {
symbol: 'GOOGL',
price: 142.30,
change: -1.20,
changePercent: -0.83,
volume: 28000000,
timestamp: Date.now()
});
this.marketData.set('TSLA', {
symbol: 'TSLA',
price: 245.80,
change: 5.60,
changePercent: 2.33,
volume: 95000000,
timestamp: Date.now()
});
}
private initializePortfolios(): void {
this.userPortfolios.set('user_001', {
stocks: 50,
bonds: 30,
funds: 15,
cash: 5,
gold: 0
});
}
// 分析市场状态
async analyzeMarketState(): Promise<MarketState> {
const changes = Array.from(this.marketData.values()).map(d => d.changePercent);
const avgChange = changes.reduce((a, b) => a + b, 0) / changes.length;
const maxChange = Math.max(...changes);
const minChange = Math.min(...changes);
// 判断市场状态
if (avgChange > 2) {
return MarketState.BULL;
} else if (avgChange < -2) {
return MarketState.BEAR;
} else if (maxChange > 3 || minChange < -3) {
return MarketState.BREAKOUT;
} else if (avgChange > 0 && maxChange < 2) {
return MarketState.PULLBACK;
} else if (avgChange < -1 && minChange > -3) {
return MarketState.RISK;
} else {
return MarketState.OSCILLATE;
}
}
// 生成资产配置建议
async generateAllocationAdvice(
userId: string,
riskProfile: RiskProfile
): Promise<AssetAllocation> {
const marketState = await this.analyzeMarketState();
// 基于风险偏好和市场状态生成配置建议
let baseAllocation: AssetAllocation = {
stocks: 0,
bonds: 0,
funds: 0,
cash: 0,
gold: 0
};
// 根据风险偏好确定基础配置
switch (riskProfile.riskLevel) {
case 1: // 保守型
baseAllocation = { stocks: 20, bonds: 50, funds: 20, cash: 10, gold: 0 };
break;
case 2: // 稳健型
baseAllocation = { stocks: 35, bonds: 35, funds: 20, cash: 8, gold: 2 };
break;
case 3: // 平衡型
baseAllocation = { stocks: 50, bonds: 25, funds: 15, cash: 8, gold: 2 };
break;
case 4: // 进取型
baseAllocation = { stocks: 65, bonds: 15, funds: 12, cash: 6, gold: 2 };
break;
case 5: // 激进型
baseAllocation = { stocks: 80, bonds: 5, funds: 10, cash: 3, gold: 2 };
break;
}
// 根据市场状态调整配置
const adjustedAllocation = this.adjustAllocationByMarket(baseAllocation, marketState);
// 使用HMAF优化配置
const prompt = `基于用户风险偏好${riskProfile.riskLevel}和市场状态${marketState},
优化资产配置:股票${adjustedAllocation.stocks}%、债券${adjustedAllocation.bonds}%、
基金${adjustedAllocation.funds}%、现金${adjustedAllocation.cash}%、黄金${adjustedAllocation.gold}%。
请给出优化建议。`;
const result = await this.session?.sendTask({
targetAgent: 'finance_advisor',
taskType: hmaf.TaskType.FINANCE_ADVICE,
payload: { prompt }
});
return result?.allocation || adjustedAllocation;
}
private adjustAllocationByMarket(
base: AssetAllocation,
state: MarketState
): AssetAllocation {
const adjusted = { ...base };
switch (state) {
case MarketState.BULL:
adjusted.stocks += 10;
adjusted.bonds -= 5;
adjusted.cash -= 5;
break;
case MarketState.BEAR:
adjusted.stocks -= 10;
adjusted.bonds += 5;
adjusted.cash += 5;
break;
case MarketState.BREAKOUT:
adjusted.stocks += 5;
adjusted.gold += 2;
adjusted.cash -= 7;
break;
case MarketState.PULLBACK:
adjusted.stocks -= 5;
adjusted.cash += 5;
break;
case MarketState.RISK:
adjusted.stocks -= 15;
adjusted.bonds += 10;
adjusted.cash += 5;
break;
case MarketState.OSCILLATE:
// 保持基础配置
break;
}
// 确保总和为100
const total = adjusted.stocks + adjusted.bonds + adjusted.funds + adjusted.cash + adjusted.gold;
if (total !== 100) {
adjusted.cash += 100 - total;
}
return adjusted;
}
// 风险评估
async assessRisk(portfolio: AssetAllocation): Promise<RiskProfile> {
const volatility = this.calculateVolatility(portfolio);
const maxDrawdown = this.calculateMaxDrawdown(portfolio);
const sharpeRatio = this.calculateSharpeRatio(portfolio);
let riskLevel = 3;
if (volatility < 0.1) riskLevel = 1;
else if (volatility < 0.15) riskLevel = 2;
else if (volatility < 0.2) riskLevel = 3;
else if (volatility < 0.3) riskLevel = 4;
else riskLevel = 5;
return {
riskLevel,
riskTolerance: this.getRiskLabel(riskLevel),
investmentHorizon: '中长期',
expectedReturn: sharpeRatio * volatility * 100
};
}
private calculateVolatility(portfolio: AssetAllocation): number {
// 简化计算:基于资产类别的历史波动率
const weights = [portfolio.stocks / 100, portfolio.bonds / 100, portfolio.funds / 100];
const volatilities = [0.2, 0.05, 0.15]; // 股票、债券、基金的历史波动率
let portfolioVol = 0;
weights.forEach((w, i) => {
portfolioVol += w * volatilities[i];
});
return portfolioVol;
}
private calculateMaxDrawdown(portfolio: AssetAllocation): number {
// 简化计算
return portfolio.stocks > 50 ? 0.25 : 0.15;
}
private calculateSharpeRatio(portfolio: AssetAllocation): number {
const expectedReturn = portfolio.stocks * 0.08 + portfolio.bonds * 0.03 + portfolio.funds * 0.06;
const riskFreeRate = 0.025;
const volatility = this.calculateVolatility(portfolio);
return (expectedReturn - riskFreeRate) / volatility;
}
private getRiskLabel(level: number): string {
const labels = ['极低', '低', '中等', '高', '极高'];
return labels[level - 1] || '未知';
}
// 智能调仓建议
async generateRebalanceAdvice(
userId: string,
currentAllocation: AssetAllocation
): Promise<string[]> {
const marketState = await this.analyzeMarketState();
const targetAllocation = await this.generateAllocationAdvice(userId, {
riskLevel: 3,
riskTolerance: '中等',
investmentHorizon: '中长期',
expectedReturn: 8
});
const advice: string[] = [];
if (currentAllocation.stocks < targetAllocation.stocks) {
advice.push(`建议增配股票${targetAllocation.stocks - currentAllocation.stocks}%,当前市场${marketState}适合增加权益 exposure`);
}
if (currentAllocation.bonds < targetAllocation.bonds) {
advice.push(`建议增配债券${targetAllocation.bonds - currentAllocation.bonds}%,增强组合防御性`);
}
if (currentAllocation.cash < targetAllocation.cash) {
advice.push(`建议增加现金储备${targetAllocation.cash - currentAllocation.cash}%,应对市场不确定性`);
}
return advice;
}
}
代码亮点:
- 多维度市场分析:基于涨跌幅、波动率等指标综合判断市场状态
- 动态资产配置:根据风险偏好和市场状态动态调整资产配置比例
- 风险量化评估:计算波动率、最大回撤、夏普比率等风险指标
- 智能调仓建议:基于当前配置和目标配置的偏差生成调仓建议
5.3 悬浮理财导航(FinanceFloatNav.ets)
typescript
// entry/src/main/ets/components/FinanceFloatNav.ets
import { HdsTabs, HdsTabItem } from '@kit.UIDesignKit';
export interface FinanceModule {
id: string;
name: string;
icon: Resource;
state: MarketState;
badge: number;
}
@Component
export struct FinanceFloatNav {
@State modules: FinanceModule[] = [];
@State selectedIndex: number = 0;
@State transparency: number = 0.70;
@State isExpanded: boolean = false;
@State avoidHeight: number = 0;
// 市场状态光色映射
private stateColors: Map<MarketState, string> = new Map([
[MarketState.BULL, '#00C853'],
[MarketState.BEAR, '#FF1744'],
[MarketState.OSCILLATE, '#FFD700'],
[MarketState.BREAKOUT, '#7B61FF'],
[MarketState.PULLBACK, '#4CC9F0'],
[MarketState.RISK, '#FF9F1C']
]);
aboutToAppear(): void {
// 初始化理财模块
this.modules = [
{
id: 'market',
name: '行情',
icon: $r('app.media.ic_market'),
state: MarketState.OSCILLATE,
badge: 0
},
{
id: 'assets',
name: '资产',
icon: $r('app.media.ic_assets'),
state: MarketState.OSCILLATE,
badge: 3
},
{
id: 'portfolio',
name: '组合',
icon: $r('app.media.ic_portfolio'),
state: MarketState.OSCILLATE,
badge: 0
},
{
id: 'rebalance',
name: '调仓',
icon: $r('app.media.ic_rebalance'),
state: MarketState.OSCILLATE,
badge: 1
}
];
// 获取底部安全区高度
let windowInstance = window.getLastWindow(getContext(this));
windowInstance.then((win) => {
let avoidArea = win.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR);
this.avoidHeight = avoidArea.bottomRect.height;
});
// 监听市场状态变化
AppStorage.watch('market_state', (state: MarketState) => {
this.modules.forEach(module => {
module.state = state;
});
});
}
build() {
Stack({ alignContent: Alignment.Bottom }) {
Column() {
// 模块信息展开面板(悬停时显示)
if (this.isExpanded && this.selectedIndex >= 0) {
this.buildModuleDetailPanel()
}
// 悬浮模块页签
HdsTabs({
items: this.modules.map((module, index) => ({
icon: module.icon,
label: module.name,
badge: module.badge > 0 ? module.badge : undefined,
customStyle: {
backgroundColor: this.selectedIndex === index
? this.stateColors.get(module.state)
: 'transparent',
borderColor: this.selectedIndex === index
? this.stateColors.get(module.state)
: 'rgba(255,255,255,0.2)'
}
})),
selectedIndex: this.selectedIndex,
onSelect: (index: number) => {
this.selectedIndex = index;
AppStorage.setOrCreate('selected_module', this.modules[index]);
},
onHover: (index: number) => {
this.isExpanded = true;
if (index >= 0) {
AppStorage.setOrCreate('hover_module', this.modules[index]);
}
},
backgroundStyle: {
blurStyle: BlurStyle.REGULAR,
backgroundColor: `rgba(20, 20, 30, ${this.transparency})`,
borderRadius: 24
},
indicatorStyle: {
color: this.stateColors.get(this.modules[this.selectedIndex]?.state) || '#FFD700',
height: 3,
width: 24,
borderRadius: 2
}
})
.height(64)
.width('96%')
.margin({ bottom: 12 })
}
.width('100%')
.padding({ bottom: this.avoidHeight + 12 })
}
.width('100%')
.height('100%')
.pointerEvents(PointerEvents.BoxNone)
}
@Builder
buildModuleDetailPanel(): void {
Column({ space: 8 }) {
// 模块图标与名称
Row({ space: 12 }) {
Stack() {
Image(this.modules[this.selectedIndex].icon)
.width(48)
.height(48)
.borderRadius(24)
.border({
width: 2,
color: this.stateColors.get(this.modules[this.selectedIndex].state) || '#FFFFFF'
})
.shadow({
radius: 10,
color: this.stateColors.get(this.modules[this.selectedIndex].state) || '#FFFFFF'
})
// 状态指示点
Circle()
.width(12)
.height(12)
.fill(this.stateColors.get(this.modules[this.selectedIndex].state) || '#FFFFFF')
.position({ x: 36, y: 36 })
.shadow({
radius: 6,
color: this.stateColors.get(this.modules[this.selectedIndex].state) || '#FFFFFF'
})
.animation({
duration: 1000,
curve: Curve.EaseInOut,
iterations: -1,
playMode: PlayMode.Alternate
})
.scale({ x: 1.3, y: 1.3 })
}
Column({ space: 4 }) {
Text(this.modules[this.selectedIndex].name)
.fontSize(16)
.fontWeight(FontWeight.Bold)
.fontColor('#FFFFFF')
Text(this.getStateLabel(this.modules[this.selectedIndex].state))
.fontSize(12)
.fontColor(this.stateColors.get(this.modules[this.selectedIndex].state) || '#FFFFFF')
}
.alignItems(HorizontalAlign.Start)
Blank()
// 刷新按钮
Button({ type: ButtonType.Circle }) {
Image($r('app.media.ic_refresh'))
.width(20)
.height(20)
.fillColor('#FFFFFF')
}
.width(36)
.height(36)
.backgroundColor('rgba(255,255,255,0.1)')
.onClick(() => {
AppStorage.setOrCreate('refresh_module', this.modules[this.selectedIndex].id);
})
}
.width('100%')
.padding(12)
}
.width('96%')
.backgroundColor('rgba(20, 20, 30, 0.9)')
.borderRadius(16)
.border({
width: 1,
color: this.stateColors.get(this.modules[this.selectedIndex].state) || 'rgba(255,255,255,0.1)'
})
.margin({ bottom: 8 })
.animation({
duration: 200,
curve: Curve.EaseInOut
})
}
private getStateLabel(state: MarketState): string {
const labels: Map<MarketState, string> = new Map([
[MarketState.BULL, '牛市上涨'],
[MarketState.BEAR, '熊市下跌'],
[MarketState.OSCILLATE, '震荡整理'],
[MarketState.BREAKOUT, '突破拉升'],
[MarketState.PULLBACK, '回调探底'],
[MarketState.RISK, '风险预警']
]);
return labels.get(state) || '未知';
}
}
代码亮点:
- 市场状态感知页签:所有模块页签颜色随市场状态动态变化,统一反映市场情绪
- 异常徽章提示:非零徽章提醒用户有待处理事项(如调仓建议)
- 悬停详情面板:PC端鼠标悬停时展开模块详细信息(市场状态/刷新按钮)
- 状态呼吸灯:模块头像右下角的状态指示点持续脉冲呼吸
5.4 K线图组件(KLineChart.ets)
typescript
// entry/src/main/ets/components/KLineChart.ets
import { MarketData } from '../engine/FinanceAnalysisEngine';
@Component
export struct KLineChart {
@Prop data: MarketData[];
@Prop symbol: string;
@State chartColor: string = '#FFD700';
build() {
Column() {
Text(`${this.symbol} - 实时行情`)
.fontSize(16)
.fontWeight(FontWeight.Bold)
.fontColor('#FFFFFF')
.margin({ bottom: 12 })
// K线图绘制
Canvas(this.chartContext)
.width('100%')
.height(300)
.onReady((context) => {
this.drawKLineChart(context);
})
// 统计信息
Row({ space: 16 }) {
Column() {
Text('最新价')
.fontSize(11)
.fontColor('rgba(255,255,255,0.5)')
Text(`${this.data[this.data.length - 1]?.price.toFixed(2)}`)
.fontSize(18)
.fontColor(this.getPriceColor())
.fontWeight(FontWeight.Bold)
}
Column() {
Text('涨跌幅')
.fontSize(11)
.fontColor('rgba(255,255,255,0.5)')
Text(`${this.data[this.data.length - 1]?.changePercent.toFixed(2)}%`)
.fontSize(18)
.fontColor(this.getPriceColor())
.fontWeight(FontWeight.Bold)
}
Column() {
Text('成交量')
.fontSize(11)
.fontColor('rgba(255,255,255,0.5)')
Text(`${this.formatVolume(this.data[this.data.length - 1]?.volume || 0)}`)
.fontSize(18)
.fontColor('#FFFFFF')
.fontWeight(FontWeight.Bold)
}
}
.width('100%')
.justifyContent(FlexAlign.SpaceAround)
.margin({ top: 12 })
}
.width('100%')
.padding(16)
.backgroundColor('rgba(255,255,255,0.03)')
.borderRadius(16)
}
private drawKLineChart(context: CanvasRenderingContext2D): void {
const width = 600;
const height = 300;
const padding = 40;
const candleWidth = 20;
if (this.data.length === 0) return;
const prices = this.data.map(d => d.price);
const maxPrice = Math.max(...prices) * 1.05;
const minPrice = Math.min(...prices) * 0.95;
// 绘制网格
context.strokeStyle = 'rgba(255,255,255,0.1)';
context.lineWidth = 1;
for (let i = 0; i <= 5; i++) {
const y = padding + (height - 2 * padding) * i / 5;
context.beginPath();
context.moveTo(padding, y);
context.lineTo(width - padding, y);
context.stroke();
}
// 绘制K线
this.data.forEach((candle, index) => {
const x = padding + (width - 2 * padding) * index / (this.data.length - 1);
const y = padding + (height - 2 * padding) * (1 - (candle.price - minPrice) / (maxPrice - minPrice));
const color = candle.change >= 0 ? '#00C853' : '#FF1744';
// 绘制实体
context.fillStyle = color;
context.fillRect(x - candleWidth / 2, y - 2, candleWidth, 4);
// 绘制影线
context.strokeStyle = color;
context.lineWidth = 1;
context.beginPath();
context.moveTo(x, y - 10);
context.lineTo(x, y + 10);
context.stroke();
});
}
private getPriceColor(): string {
const lastData = this.data[this.data.length - 1];
if (!lastData) return '#FFFFFF';
return lastData.change >= 0 ? '#00C853' : '#FF1744';
}
private formatVolume(volume: number): string {
if (volume >= 1000000) return `${(volume / 1000000).toFixed(1)}M`;
if (volume >= 1000) return `${(volume / 1000).toFixed(1)}K`;
return volume.toString();
}
}
5.5 跨设备理财协同(DistributedFinanceSync.ets)
typescript
// entry/src/main/ets/distributed/DistributedFinanceSync.ets
import { distributedService } from '@kit.DistributedServiceKit';
export class DistributedFinanceSync {
private manager: distributedService.Manager | null = null;
private remoteDevices: distributedService.DeviceInfo[] = [];
private activeDevice: string = 'local';
async initialize(): Promise<void> {
this.manager = distributedService.createManager();
// 初始化分布式服务
await this.manager.init({
deviceType: ['phone', 'tablet', 'pc', 'smart_screen'],
serviceName: 'zhicai_finance_sync',
abilityName: 'FinanceDistributedAbility'
});
// 监听设备变化
this.manager.on('deviceStateChange', (deviceInfo, state) => {
if (state === 'online') {
this.remoteDevices.push(deviceInfo);
this.selectOptimalDevice();
} else if (state === 'offline') {
this.remoteDevices = this.remoteDevices.filter(d => d.deviceId !== deviceInfo.deviceId);
if (this.activeDevice === deviceInfo.deviceId) {
this.activeDevice = 'local';
}
}
});
}
// 选择最优设备执行理财任务
private selectOptimalDevice(): void {
// 优先选择PC端执行分析任务(大屏+键盘输入)
const pcDevice = this.remoteDevices.find(d => d.deviceType === 'pc');
if (pcDevice) {
this.activeDevice = pcDevice.deviceId;
console.info(`Selected PC device: ${pcDevice.deviceName}`);
return;
}
// 其次选择智慧屏
const screenDevice = this.remoteDevices.find(d => d.deviceType === 'smart_screen');
if (screenDevice) {
this.activeDevice = screenDevice.deviceId;
console.info(`Selected screen device: ${screenDevice.deviceName}`);
return;
}
// 默认本地
this.activeDevice = 'local';
}
// 同步行情数据到远程设备
async syncMarketData(data: MarketData[], deviceId?: string): Promise<void> {
const targetDevice = deviceId || this.activeDevice;
if (targetDevice === 'local') return;
await this.manager?.sendMessage({
targetDeviceId: targetDevice,
message: {
type: 'market_data_sync',
data,
timestamp: Date.now()
}
});
}
// 同步资产数据到远程设备
async syncAssetData(assets: AssetAllocation, deviceId?: string): Promise<void> {
const targetDevice = deviceId || this.activeDevice;
if (targetDevice === 'local') return;
await this.manager?.sendMessage({
targetDeviceId: targetDevice,
message: {
type: 'asset_data_sync',
assets,
timestamp: Date.now()
}
});
}
// 远程执行分析任务
async executeRemoteAnalysis(
analysisType: string,
params: Record<string, any>,
deviceId?: string
): Promise<any> {
const targetDevice = deviceId || this.activeDevice;
if (targetDevice === 'local') {
// 本地执行
return await this.executeLocalAnalysis(analysisType, params);
}
// 远程执行
const result = await this.manager?.sendMessage({
targetDeviceId: targetDevice,
message: {
type: 'remote_analysis',
analysisType,
params,
timestamp: Date.now()
},
expectResponse: true,
timeout: 30000
});
return result?.payload;
}
private async executeLocalAnalysis(analysisType: string, params: Record<string, any>): Promise<any> {
// 本地分析逻辑
switch (analysisType) {
case 'portfolio_analysis':
return { totalValue: 100000, dailyReturn: 2.5 };
case 'risk_assessment':
return { riskLevel: 3, maxDrawdown: 0.15 };
default:
return { success: false, error: 'Unknown analysis type' };
}
}
// 获取远程设备上的理财界面
async getRemoteFinanceUI(deviceId: string): Promise<void> {
await this.manager?.sendMessage({
targetDeviceId: deviceId,
message: {
type: 'show_finance_ui',
timestamp: Date.now()
}
});
}
}
代码亮点:
- 智能设备选择:根据任务类型自动选择最优设备(PC优先分析、智慧屏优先展示)
- 行情数据实时同步:跨设备行情数据同步,保持数据一致性
- 远程分析执行:支持将复杂分析任务分发到远程设备执行
- 资产数据同步:跨设备资产数据同步,切换设备不丢失
六、市场波动与光效映射

6.1 市场状态机设计
typescript
// entry/src/main/ets/states/MarketStateMachine.ets
export class MarketStateMachine {
private currentState: MarketState = MarketState.OSCILLATE;
private transitions: Map<MarketState, MarketState[]> = new Map([
[MarketState.OSCILLATE, [MarketState.BULL, MarketState.BEAR, MarketState.BREAKOUT]],
[MarketState.BULL, [MarketState.BEAR, MarketState.PULLBACK, MarketState.RISK]],
[MarketState.BEAR, [MarketState.BULL, MarketState.BREAKOUT, MarketState.RISK]],
[MarketState.BREAKOUT, [MarketState.BULL, MarketState.PULLBACK]],
[MarketState.PULLBACK, [MarketState.BULL, MarketState.BEAR, MarketState.OSCILLATE]],
[MarketState.RISK, [MarketState.BEAR, MarketState.OSCILLATE]]
]);
async transition(newState: MarketState): Promise<boolean> {
const validTransitions = this.transitions.get(this.currentState) || [];
if (!validTransitions.includes(newState)) {
console.warn(`Invalid transition: ${this.currentState} -> ${newState}`);
return false;
}
// 执行状态退出逻辑
await this.onExitState(this.currentState);
// 更新状态
this.currentState = newState;
// 执行状态进入逻辑
await this.onEnterState(newState);
// 触发光效变化
AppStorage.setOrCreate('market_state', newState);
return true;
}
private async onEnterState(state: MarketState): Promise<void> {
switch (state) {
case MarketState.BULL:
// 播放牛市提示音
await this.playSound('bull');
break;
case MarketState.BEAR:
// 播放熊市提示音
await this.playSound('bear');
break;
case MarketState.RISK:
// 播放风险警报
await this.playSound('risk');
// 触发风险预警通知
await this.notifyRisk();
break;
case MarketState.BREAKOUT:
// 播放突破提示音
await this.playSound('breakout');
break;
case MarketState.PULLBACK:
// 播放回调提示音
await this.playSound('pullback');
break;
case MarketState.OSCILLATE:
// 播放震荡提示音
await this.playSound('oscillate');
break;
}
}
private async onExitState(state: MarketState): Promise<void> {
console.info(`Exiting market state: ${state}`);
}
private async playSound(soundType: string): Promise<void> {
console.info(`Playing market sound: ${soundType}`);
}
private async notifyRisk(): Promise<void> {
// 通知用户风险预警
console.info('Notifying user about market risk');
}
}
七、关键技术总结
7.1 HMAF 2.0金融智能体开发清单
| 技术点 | API/方法 | 应用场景 |
|---|---|---|
| 智能体会话创建 | hmaf.createAgentSession({ mode: LLM, contextMemory: true }) |
理财分析与建议 |
| 意图注册 | intentEngine.registerIntents([...]) |
理财意图识别 |
| 市场分析 | analyzeMarketState() |
实时市场状态判断 |
| 资产配置 | generateAllocationAdvice() |
个性化资产配置 |
| 风险评估 | assessRisk() |
组合风险评估 |
| 分布式同步 | distributedService.createManager() |
跨设备数据协同 |
| 语音预警 | tts.createEngine({ voice: 'xiaoyi' }) |
市场风险语音提醒 |
7.2 沉浸光感实现清单
| 技术点 | API/方法 | 应用场景 |
|---|---|---|
| 市场光效映射 | stateLightMap |
6种市场状态对应6套光效 |
| 三层光效架构 | Ambient + Glow + Animation |
环境光+光晕+动画 |
| 5种动画类型 | pulse/flow/rotate/flash/fade |
不同市场状态 |
| 平滑过渡 | animation({ duration: 800 }) |
状态切换动画 |
7.3 悬浮导航适配要点
- 模块快速切换:底部悬浮页签支持行情/资产/组合/调仓四大模块快速切换
- 市场状态统一反馈:所有模块页签颜色随市场状态动态变化,统一反映市场情绪
- 悬停详情预览:PC端鼠标悬停展开模块详细信息(市场状态/刷新按钮)
- 异常徽章提示:非零徽章提醒用户有待处理事项(如调仓建议)
八、调试与性能优化
8.1 真机调试建议
- 行情数据测试:验证实时行情数据的准确性和延迟
- 市场状态判断:验证不同市场条件下的状态判断准确性
- 分布式测试:验证跨设备数据同步和分析任务分发
8.2 性能优化策略
- 行情数据缓存:缓存最近行情数据,减少API调用次数
- 分析任务异步化:复杂分析任务异步执行,不阻塞UI
- 分布式负载均衡:根据设备性能动态调整任务分配策略
- K线图优化:限制K线数据点数量,防止内存溢出
九、总结与展望
本文基于HarmonyOS 6(API 23)的悬浮导航 与沉浸光感特性,完整实战了一款名为"智财管家"的AI金融智能体理财系统。核心创新点总结:
-
市场状态光效系统:6种市场状态(牛市上涨/熊市下跌/震荡整理/突破拉升/回调探底/风险预警)实时映射为环境光色与动画效果,让用户"看见"市场趋势
-
HMAF 2.0理财引擎:基于Intents Kit构建支持市场行情分析、资产配置、风险评估和智能调仓的AI理财系统,支持动态资产配置和智能调仓建议
-
主动风险预警:基于实时市场数据分析,主动触发预警光效和语音提醒,无需用户主动查看
-
悬浮理财导航:底部悬浮页签支持行情/资产/组合/调仓四大模块快速切换,支持PC端鼠标悬停预览
-
跨设备理财协同:利用HarmonyOS分布式软总线,实现"手机查看+PC分析+大屏展示"的跨设备理财体验
未来扩展方向:
- 接入量化交易策略:基于机器学习模型的自动化交易策略
- 探索社交理财:基于好友的投资行为进行社交化理财推荐
- 结合区块链:支持数字资产管理和DeFi投资
- AI理财顾问:集成大语言模型的智能理财咨询,提供个性化投资建议
转载自:https://blog.csdn.net/u014727709/article/details/162390871
欢迎 👍点赞✍评论⭐收藏,欢迎指正