万物知识卡片 - 探索世间万物的奥秘
·
万物知识卡片 - 探索世间万物的奥秘

一、引言:知识的力量
知识是人类进步的阶梯,是认识世界的钥匙。然而,传统的知识获取方式往往枯燥乏味,难以激发学习兴趣。如何让知识变得生动有趣、易于理解?这是我们一直在思考的问题。
基于这一思考,我们开发了"万物知识卡片"——一款以精美卡片形式呈现知识的AI应用。用户只需输入一个物体名称,就能获得包含名称、简介、趣味知识和惊人事实的完整知识卡片。本文将深入探讨该应用的设计理念、交互逻辑和鸿蒙技术实现。
二、知识卡片的设计理念
2.1 知识的四个维度
万物知识卡片采用四个维度来呈现知识,确保信息的全面性和趣味性:
名称:物体的正式名称,建立基础认知
一句话简介:用最精炼的语言说明"这是什么",帮助用户快速理解
趣味知识:三个让人印象深刻的有趣事实,激发学习兴趣
“原来如此”:一个大多数人不知道的惊人事实,带来认知冲击
2.2 生动有趣的表达方式
知识卡片采用讲故事的方式呈现内容,而非传统的百科全书式罗列:
- 使用生动的语言和表情符号
- 加入有趣的比喻和类比
- 突出重点内容,增强记忆点
三、应用架构设计
3.1 Model层:定义消息结构
export class KCChatMessage {
role: KCMessageRole
content: string
timestamp: number
constructor(role: KCMessageRole, content: string) {
this.role = role
this.content = content
this.timestamp = Date.now()
}
}
设计亮点:
- 简洁的消息结构,包含角色、内容和时间戳
- 支持用户消息和助手消息两种角色
3.2 Service层:实现知识卡片生成
export class KnowledgeCardService {
private mockResponses: Record<string, string> = {
'太阳': `## ☀️ 知识卡片
### 名称
**太阳**(Sun)
### 一句话简介
太阳是太阳系的中心恒星,一颗巨大的等离子体火球...
### 趣味知识
1. **太阳占太阳系总质量的99.86%** — 所有行星、卫星、小行星加起来才占0.14%
2. **你看到的阳光其实是8分钟前的** — 太阳光到达地球需要约8分20秒
3. **太阳每秒燃烧掉约400万吨物质** — 但别担心,按照这个速度,它还能持续燃烧约50亿年
### 原来如此 💡
大多数人不知道的是:**太阳表面其实有"音波"在传播**!`,
'月亮': `## 🌙 知识卡片...`,
'蝴蝶': `## 🦋 知识卡片...`,
'默认': '## 📇 知识卡片\n\n### 名称\n**__ITEM__**\n\n...'
}
generateCard(userMessage: string): KCChatMessage {
const lowerMsg = userMessage.toLowerCase()
const keys = Object.keys(this.mockResponses)
for (let i = 0; i < keys.length; i++) {
const key = keys[i]
if (key !== '默认' && lowerMsg.includes(key.toLowerCase())) {
return new KCChatMessage(KCMessageRole.ASSISTANT, this.mockResponses[key])
}
}
let response = this.mockResponses['默认']
response = response.replace('__ITEM__', userMessage)
return new KCChatMessage(KCMessageRole.ASSISTANT, response)
}
}
设计亮点:
- 使用映射表存储预设知识卡片,支持快速匹配
- 通过关键词匹配实现智能内容检索
- 默认模板支持任意物体名称,扩展性强
3.3 Page层:构建知识卡片展示界面
@Entry
@Component
struct KnowledgeCardPage {
@State messages: KCChatMessage[] = []
@State inputText: string = ''
@State isLoading: boolean = false
private service: KnowledgeCardService = new KnowledgeCardService()
private scroller: Scroller = new Scroller()
aboutToAppear(): void {
this.messages.push(new KCChatMessage(KCMessageRole.ASSISTANT, KC_WELCOME_MESSAGE))
}
}
设计亮点:
- 初始化时显示欢迎消息,引导用户输入
Scroller组件实现知识卡片的滚动浏览
四、鸿蒙技术实现亮点
4.1 消息列表渲染
Scroll(this.scroller) {
Column() {
ForEach(this.messages, (msg: KCChatMessage) => {
this.buildMessageBubble(msg)
}, (msg: KCChatMessage, index: number) => `${index}_${msg.timestamp}`)
if (this.isLoading) {
this.buildLoadingBubble()
}
}
.padding({ left: 14, right: 14, top: 8, bottom: 8 })
.width('100%')
}
.layoutWeight(1)
.scrollBar(BarState.Off)
.edgeEffect(EdgeEffect.Spring)
技术解析:
ForEach组件动态渲染消息列表,支持高效的数据绑定- 唯一标识符使用
index_timestamp格式,确保列表更新时的稳定性 scrollBar(BarState.Off)隐藏滚动条,提升视觉美观度
4.2 输入区域设计
@Builder
buildInputArea() {
Row() {
TextArea({ text: this.inputText, placeholder: '输入你想了解的事物...' })
.height(40)
.fontSize(14)
.backgroundColor(COLOR_INPUT_BG)
.borderRadius(20)
.border({ width: 1, color: COLOR_BORDER })
.padding({ left: 16, right: 16, top: 10, bottom: 10 })
.layoutWeight(1)
.maxLength(500)
.onChange((value: string) => { this.inputText = value })
Button('发送')
.fontSize(14)
.fontWeight(FontWeight.Medium)
.fontColor(this.inputText.trim() === '' ? COLOR_TEXT_SECONDARY : Color.White)
.backgroundColor(this.inputText.trim() === '' ? COLOR_BORDER : COLOR_PRIMARY)
.borderRadius(20)
.height(40)
.padding({ left: 18, right: 18 })
.margin({ left: 10 })
.enabled(!this.isLoading && this.inputText.trim() !== '')
.onClick(() => { this.onSend() })
}
.width('100%')
.padding({ left: 14, right: 14, top: 10, bottom: 10 })
}
技术解析:
TextArea组件支持多行输入,适合长文本输入场景layoutWeight(1)实现输入框自适应宽度enabled属性根据输入状态和加载状态控制按钮可用性- 按钮颜色根据输入状态动态变化,提供视觉反馈
4.3 消息发送逻辑
private onSend(): void {
const text = this.inputText.trim()
if (text === '') { return }
this.messages.push(new KCChatMessage(KCMessageRole.USER, text))
this.inputText = ''
this.isLoading = true
setTimeout(() => { this.scroller.scrollEdge(Edge.Bottom) }, 200)
setTimeout(() => {
const reply = this.service.generateCard(text)
this.messages.push(reply)
this.isLoading = false
setTimeout(() => { this.scroller.scrollEdge(Edge.Bottom) }, 100)
}, 1500)
}
技术解析:
- 发送消息后立即添加到消息列表,提供即时反馈
- 设置
isLoading状态显示加载动画 - 消息发送和回复到达时自动滚动到底部
- 使用
setTimeout模拟AI思考过程,增强交互感
五、用户体验设计
5.1 配色方案:清新自然的绿色主题
const COLOR_BG = '#F0FDF4' // 浅绿色背景
const COLOR_CARD = '#FFFFFF' // 白色卡片
const COLOR_PRIMARY = '#16A34A' // 主色调绿色
const COLOR_BORDER = '#BBF7D0' // 边框色
设计理念:
- 绿色代表自然、生机和成长,与知识探索主题契合
- 清新的色调营造轻松愉悦的学习氛围
- 高对比度确保文本可读性
5.2 知识卡片的视觉设计
- 结构化布局:标题、简介、趣味知识、惊人事实清晰区分
- 视觉层次:使用不同的字体大小和颜色突出重点
- 表情符号:适当加入表情符号增强视觉吸引力
- 分隔线:使用空白和分隔线区分不同内容区块
5.3 交互设计:简单直观的操作体验
- 一键生成:输入物体名称,点击发送即可生成知识卡片
- 历史记录:保留对话历史,方便回顾和比较
- 清除功能:支持清除对话,重新开始探索
六、鸿蒙原生开发的优势
6.1 性能优化
- 虚拟列表:
ForEach组件支持虚拟滚动,性能优异 - 内存管理:组件化设计减少内存占用
- 渲染优化:原生渲染引擎,界面流畅
6.2 开发效率
- 声明式语法:直观的UI描述,降低学习曲线
- 组件复用:
@Builder实现界面逻辑复用 - 热更新:支持开发过程中的实时预览
6.3 用户体验
- 系统级交互:遵循鸿蒙设计规范,提供一致的交互体验
- 手势支持:原生支持各种手势操作
- 动画效果:流畅的过渡动画,提升体验质感
七、应用扩展方向
7.1 内容扩展
- 增加更多预设知识卡片,覆盖更多领域
- 支持用户自定义知识卡片
- 集成语音朗读功能
7.2 交互扩展
- 添加知识卡片收藏功能
- 支持知识卡片分享
- 实现知识关联推荐
7.3 技术扩展
- 接入AI知识图谱,实现智能知识关联
- 支持多语言知识卡片
- 实现离线知识查询
八、总结与展望
万物知识卡片是一款基于鸿蒙原生开发的创新知识探索应用,通过精美的卡片形式呈现世间万物的奥秘。应用充分利用了鸿蒙的声明式UI、响应式状态管理和组件化设计等核心特性,实现了高效、流畅、可扩展的用户体验。
未来,我们将继续优化应用功能,扩展知识内容,让更多用户能够轻松探索知识的海洋。
系列博文回顾:
- 第1篇:AI智能助手生态与鸿蒙原生开发实践
- 第2篇:费曼学习法导师 - 教是最好的学
- 第3篇:万物知识卡片 - 探索世间万物的奥秘(本篇)
系列博文预告:
- 第4篇:互动故事树 - 你的选择决定故事走向
- 第5篇:多语言导师 - 在真实语境中学习单词
敬请期待!
更多推荐


所有评论(0)