

摘要:随着中国⽂化影响⼒的提升,越来越多的外籍⼈⼠开始学习中⽂,但在书写练习上常常⾯临“提笔忘字”和缺乏反馈的痛点。本⽂将分享我们基于仓颉编程语⾔开发的鸿蒙原⽣应⽤——《仓颉迹》。该应⽤旨在利⽤鸿蒙原⽣ AI 能⼒,打造⼀款懂办公、有反馈、能实战的智能化汉字学习助⼿。我们将深⼊解析其技术架构、关键技术实现以及开发过程中的感悟。
01
1. 项⽬核⼼ (Why & What)
1.1 开发初衷 (Why)
仓颉编程语⾔(Cangjie)是鸿蒙⽣态的⾃研编程语⾔,其名取⾃上古传说中“观察⻦兽蹄迒之迹”⽽创造汉字的仓颉。本项⽬《仓颉迹》正是寓意“⽤仓颉语⾔追寻仓颉造字之迹”——我们希望⽤这款以“造字圣⼈”命名的现代化语⾔,构建⼀款重现汉字之美的应⽤。这不仅是技术的实践,更是⼀场跨越古今的对话:⽤代码书写未来,⽤技术传承⽂明。
在数字化时代,中⽂学习者⾯临着独特的挑战:
1. 提笔忘字:汉字结构复杂,很多⼈会认但不会写。
2. 交互缺失:传统的字帖是静态的,缺乏实时的纠错和反馈。
3. 场景断层:现有的 App ⼤多针对幼⼉识字,缺乏针对成⼈办公和商务场景的训练。
我们的⽬标是利⽤ HarmonyOS 的原⽣能⼒,解决这些痛点,开发⼀款既适合学习⼜实⽤的汉字助⼿。
1.2 核⼼功能 (What)
《仓颉迹》定义为⼀款“基于仓颉语⾔的沉浸式汉字学习与办公助⼿”。它构建了⼀个“看-写-听-说”的四位⼀体体验
闭环:
看 (Eye):通过动态笔顺演示,直观展示汉字的笔画顺序。
写 (Hand):提供⽶字格智能描红功能,配合细腻的振动反馈,模拟真实的纸笔书写体验。
听 (Ear):集成 AI 商务播报 (TTS),让⽤户在商务场景下也能进⾏听⼒训练。
说 (Mouth):内置 AI ⼝语评测 (ASR),实时评估⽤户的发⾳准确度。

图 1:应⽤⾸⻚展示,融合了“新中式未来主义”设计⻛格
02
2. 关键技术实现 (How)
本项⽬采⽤ MVVM 架构,将 UI ( ArkUI ) 与业务逻辑分离,确保代码的清晰和可维护性。

图 2:《仓颉迹》技术架构图
以下是⼏个核⼼技术点的深度解析:
2.1 Web 与仓颉的⾼性能互操作
为了实现⾼质量的汉字笔顺动画,我们没有重复造轮⼦,⽽是复⽤了成熟的 Web 笔顺库 HanziWriter 。通过ArkWeb 组件托管 Web 内容,并利⽤ registerJavaScriptProxy 实现仓颉与 JavaScript 的双向通信。
核⼼代码实现如下:
// entry/src/main/cangjie/components/HanziWriterCanvas.cjfunc registerBridge() {let onCorrectStrokeFunc = { data: String =>this.onCorrectStroke(data) // 回调仓颉业务逻辑return "ok"}// 将仓颉侧的闭包注册到 Web 端,供 JS 调⽤webController.registerJavaScriptProxy([onCorrectStrokeFunc, ...], "nativeBridge", ["onCorrectStroke", ...])}
这种⽅式既利⽤了 Web ⽣态的丰富资源,⼜保持了原⽣应⽤的性能和体验。
2.2 鸿蒙原⽣端侧 AI (Privacy & Offline)
我们坚持端侧优先 (On-Device First) 的策略。应⽤不依赖云端 API,⽽是直接调⽤鸿蒙系统原⽣的
ai.textToSpeech 和 ai.speechRecognizer 能⼒。这不仅⽀持离线使⽤,且响应速度极快。
// entry/src/main/cangjie/services/TextToSpeechService.cjpublic func createEngine(...) {// 调⽤ HMS 原⽣ AI 模块let module = jsContext.requireSystemNativeModule("ai.textToSpeech", prefix: "hms")// ... 后续调⽤原⽣ AI 能⼒进⾏语⾳合成}
2.3 多级缓存策略 (Performance)
为了确保汉字数据的秒开体验,我们设计了多级缓存策略:内存 -> 磁盘 -> RawFile -> ⽹络。

