fabric 鼠标点击绘制折线
import { fabric } from 'fabric'; import { KeyCode } from "./key-code"; import { Polyline } from "./polyline"; /** * 动态点击鼠标绘制折线 * 键盘 Q 开始绘制,W 停止绘制,E 清空画布 */ export class DynamicLine { isDrawing = false; points = []; sub = 0; // 当前绘制线信息 line; constructor(canvas) { // 绑定鼠标动态绘制图形 this.bindDrawEvent(canvas); // 绑定键盘事件,用于执行/结束折线绘制 this.bindKeyboardEvent(canvas, this.points, this.line); } /** * 绑定鼠标动态绘制折线 * @param canvas */ bindDrawEvent(canvas) { let self = this; canvas.on('mouse:down', (e) => { if (self.isDrawing) { // 记录当前坐标点 self.points.push({ x: e.e.offsetX, y: e.e.offsetY, }); self.sub++; self.drawLineByPoints(canvas, self.points, self.line); } }); $(document).on('mousemove', (e) => { if (self.isDrawing) { self.points[self.sub] = { x: e.originalEvent.offsetX, y: e.originalEvent.offsetY, }; self.drawLineByPoints(canvas, self.points, self.line); } }); canvas.on('mouse:up', (e) => { }); } /** * 根据传入 points ,绘制 line * @param canvas * @param points * @param line */ drawLineByPoints(canvas, points, line) { this.line && canvas.remove(this.line); this.line = new fabric.Polyline(this.points, Polyline.defaultLine()); // 添加图形至画布 canvas.add(this.line); canvas.renderAll(); } /** * 绑定键盘事件 * @param canvas */ bindKeyboardEvent(canvas) { $(document).on('keydown', (e) => { const key = e.originalEvent.keyCode; switch (key) { case KeyCode.Q: this.isDrawing = true; break; case KeyCode.W: // 结束绘制当前线 this.isDrawing = false; // 移除最后一个点的记录 this.points.pop(); this.drawLineByPoints(canvas, this.points, this.line); // 清空之前选中,设置当前选中 canvas.discardActiveObject(); canvas.setActiveObject(this.line); canvas.renderAll(); // 重置 this.resetData(); break; case KeyCode.E: // 清空画布,重置值 this.resetData(); canvas.clear(); canvas.renderAll(); break; } }); } /** * 重置绘制数据 */ resetData() { this.points = []; this.isDrawing = false; this.sub = 0; this.line = null; }; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现