更新记录

2.0.0(2026-08-14)

新增

  • lime-hanzi-writer 组件,适配 uni-app / uni-app x(uvue + vue 双端)
  • 笔顺书写动画:播放、逐笔动画、循环播放、暂停 / 继续
  • 田字格背景(showGrid / gridColor
  • 逐笔高亮(highlightStroke
  • 笔顺测验(quiz):支持测验提示、跳过笔画、错误回调等
  • 自定义颜色(笔画 / 部首 / 高亮 / 轮廓 / 田字格)与尺寸(size / width / height
  • 本地汉字数据(charDataMap / setLocalCharData)与动态切换(setCharacter
  • 插件根 index.ts 统一导出公开静态 API(setLocalCharData / setCharDataVersion 等)

使用网络加载汉字数据时,组件会请求 https://cdn.jsdelivr.net/npm/hanzi-writer-data@{version}/{character}.json小程序平台需在小程序后台配置该域名白名单;如需无网络请求,请使用本地数据。


平台兼容性

uni-app(4.44)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- 5.0
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - -

uni-app x(5.23)

Chrome Safari Android iOS 鸿蒙 微信小程序
5.0

name: lime-hanzi-writer 汉字笔顺动画组件 description: 汉字笔顺动画与测验组件,支持笔画书写动画、田字格、笔顺测验,可用于汉字教学、笔顺练习等场景 tags:

  • hanzi-writer
  • 汉字
  • 笔顺
  • 动画
  • 书写
  • canvas componentTag: l-hanzi-writer plugin: lime-hanzi-writer category: 业务组件 dependencies:
  • lime-shared

lime-hanzi-writer 汉字笔顺动画组件

汉字笔顺动画与测验组件,支持笔画书写动画、田字格背景、笔顺测验等功能,可用于汉字教学、笔顺练习等场景。

插件依赖:lime-shared

安装方法

  1. 在 uni-app 插件市场中搜索并导入 lime-hanzi-writer
  2. 导入后可能需要重新编译项目
  3. 在页面中使用 l-hanzi-writer 组件

代码演示

基础用法

显示一个汉字,带笔画书写动画。

<l-hanzi-writer character="永" :size="200" />

播放笔顺动画

通过 ref 调用 animateCharacter 方法,播放从第一笔到最后一笔的书写动画。

<l-hanzi-writer ref="writerRef" character="永" :size="200" />
<button @click="playAnimation">播放动画</button>
const playAnimation = () => {
  writerRef.value?.animateCharacter()
}

显示田字格

通过 showGrid 属性显示田字格背景辅助线。

<l-hanzi-writer character="永" :size="200" :showGrid="true" />

自定义颜色

<l-hanzi-writer
  character="永"
  :size="200"
  strokeColor="#333"
  highlightColor="#54b4d3"
  outlineColor="#ccc"
/>

使用本地字符数据

通过 charDataMap 传入本地字符数据,避免网络请求。数据格式参考 hanzi-writer-data

<l-hanzi-writer character="永" :size="200" :charDataMap="dataMap" />
import yongData from '@/static/hanzi-data/永.json'

const dataMap = { '永': yongData }

笔顺测验

通过 quiz 方法进入测验模式,用户按正确笔顺书写。

<l-hanzi-writer ref="writerRef" character="永" :size="200" />
<button @click="startQuiz">开始测验</button>
const startQuiz = () => {
  writerRef.value?.quiz({
    onComplete: (summary) => {
      console.log('测验完成,总错误数:', summary.totalMistakes)
    }
  })
}

测验时同一笔画连续写错达到 showHintAfterMisses 次后会高亮提示正确写法,默认 3 次。可通过 prop 调整:

<!-- 第一次写错就提示 -->
<l-hanzi-writer character="永" :size="200" :show-hint-after-misses="1" />

循环播放动画

<l-hanzi-writer ref="writerRef" character="永" :size="200" />
<button @click="loopAnimation">循环播放</button>
const loopAnimation = () => {
  writerRef.value?.loopCharacterAnimation()
}

动态切换汉字

<l-hanzi-writer ref="writerRef" character="永" :size="200" />
<button @click="switchChar">切换</button>
const switchChar = () => {
  writerRef.value?.setCharacter('学')
}

网络请求与域名白名单

组件加载汉字笔顺数据时,若未通过 charDataMapsetLocalCharData 提供本地数据,会自动发起网络请求获取汉字数据:

https://cdn.jsdelivr.net/npm/hanzi-writer-data@{version}/{character}.json
  • {version} 为内置 CDN 版本号(默认 2.0.1,可通过 setCharDataVersion 修改)
  • {character} 为当前汉字,例如 的请求地址为 https://cdn.jsdelivr.net/npm/hanzi-writer-data@2.0.1/永.json

⚠️ 小程序必须配置合法域名白名单

微信小程序、支付宝小程序等平台对 wx.request / uni.request 有域名校验限制。使用网络加载(未配置本地数据)时,需要在各平台后台「服务器域名 → request 合法域名」中添加:

https://cdn.jsdelivr.net

若你通过 setCharDataVersion 切换了其他 CDN 源(如 unpkg.com),请对应添加该域名。

如不希望任何网络请求,请务必使用 使用本地字符数据 或调用 setLocalCharData 提供全量离线数据。

API 文档

Props

基础配置

参数 说明 类型 默认值
character 显示的汉字 string -
size 组件尺寸(px),设置后 width = height = size number -
width 组件宽度(px),size 优先 number -
height 组件高度(px),size 优先 number -
padding 内边距(px) number 0
disableScroll 触摸时是否禁止页面滚动 boolean true

动画配置

参数 说明 类型 默认值
animationSpeed 笔顺动画速度 number -
delayBetweenStrokes 笔画之间的间隔(ms) number 500

颜色配置

参数 说明 类型 默认值
strokeColor 笔画颜色 string #555
radicalColor 部首颜色,为 null 时与 strokeColor 相同 string | null null
highlightColor 高亮颜色(测验提示用) string #AAF
outlineColor 轮廓颜色 string #DDDDDD
gridColor 田字格线颜色 string #DDDDDD

显示控制

参数 说明 类型 默认值
showOutline 是否显示轮廓 boolean true
showGrid 是否显示田字格背景 boolean false
showHintAfterMisses 测验时同一笔画连续写错几次后显示高亮提示,传 1 表示每次错都提示 number 3

数据配置

参数 说明 类型 默认值
charDataMap 本地汉字数据映射,存在时优先于网络加载 object -

样式定制

参数 说明 类型 默认值
lClass 根元素自定义类名 string | object -
lClassCanvas 画布元素自定义类名 string | object -
lStyle 根元素自定义样式 string | object -

Methods

通过 ref 调用组件方法。

方法名 说明 参数
showCharacter 显示汉字 options?: AnimationOptions
hideCharacter 隐藏汉字 options?: AnimationOptions
animateCharacter 播放笔画书写动画 options?: OnCompleteOptions
animateStroke 播放指定笔画动画 strokeNum: number, options?: OnCompleteOptions
highlightStroke 高亮指定笔画 strokeNum: number, options?: OnCompleteOptions
loopCharacterAnimation 循环播放书写动画 -
pauseAnimation 暂停动画 -
resumeAnimation 恢复动画 -
showOutline 显示轮廓 options?: AnimationOptions
hideOutline 隐藏轮廓 options?: AnimationOptions
quiz 开始笔顺测验 options?: QuizOptions
cancelQuiz 取消测验 -
skipQuizStroke 跳过当前测验笔画 -
setCharacter 切换汉字 char: string
setCharDataMap 动态更新本地字符数据映射 map: UTSJSONObject
getStrokeCount 获取笔画数 返回 number
getCharacterData 获取字符数据 返回 Promise\<Character>
updateDimensions 更新尺寸 options: { width?, height?, padding? }
updateColor 更新颜色 colorName: string, colorVal: string | null, options?: AnimationOptions
destroy 销毁组件 -

上述方法通过组件 ref 调用。以下全局方法通过模块导入调用(设置内置数据加载器的行为):

方法名 说明 参数
setLocalCharData 设置全局本地汉字数据映射,优先于网络加载,适用于全量离线 map: UTSJSONObject
setCharDataVersion 设置网络加载的 hanzi-writer-data CDN 版本号(默认 2.0.1),切换数据源版本 version: string
import { setLocalCharData, setCharDataVersion } from '@/uni_modules/lime-hanzi-writer'

// 全量离线:所有用到的汉字都需提前放入 map
setLocalCharData({ '永': yongData, '汉': hanData })

// 使用其它 CDN 版本(别忘了同步配置对应域名白名单)
setCharDataVersion('3.0.0')

Events

事件名 说明 回调参数
mistake 测验中书写错误时触发 StrokeData
correctStroke 测验中正确书写笔画时触发 StrokeData
complete 测验完成时触发 { character: string, totalMistakes: number }

AnimationOptions

参数 说明 类型 默认值
duration 动画时长(ms) number -
onComplete 动画完成回调 (res: { canceled: boolean }) => void -

QuizOptions

参数 说明 类型 默认值
onComplete 测验完成回调 (summary: { character: string; totalMistakes: number }) => void -
onCorrectStroke 正确书写笔画回调 (strokeData: StrokeData) => void -
onMistake 书写错误回调 (strokeData: StrokeData) => void -

StrokeData

字段 说明 类型
character 当前汉字 string
strokeNum 当前笔画序号 number
mistakesOnStroke 当前笔画错误次数 number
totalMistakes 总错误次数 number
strokesRemaining 剩余笔画数 number
drawnPath 用户绘制的路径 { points: Point[] }
isBackwards 是否反向书写 boolean

updateColorcolorName 合法取值:strokeColor / radicalColor / highlightColor / outlineColor / drawingColor / highlightCompleteColor

Vue2 使用说明

插件使用了 composition-api,如需在 Vue2 项目中使用,请按照官方教程配置。

关键配置代码(在 main.js 中添加):

// vue2
import Vue from 'vue'
import VueCompositionAPI from '@vue/composition-api'
Vue.use(VueCompositionAPI)

快速预览

导入插件后,可以直接使用以下标签查看演示效果:

<!-- 代码位于 uni_modules/lime-hanzi-writer/components/lime-hanzi-writer -->
<lime-hanzi-writer />

插件标签说明

标签类型 示例 说明
组件标签 l-hanzi-writer 默认组件标签,直接使用组件功能
演示标签 lime-hanzi-writer 默认演示标签,查看完整演示效果

平台已知问题

uni-app x App 端

问题 说明 状态
lineDashOffset 取值范围受限 App 端 ctx.lineDashOffset 不支持超过约 60 的值,而汉字笔画路径很长(dashOffset 远超 60),导致基于 setLineDash + lineDashOffset 的笔画生长动画失效。已通过条件编译改用按 displayPortion 截取路径点的方式模拟书写效果 已修复(折线截取,精度略低于 Web 端 dash 方案)

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。