图 4:汉字练习与描红界⾯
// entry/src/main/cangjie/services/HanziDataService.cjpublic func loadData(charName: String): String {if (cache.contains(charName)) { return ... } // 1. 优先从内存获取if (isDiskCached(charName)) { return ... } // 2. 其次检查磁盘缓存return loadFromRawFile(charName) // 3. 最后读取预置资源(为减少包体⼤⼩,后续可去除)}
2.4 并发预加载 (Concurrent Pre-loading)
除了多级缓存,我们还充分利⽤了仓颉语⾔轻量级线程 spawn 的优势,实现了⾼效的后台并发预下载。这突显了仓颉在处理并发任务时的简洁与⾼效(轻量级线程,极低开销):
public func downloadList(chars: Array): Unit {spawn {let uniqueChars = HashSet()uniqueChars.add(all: chars)for (charName in uniqueChars) {// 跳过已缓存的if (isDiskCached(charName)) {continue}// 并发下载fetchHanziFromCND(charName, { result: ?String =>if (letSome(data) <- result) {saveToDiskCache(charName, data)Hilog.info(0x0000, "CangjieApp","[HanziDataService] Background downloaded: ${charName}")}})}}}
03
3. 项⽬亮点
1. 跨越⽣态鸿沟:
⾯对仓颉语⾔⽣态尚在建设的现状,我们通过巧妙的互操作设计,实现了“拿来主义”,将
Web ⽣态的优势引⼊到鸿蒙原⽣应⽤中。
2. 极致的端侧体验:
利⽤端侧 AI 能⼒,实现了⽆⽹环境下的全功能闭环,确⽴了隐私安全和⾼性能的优势。
3. 数字⽔墨美学:
不仅仅是功能的堆砌,更在 UI 上追求“东⽅美学”。通过震动反馈与细腻的交互设计,让在玻璃屏幕上写字也能感受到“阻尼感”,还原书写的仪式感。
04
4. 开发感悟与经验
在整个备赛和开发过程中,我们有了深刻的体会:
1. 仓颉语⾔初体验:简洁与安全并重
相⽐于其他语⾔,仓颉的强类型系统在编译期就能拦截⼤量潜在错误(如空指针)。 Option<T> 类型的使⽤显著提升了代码的健壮性。建议开发者充分利⽤仓颉的 match 模式匹配,让代码逻辑更加清晰易读。
2. 拥抱互操作性 (Interoperability)
在⽣态初期,互操作性是破局的关键。不要害怕混合开发,合理利⽤ ark_interop 和 ArkWeb ,可以让仓颉快速具备成熟的业务能⼒。Web 负责复杂的渲染,仓颉负责⾼性能的逻辑,两者取⻓补短。
3. 以赛促学,⾼效掌握仓颉
通过参加⽐赛更有针对性地学习仓颉,是很好的学习途径。在实战中解决具体问题,能够⽐单纯阅读⽂档更快地掌握新语⾔的特性与⽣态能⼒。
05
5. 效果演示
应⽤整体演示
希望这篇技术解析能为正在探索仓颉语⾔和鸿蒙开发的伙伴们提供⼀些参考与灵感!
06
6. 致谢与资源
(Acknowledgments & Resources)
本项⽬《仓颉迹》的诞⽣离不开华为 HarmonyOS 团队、仓颉语⾔团队及开源社区的⼤⼒⽀持。特别感谢OpenAtom 开放原⼦开源基⾦会提供的交流平台。
项⽬开源地址:
https://openatom.tech/cangjiechallenge/bb40b887dcf53d1a8b72884ad862fdf9
仓颉造字,惊天地、泣⻤神;
仓颉编程,书未来、传⽂明。
愿每⼀⾏代码,都能书写出独⼀⽆⼆的精彩。
新年福利预告
仓颉社区专属红包封面即将上线
小年已至,新春不远。感谢每一位家人一直以来对仓颉编程语言的支持与陪伴。
我们正在为大家准备专属微信红包封面,颜值在线、限量发放,免费领取。正式发放将在近期开启,记得锁定本号,不错过第一波福利~
新的一年,愿我们继续以代码为伴,与热爱同行,一起让仓颉生态,越写越精彩!
往期文章:
鸿蒙仓颉编程语言挑战赛一等奖作品:MeetAI-基于Cangjie的智能会后整理助手
鸿蒙仓颉编程语言挑战赛二等奖作品 :以仓颉之码,筑智慧学园——基于仓颉与OpenHarmony的智慧校园协同管控系统实践
鸿蒙仓颉编程语言挑战赛二等奖作品:TaskGenie 打造基于仓颉语言的智能办公“任务中枢”
