【问题标题】:JavaScript drag drawn canvas elementJavaScript 拖拽画布元素
【发布时间】:2017-06-14 07:42:33
【问题描述】:

我构建了一个小 web 应用程序,用户可以在其中在画布上画线。假设我画了一个圆圈,我怎样才能制作一个选择每个绘制对象的函数。稍后我想调整(缩放)当前点击的对象。到目前为止,我的 Javascript 函数看起来像这样,但我不知道如何进行。

所以我需要这些步骤

  • 用鼠标绘制画布(已经可以了)
  • 点击每张图纸
  • foreach 绘图我想创建一个滑块来改变大小(比例)
var canvasTools = (function() {

    var CanvasEditor = function CanvasEditor(settings) {

        var color = settings.color || 'black',
            width = settings.width || 10;

        this.activeTool = null;
        this.canvas = settings.canvas;
        this.panel = settings.panel;
        this.panelInput = settings.panelInput;
        this.pencil = new Tool_pencil(this.canvas, color, width);

    };

    CanvasEditor.prototype = {

        'constructor': CanvasEditor,
        'clear': function clear() {
            this.canvas.getContext('2d').clearRect(0, 0, this.canvas.width, this.canvas.height);
            return this;
        },
        'init': function init() {
            this.canvas.addEventListener('mousedown', function downHandler(event) {
                if (this.activeTool) {
                    this.activeTool.start(event);
                }
            }.bind(this), false);

            this.canvas.addEventListener('mousemove', function downHandler(event) {
                if (this.activeTool && this.activeTool.active) {
                    this.activeTool.move(event);
                }
            }.bind(this), false);

            this.canvas.addEventListener('mouseup', function downHandler(event) {
                if (this.activeTool) {
                    this.activeTool.end(event);
                }
            }.bind(this), false);

            return this;
        },
        'tool': function tool(toolName) {
            if (toolName && this[toolName]) {
                this.activeTool = this[toolName];
            }
            return this.activeTool;
        },
        'refresh': function refresh() {

        },
        'scale': function scale(panel, canvas, panelInput) {
            if (panel) {
                this.panel.addEventListener('click', function(event) {
                    var panelValue = this.value;
                    var newWidth  = canvas.width * panelValue;
                    var newHeight = canvas.height * panelValue;
                    panelInput.value = panelValue;
                    canvas.getContext('2d').scale(newWidth, newHeight);
                });
            } else {
                console.log("kein panel");
            }
        },
    };

    var CanvasTool = function CanvasTool(canvas) {
        if (!canvas) {
            console.log(this.name + ' - no canvas');
        }
        this.active = false;
        this.canvas = canvas;
        this.context = canvas.getContext('2d');
    };

    CanvasTool.prototype = {
        'constructor': CanvasTool,
        'coords': function coords(event) {
            return {
                'x': (event.layerX || event.offsetX),
                'y': (event.layerY || event.offsetY)
            };
        }
    };

    var Tool_pencil = function Tool_pencil(canvas, color, width) {
        CanvasTool.call(this, canvas);
        this._color = color;
        this._width = width;
    };

    Tool_pencil.prototype = Object.create(CanvasTool.prototype, {
        'constructor': {
            'value': Tool_pencil
        },
        'color': {
            'value': function color(newColor) {
                if (newColor) {
                    this._color = newColor;
                    return this;
                }
                return this._color;
            }
        },
        'end': {
            'value': function end(event) {
                this.move(event);
                this.active = false;
            }
        },
        'move': {
            'value': function move(event) {
                var location = this.coords(event);
                this.canvas.style.cursor = 'pointer';
                this.context.lineTo(location.x, location.y);
                this.context.stroke();
                //if(myCanvasTools.panelInput && myCanvasTools.panelInput.value && myCanvasTools.panelInput.value != 0) {
                myCanvasTools.scale(myCanvasTools.panel, myCanvasTools.canvas, myCanvasTools.panelInput);
                this.context.stroke();
                //}
            }
        },
        'start': {
            'value': function start(event) {
                var location = this.coords(event);
                this.context.beginPath();
                this.context.strokeStyle = this.color();
                this.context.lineWidth = this.width();
                this.context.moveTo(location.x, location.y);
                this.active = true;
            }
        },
        'width': {
            'value': function width(newWidth) {
                if (newWidth) {
                    this._width = newWidth;
                    return this;
                }
                return this._width;
            }
        }
    });

    return function canvasToolsFactory(settings) {
        return new CanvasEditor(settings);
    };
}());

