无法选择由 fabricjs 创建的圆形画布

Can't select circle canvas created by fabricjs

本文关键字:创建 选择 fabricjs      更新时间:2023-09-26

我通过fabricjs将圆圈添加到画布上,但无法选择它来更改大小。我在drawCircle方法中添加了圆圈。我的代码

function Toolbar(can) {
    'use strict';
    var self = this;
    var canvas = can;
    var $container = $('#tool-box-container');
    var $toolboxItems = $container.find('div[data-act]');
    $toolboxItems.click(function () {
        processAction($(this).data('act'));
    });
    function drawLine() {
        var line, isDown;
        canvas.on('mouse:down', function (o) {
            isDown = true;
            var pointer = canvas.getPointer(o.e);
            var points = [pointer.x, pointer.y, pointer.x, pointer.y];
            line = new fabric.Line(points, {
                strokeWidth: 5,
                fill: 'red',
                stroke: 'red',
                originX: 'center',
                originY: 'center'                
            });
            canvas.add(line);
        });
        canvas.on('mouse:move', function (o) {
            if (!isDown)
                return;
            var pointer = canvas.getPointer(o.e);
            line.set({ x2: pointer.x, y2: pointer.y });
            canvas.renderAll();
        });
        canvas.on('mouse:up', function (o) {
            isDown = false;
        });
    }
    function drawCircle() {
        var circle, isDown, origX, origY;
        canvas.on('mouse:down', function (o) {
            isDown = true;
            var pointer = canvas.getPointer(o.e);
            origX = pointer.x;
            origY = pointer.y;
            circle = new fabric.Circle({
                left: pointer.x,
                top: pointer.y,
                radius: 5,
                strokeWidth: 3,
                stroke: 'red',
                fill:'',                
                originX: 'center', originY: 'center'
            });
            canvas.add(circle);
        });
        canvas.on('mouse:move', function (o) {
            if (!isDown)
                return true;
            var pointer = canvas.getPointer(o.e);
            circle.set({ radius: Math.abs(origX - pointer.x) });
            canvas.renderAll();
        });
        canvas.on('mouse:up', function (o) {
            isDown = false;
        });
    }
    function processAction(action) {
        switch (action) {
            case 'move':
                canvas.isDrawingMode = false;
                canvas.selection = true;
                canvas.off('mouse:down');
                canvas.off('mouse:move');
                canvas.off('mouse:up');
                break;
            case 'brush':
                canvas.isDrawingMode = true;
                break;
            case 'pencil':
                canvas.isDrawingMode = true;
                break;
            case 'erase':
                canvas.clear();
                break;
            case 'image':
                $('#add-image').modal('show');
                break;
            case 'circle':
                canvas.isDrawingMode = false;
                canvas.selection = false;
                drawCircle();
                break;
            case 'square':
                canvas.isDrawingMode = false;
                canvas.selection = false;
                drawLine();
                break;
            case 'text':
                canvas.isDrawingMode = true;
                break;
            case 'back':
                break;
            case 'forward':
                break;
        }
    }
}
function Paint($cont) {
    'use strict';
    var self = this;
    var container = $cont;
    var canvas = new fabric.Canvas('main-canvas', {
        isDrawingMode: true
    });
    var toolbox = new Toolbar(canvas);
    canvas.freeDrawingBrush = new fabric['PencilBrush'](canvas);
    canvas.freeDrawingBrush.color = "black";
    canvas.freeDrawingBrush.width = 10;
    canvas.freeDrawingBrush.shadowBlur = false;
    self.canvas = canvas;
    self.container = container;
}

发生这种情况是因为您在将圆尺寸添加到画布后更改了圆尺寸。在mousemove期间,您可以更改圆半径,但这不会更改其可选区域。

在鼠标向上时,调用circle.setCoords()以重新计算圆球框

canvas.on('mouse:up', function (o) {
    isDown = false;
    circle.setCoords();
});