HarmonyOS ArkTS中Canvas自定义图形需状态驱动重绘:用@State管理参数,onReady保存context,封装drawShape()方法;样式通过计算属性、@Styles和Environment.theme动态配置;交互状态用@Link/@Prop同步;复杂场景采用OffscreenCanvas离屏缓存优化性能。
在 HarmonyOS ArkTS 开发中,用 Canvas 绘制自定义形状 UI 组件时,状态与样式管理不是靠写死参数,而是要让图形响应数据变化、支持交互反馈、适配不同主题或用户操作——核心在于把“画什么”和“怎么画”解耦,再通过 ArkTS 的状态装饰器驱动重绘。
Canvas 本身不自动响应状态变化,必须手动触发重绘。关键是在状态变更后调用 context 的绘制方法,并确保 onReady 后的上下文可用。
fillColor、isFilled、rotation、size),这些变量一变,组件自动重新 builddrawShape()),在 @Watch 或事件回调里调用它,而不是只在 onReady 里画一次this.context.fillStyle 不会触发 UI 更新,必须配合状态变更 + 主动调用 draw 方法同一个图形组件可能在不同场景下需要不同视觉表现(比如选中高亮、禁用灰化、深色模式适配),样式不应硬编码在 draw 函数里。
get strokeColor() { return this.isSelected ? '#007AFF' : '#999'; }
Environment.theme),自动切换 fillStyle 和 strokeStyle 的深浅色值drawPath() 中重复设置 context 属性,统一在 prepareStyle() 中集中处理(参考 Shape 基类设计)自定义图形常需响应点击、拖拽、缩放等交互,此时图形内部状态(如是否被选中、当前坐标)要和 UI 层状态对齐。
isSelected: boolean),实现父子联动PanGesture.onActionUpdate)中更新本地坐标状态,并立即调用重绘,保证拖拽流畅clearRect 局部擦除)draw() 末尾追加描边或 shadow 相关设置,但记得开启 context.shadowColor 等开关当图形复杂或频繁重绘(如动画、实时缩放),直接在主 Canvas 上逐帧绘制容易卡顿。离屏绘制能预渲染静态部分,提升响应速度。
offContext.transferToImageBitmap() 生成图像位图,再用主 context 的 transferFromImageBitmap() 快速贴图