Skip to content

xtf-canvas ​

组件说明 ​

xtf-canvas 是画布,用于管理 Canvas 绘制上下文与导出操作。当前实现通过 ready 等事件反馈交互、提供实例方法。

  • 实际 Demo 路由:#/pages/components/xtf-canvas/index
  • Demo 源码

基础用法 ​

1. 最小可用 ​

提供能够直接看到或操作组件的最少业务内容。

vue
<template>
  <view class="doc-minimum">
    <XtfCanvas canvas-id="doc-canvas" />
  </view>
</template>

<script setup lang="uts">
import XtfCanvas from "@/uni_modules/xtf-linkuiunix/components/xtf-canvas/xtf-canvas.uvue"

</script>

<style>
.doc-minimum { display: flex; flex-direction: column; padding: 24rpx; }
</style>

2. 核心数据与主要事件 ​

使用组件真实数据入口,并记录当前源码声明的主要事件。

vue
<template>
  <view class="doc-core">
    <XtfCanvas canvas-id="doc-canvas" @ready="onPrimaryEvent" />
  </view>
</template>

<script setup lang="uts">
import XtfCanvas from "@/uni_modules/xtf-linkuiunix/components/xtf-canvas/xtf-canvas.uvue"

function onPrimaryEvent(payload: any): void { console.log("xtf-canvas:ready", payload) }
</script>

<style>
.doc-core { display: flex; flex-direction: column; padding: 24rpx; }
</style>

3. 动态 disableScroll 状态 ​

运行时切换 disableScroll,观察组件对应状态变化。

vue
<template>
  <view class="doc-dynamic">
    <XtfCanvas canvas-id="doc-canvas" :disable-scroll="state" />
    <button class="doc-action-button" @click="toggleState">切换 disableScroll</button>
    <text class="doc-state-text">disableScroll: {{ state }}</text>
  </view>
</template>

<script setup lang="uts">
import XtfCanvas from "@/uni_modules/xtf-linkuiunix/components/xtf-canvas/xtf-canvas.uvue"

import { ref } from "vue"

const state = ref(false)
function toggleState(): void { state.value = !state.value; console.log("disableScroll", state.value) }
</script>