// Canvas Modul Initialiseren
var myCanvasTools = canvasTools({
    'canvas': document.querySelector('#imageView'),
    'panel': document.querySelector('#canvasSliderPanel'),
    'panelInput': document.querySelector('#canvasDepthValue'),
    'color': 'black',
    'width': 5
});

myCanvasTools.init();

编辑 一些人建议我使用像 fabric.js 这样的库,但是有没有办法将它们结合起来呢?目前我不想重新编码所有内容,但最坏的情况我会。

【问题讨论】:

    标签: javascript jquery html canvas


    【解决方案1】:

    请找到下面提到的解决方案。这是您想要的运行代码,仅为演示目的而创建。请根据您的要求进行修改。

    $(document).ready(function(){
    
    var canvas = new fabric.Canvas('paper', {
            isDrawingMode: false,
            height: 200,
            width: 200,
            top: 0,
            left: 0
        });
        var isDown;
    
        canvas.isDrawingMode = true;
        var drawingColorEl = $('#drawing-color');
        var drawingLineWidthEl = $('#drawing-line-width');
    
        canvas.freeDrawingBrush.color = drawingColorEl.val();
        canvas.freeDrawingBrush.width = drawingLineWidthEl.val();
    
        drawingColorEl.change(function() {
            isDown = true;
            canvas.isDrawingMode = true;
            canvas.freeDrawingBrush.color = this.value;
        });
    
        drawingLineWidthEl.change(function() {
            isDown = true;
            canvas.isDrawingMode = true;
            canvas.freeDrawingBrush.width = drawingLineWidthEl.val();
        });
    
    
    
        $('#selectMode').click(function() {
            var objs = [];
            objs = canvas.getObjects();
    
            var alltogetherObj = new fabric.Group(objs, {
            });
            canvas._activeObject = null;
            if (objs.length != 0) {
                canvas.setActiveGroup(alltogetherObj.setCoords()).renderAll();
            }
            isDown = false;
            canvas.isDrawingMode = false;
    
        });
    
        $('#drawMode').click(function() {
            isDown = true;
            canvas.isDrawingMode = true;
            canvas.discardActiveGroup();
            canvas.discardActiveObject();
            canvas.renderAll();
        });
    
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.12/fabric.min.js"></script>
    
    <select id="drawing-color">
        <option value="#ff0000">Red</option>
        <option value="#000000">Black</option>
    </select>
    
    <select id="drawing-line-width">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5" selected="selected">5</option>
        <option value="6">6</option>
        <option value="7">7</option>
        <option value="8">8</option>
        <option value="9">9</option>
        <option value="10">10</option>
    </select>
    <input type="button" id="selectMode" value="Select Mode" />
    <input type="button" id="drawMode" value="Draw Mode"/>
    <canvas id="paper" style="border:1px solid #ccc"></canvas>

    如果它不适合你,请告诉我。

    【讨论】:

    • 你有一个例子,有人可以在上面绘制和选择那个区域+大小函数吗?
    • 所以你的意思是为绘制矩形创建函数..?像你这样问
    • 我当前的脚本允许使用鼠标绘制线条、圆圈等,我想选择我用鼠标绘制的图形。你有这方面的例子吗?
    • @utdev : 你想选择所有只用鼠标创建的特定对象
    • 我已经更新了答案,但是你可以用鼠标选择所有对象。你能看看我的例子吗?
    【解决方案2】:

    这不是一个简单的任务,在我看来,你应该使用类似 pixie.js 的库,请查看这个示例 -

    http://pixijs.github.io/examples/#/demos/dragging.js

    但是,如果您真的想自己实现它,那将是一个真正的挑战。我可以建议在这里检查我的代码 - http://kill-them.com/assets/js/applications/MapEditor.js?v=7

    要查看它是如何工作的,您可以转到http://kill-them.com/,按short session,然后转到顶部菜单中的map editor。在那里您将能够看到地图编辑器,您将能够在其中放置墙。会有调整大小和旋转等控件。但实际上,如果我再从头开始同一个项目,我会使用库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      相关资源
      最近更新 更多