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;
    };
}
复制代码

 

posted @   名字不好起啊  阅读(419)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示