<style>
.doc-dynamic { display: flex; flex-direction: column; padding: 24rpx; }
.doc-action-button { margin-top: 16rpx; }
.doc-state-text { margin-top: 12rpx; color: #475569; font-size: 24rpx; }
</style>

4. 调用 refresh() ​

重新计算或刷新;签名为 refresh(): void。

vue
<template>
  <view class="doc-method">
    <XtfCanvas canvas-id="doc-canvas" ref="componentRef" />
    <button class="doc-action-button" @click="callMethod">重新计算或刷新</button>
  </view>
</template>

<script setup lang="uts">
import XtfCanvas from "@/uni_modules/xtf-linkuiunix/components/xtf-canvas/xtf-canvas.uvue"

import { ref } from "vue"

const componentRef = ref<any>(null)
function callMethod(): void { componentRef.value?.refresh(); console.log("调用 refresh") }
</script>

<style>
.doc-method { display: flex; flex-direction: column; padding: 24rpx; }
.doc-action-button { margin-top: 16rpx; }
</style>

5. 父布局变化后显式 refresh() ​

弹层展开、隐藏容器恢复或父布局变化完成后调用 refresh;Canvas/Signature 应先收到 ready。此方法返回 void,不代表设备绘图或导出已完成。

vue
<template>
  <view class="doc-layout-refresh">
    <view :style="{ width: layoutWidth }"><XtfCanvas canvas-id="doc-canvas" ref="componentRef" /></view>
    <button class="doc-action-button" @click="refreshLayout">切换父宽度并刷新尺寸</button>
  </view>
</template>

<script setup lang="uts">
import XtfCanvas from "@/uni_modules/xtf-linkuiunix/components/xtf-canvas/xtf-canvas.uvue"

import { nextTick, ref } from "vue"

const componentRef = ref<any>(null)
const layoutWidth = ref("100%")
async function refreshLayout(): Promise<void> { layoutWidth.value = layoutWidth.value == "100%" ? "80%" : "100%"; await nextTick(); componentRef.value?.refresh(); console.log("refresh 已请求") }
</script>

<style>
.doc-layout-refresh { display: flex; flex-direction: column; padding: 24rpx; }
.doc-action-button { margin-top: 16rpx; }
</style>

全部属性 ​

属性源码类型withDefaults 默认值实际行为 / 范围适用范围
canvasIdstring""参与组件运行逻辑;源码在 3 处读取该值;消费位置:script 行 100、script 行 828需要覆盖组件默认业务值时设置。
widthstring | number600参与组件运行逻辑;源码在 2 处读取该值;消费位置:script 行 111、script 行 826需要覆盖组件默认业务值时设置。
heightstring | number400参与组件运行逻辑;源码在 2 处读取该值;消费位置:script 行 112、script 行 827需要覆盖组件默认业务值时设置。
backgroundColorstring""设置对应区域的颜色;消费位置:script 行 113、script 行 429、script 行 430、script 行 642需要调整布局或视觉表现时设置。
disableScrollbooleantrue参与组件运行逻辑;源码在 1 处读取该值;消费位置:template 行 9需要覆盖组件默认业务值时设置。
autoCreateContextbooleantrue开关对应显示或交互行为;消费位置:script 行 164需要提供业务文案或图标内容时设置。
drawingbooleanfalse参与组件运行逻辑;源码在 5 处读取该值;消费位置:script 行 106、script 行 713、script 行 720、script 行 730需要覆盖组件默认业务值时设置。
toolstring"pen"参与组件运行逻辑;源码在 1 处读取该值;消费位置:script 行 101需要覆盖组件默认业务值时设置。
strokeColorstring"#111827"设置对应区域的颜色;消费位置:script 行 699需要调整布局或视觉表现时设置。
strokeWidthstring | number6设置对应区域宽度;消费位置:script 行 102需要调整布局或视觉表现时设置。
minDistancestring | number2参与组件运行逻辑;源码在 1 处读取该值;消费位置:script 行 103需要覆盖组件默认业务值时设置。
pressurebooleanfalse参与组件运行逻辑;源码在 1 处读取该值;消费位置:script 行 695需要覆盖组件默认业务值时设置。
historyLimitstring | number50参与组件运行逻辑;源码在 1 处读取该值;消费位置:script 行 104需要覆盖组件默认业务值时设置。
strokesXtfCanvasStroke[]() => [] as XtfCanvasStroke[]参与组件运行逻辑;源码在 2 处读取该值;消费位置:script 行 814、script 行 842需要覆盖组件默认业务值时设置。
commandsXtfCanvasCommand[]() => [] as XtfCanvasCommand[]参与组件运行逻辑;源码在 2 处读取该值;消费位置:script 行 821、script 行 843需要覆盖组件默认业务值时设置。
showGridbooleanfalse开关对应显示或交互行为;消费位置:script 行 433、script 行 830需要控制显示、可用性或交互状态时设置。
gridSizestring | number40设置对应元素尺寸;消费位置:script 行 434、script 行 831需要调整布局或视觉表现时设置。
gridColorstring"rgba(148, 163, 184, 0.22)"设置对应区域的颜色;消费位置:script 行 435、script 行 832需要调整布局或视觉表现时设置。
emptyTextstring""设置对应区域的显示文案;消费位置:script 行 116、template 行 20需要提供业务文案或图标内容时设置。
customClassstring""参与组件运行逻辑;源码在 1 处读取该值;消费位置:script 行 108需要调整布局或视觉表现时设置。
customStylestring | UTSJSONObject""参与组件运行逻辑;源码在 1 处读取该值;消费位置:template 行 2需要调整布局或视觉表现时设置。

XtfCanvasStroke 数据结构 ​

字段源码类型字段语义
idstring数据标识
toolstring源码声明的业务扩展字段;当前实现未提供更具体语义。
colorstring源码声明的业务扩展字段;当前实现未提供更具体语义。
widthnumber源码声明的业务扩展字段;当前实现未提供更具体语义。
pointsXtfCanvasPoint[]源码声明的业务扩展字段;当前实现未提供更具体语义。

XtfCanvasCommand 数据结构 ​

字段源码类型字段语义
idstring数据标识
typestring类型标识
xnumber源码声明的业务扩展字段;当前实现未提供更具体语义。
ynumber源码声明的业务扩展字段;当前实现未提供更具体语义。
x2number源码声明的业务扩展字段;当前实现未提供更具体语义。
y2number源码声明的业务扩展字段;当前实现未提供更具体语义。
widthnumber源码声明的业务扩展字段;当前实现未提供更具体语义。
heightnumber源码声明的业务扩展字段;当前实现未提供更具体语义。
radiusnumber源码声明的业务扩展字段;当前实现未提供更具体语义。
radiusXnumber源码声明的业务扩展字段;当前实现未提供更具体语义。
radiusYnumber源码声明的业务扩展字段;当前实现未提供更具体语义。
startAnglenumber源码声明的业务扩展字段;当前实现未提供更具体语义。
endAnglenumber源码声明的业务扩展字段;当前实现未提供更具体语义。
counterClockwiseboolean源码声明的业务扩展字段;当前实现未提供更具体语义。
colorstring源码声明的业务扩展字段;当前实现未提供更具体语义。
fillboolean源码声明的业务扩展字段;当前实现未提供更具体语义。
fillColorstring源码声明的业务扩展字段;当前实现未提供更具体语义。
strokeboolean源码声明的业务扩展字段;当前实现未提供更具体语义。
strokeColorstring源码声明的业务扩展字段;当前实现未提供更具体语义。
lineWidthnumber源码声明的业务扩展字段;当前实现未提供更具体语义。
lineCapstring源码声明的业务扩展字段;当前实现未提供更具体语义。
lineJoinstring源码声明的业务扩展字段;当前实现未提供更具体语义。
pointsXtfCanvasPoint[]源码声明的业务扩展字段;当前实现未提供更具体语义。
segmentsXtfCanvasPathSegment[]源码声明的业务扩展字段;当前实现未提供更具体语义。
textstring显示文本
fontSizenumber源码声明的业务扩展字段;当前实现未提供更具体语义。
fontstring源码声明的业务扩展字段;当前实现未提供更具体语义。
textAlignstring源码声明的业务扩展字段;当前实现未提供更具体语义。
textBaselinestring源码声明的业务扩展字段;当前实现未提供更具体语义。
maxWidthnumber源码声明的业务扩展字段;当前实现未提供更具体语义。
namestring名称或兼容显示字段
iconstring图标名称
sizenumber资源大小
anchorstring源码声明的业务扩展字段;当前实现未提供更具体语义。
cutoutboolean源码声明的业务扩展字段;当前实现未提供更具体语义。
cutoutColorstring源码声明的业务扩展字段;当前实现未提供更具体语义。
alphanumber源码声明的业务扩展字段;当前实现未提供更具体语义。
compositestring源码声明的业务扩展字段;当前实现未提供更具体语义。

事件 ​

事件名称源码触发边界回调参数参数说明
readyinitContext 内触发(script 行 165);参数表达式:{ "meta": getCanvasMeta(), "context": null, "renderingContext": null };前置 guard:disposed、!props.autoCreateContext
setup 内触发(script 行 190);参数表达式:{ "meta": getCanvasMeta(), "context": canvasContext, "renderingContext": renderingContext };前置 guard:disposed || requestId != contextRequestId、context2d == null
(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
touchstart仅声明,当前未找到触发路径。(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
touchmove仅声明,当前未找到触发路径。(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
touchend仅声明,当前未找到触发路径。(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
touchcancel仅声明,当前未找到触发路径。(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
mousedown仅声明,当前未找到触发路径。(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
mousemove仅声明,当前未找到触发路径。(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
mouseup仅声明,当前未找到触发路径。(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
mouseleave仅声明,当前未找到触发路径。(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
draw-startstartDrawing 内触发(script 行 716);参数表达式:{ "point": cloneCanvasPoint(point), "stroke": cloneCanvasStroke(activeStroke.value!), "canvas": getCanvasMeta() };前置 guard:!props.drawing(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
draw-movemoveDrawing 内触发(script 行 726);参数表达式:{ "point": cloneCanvasPoint(point), "stroke": cloneCanvasStroke(activeStroke.value!), "canvas": getCanvasMeta() };前置 guard:!props.drawing || activeStroke.value == null、pointDistance(lastPoint, point) < resolvedMinDistance.value(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
draw-endendDrawing 内触发(script 行 744);参数表达式:{ "stroke": cloneCanvasStroke(completed), "canvas": getCanvasMeta() };前置 guard:!props.drawing || activeStroke.value == null(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
changeemitStrokeChange 内触发(script 行 757);参数表达式:{ "reason": reason, "strokes": strokes, "canvas": getCanvasMeta() }
emitCommandChange 内触发(script 行 763);参数表达式:{ "reason": reason, "commands": commands, "canvas": getCanvasMeta() }
(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
update:strokesemitStrokeChange 内触发(script 行 755);参数表达式:strokes(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
update:commandsemitCommandChange 内触发(script 行 762);参数表达式:commands(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
undoundo 内触发(script 行 394);参数表达式:getCanvasMeta();前置 guard:internalStrokes.value.length == 0(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
redoredo 内触发(script 行 404);参数表达式:getCanvasMeta();前置 guard:redoStack.value.length == 0(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
clearclear 内触发(script 行 374);参数表达式:getCanvasMeta()(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
exportexportImage 内触发(script 行 806);参数表达式:result;前置 guard:canvasContext == null || !contextReady.value(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。
erroremitError 内触发(script 行 157);参数表达式:{ "canvasId": resolvedCanvasId.value, "operation": operation, "message": message, "error": error }(...args: any[])表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。

插槽 ​

插槽Scope 参数实际渲染位置
--当前模板没有公开 slot。

方法 ​

实例方法 ​

方法签名 / 返回值调用边界
refreshrefresh(): void重新计算或刷新;通过组件 ref 调用,参数和返回值按签名处理。
initContextinitContext(): void调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
recreateContextrecreateContext(): void调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
getCanvasMetagetCanvasMeta(): XtfCanvasMeta调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
getCanvasIdgetCanvasId(): string调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
getCanvasContextgetCanvasContext(): CanvasContext | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
getContextgetContext(): CanvasRenderingContext2D | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
getRenderingContextgetRenderingContext(): CanvasRenderingContext2D | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
getStrokesgetStrokes(): XtfCanvasStroke[]调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
getCommandsgetCommands(): XtfCanvasCommand[]调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
setStrokessetStrokes(strokes: XtfCanvasStroke[]): void调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
setCommandssetCommands(commands: XtfCanvasCommand[]): void调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
addCommandaddCommand(command: XtfCanvasCommand): string | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
removeCommandremoveCommand(commandId: string): boolean调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
clearCommandsclearCommands(): void调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
drawRectdrawRect(options: XtfCanvasCommand): string | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
drawCircledrawCircle(options: XtfCanvasCommand): string | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
drawEllipsedrawEllipse(options: XtfCanvasCommand): string | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
drawRoundRectdrawRoundRect(options: XtfCanvasCommand): string | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
drawArcdrawArc(options: XtfCanvasCommand): string | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
drawLinedrawLine(options: XtfCanvasCommand): string | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
drawPointsdrawPoints(points: XtfCanvasPoint[], options: XtfCanvasCommand): string | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
drawPolygondrawPolygon(points: XtfCanvasPoint[], options: XtfCanvasCommand): string | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
drawPathdrawPath(segments: XtfCanvasPathSegment[], options: XtfCanvasCommand): string | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
drawTextdrawText(text: string, options: XtfCanvasCommand): string | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
drawIcondrawIcon(name: string, options: XtfCanvasCommand): string | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
drawdraw(callback: (context: CanvasRenderingContext2D) => void, _reserve: boolean = false): void调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
redrawredraw(): void调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
clearclear(done: (() => void) | null = null): void清空内容;通过组件 ref 调用,参数和返回值按签名处理。
clearStrokesclearStrokes(): void调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
undoundo(): boolean调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
redoredo(): boolean调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。
exportImageexportImage(_options: any = null): XtfCanvasExportResult | null调用该公开实例能力;通过组件 ref 调用,参数和返回值按签名处理。

公开状态 ​

状态类型 / 包装读取边界
--当前组件没有公开状态。

主题说明 ​

  • var(--xtf-color-primary):组件样式实际读取的主题变量,可在 xtf-config-provider 作用域或主题 class 下覆盖。
  • var(--xtf-color-text-secondary):组件样式实际读取的主题变量,可在 xtf-config-provider 作用域或主题 class 下覆盖。

平台与实现边界 ​

  • 基线为 HBuilderX 5.26+ 与 uni-app x;当前报告已验证 Web Chromium 的对应 Demo,不据此承诺 Safari、小程序或 App 原生端等价。
  • Android、iOS、HarmonyOS、Vapor 原生路径、触摸手势、字体、Canvas、安全区和系统权限能力,只有源码或完整性报告明确覆盖的部分才可视为已验证。
  • 本文按当前源码生成,不补入旧版 xtf-linkui 存在但迁移版未实现的 props、事件、slot 或方法。
  • 仅声明但当前未找到触发路径的事件:touchstart、touchmove、touchend、touchcancel、mousedown、mousemove、mouseup、mouseleave。
  • refresh(): void 在上下文 ready 且尺寸大于零时检查逻辑尺寸与 DPR,变化后重新配置位图并 redraw;无变化或未 ready 时不处理,不是清空 API。WEB || APP 条件编译 UniResizeObserver,小程序需在布局完成后显式调用;重建上下文与卸载会解除旧观察。
  • 详细公共边界见 平台与实现边界,逐项运行证据见项目根目录 COMPONENT_COMPLETENESS.md。

MIT Licensed