From 141821a843f749b69df4e2f80b3fd429d06cb41e Mon Sep 17 00:00:00 2001 From: bighuixiang <472705331@qq.com> Date: Mon, 4 Aug 2025 23:10:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=8C=87=E7=A4=BA?= =?UTF-8?q?=E5=99=A8=E4=BD=8D=E7=BD=AE=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E5=8E=9F=E7=94=9F=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=9D=90=E6=A0=87=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CanvasEditor/managers/BrushIndicator.js | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/component/Canvas/CanvasEditor/managers/BrushIndicator.js b/src/component/Canvas/CanvasEditor/managers/BrushIndicator.js index e4eafbe2..dac4c65b 100644 --- a/src/component/Canvas/CanvasEditor/managers/BrushIndicator.js +++ b/src/component/Canvas/CanvasEditor/managers/BrushIndicator.js @@ -97,7 +97,8 @@ export class BrushIndicator { if (!this.staticCanvas || !this.canvas) return; // 检查是否为笔刷或橡皮擦模式,非相关模式直接返回 - const isBrushMode = this.canvas.isDrawingMode && this.canvas.freeDrawingBrush; + const isBrushMode = + this.canvas.isDrawingMode && this.canvas.freeDrawingBrush; const isEraserMode = this.canvas.isDrawingMode && this.canvas.freeDrawingBrush && @@ -135,7 +136,10 @@ export class BrushIndicator { const currentVpt = this.canvas.viewportTransform; if ( currentVpt && - !this._areViewportTransformsEqual(currentVpt, this._lastCanvasState.viewportTransform) + !this._areViewportTransformsEqual( + currentVpt, + this._lastCanvasState.viewportTransform + ) ) { this.staticCanvas.setViewportTransform([...currentVpt]); this._lastCanvasState.viewportTransform = [...currentVpt]; @@ -313,8 +317,26 @@ export class BrushIndicator { updatePosition(pointer) { if (!this.isVisible || !this.indicatorCircle) return; - // 使用主画布的坐标转换 - const canvasPointer = this.canvas.getPointer(pointer); + let canvasPointer; + // 如果是原生事件(如 e.e),优先用 clientX/clientY 转换 + if ( + pointer && + pointer.clientX !== undefined && + pointer.clientY !== undefined + ) { + // 获取主画布的包裹元素位置 + const rect = this.canvas.upperCanvasEl.getBoundingClientRect(); + const x = pointer.clientX - rect.left; + const y = pointer.clientY - rect.top; + // 逆变换到画布坐标 + canvasPointer = fabric.util.transformPoint( + new fabric.Point(x, y), + fabric.util.invertTransform(this.canvas.viewportTransform) + ); + } else { + // 兼容 fabric 的 getPointer + canvasPointer = this.canvas.getPointer(pointer); + } // 更新当前位置 this.currentPosition = { @@ -328,8 +350,6 @@ export class BrushIndicator { top: canvasPointer.y, }); - // 重新渲染静态画布 - // this.staticCanvas.renderAll(); // 优化渲染 this.staticCanvas.requestRenderAll(); }