Цвет холста и перетаскивание - PullRequest
1 голос
/ 03 июля 2019

Рисунки на изображении

В своем коде я хочу менять цвет рисунков на каждом шагу; но, если я изменю цвет на 3-м шаге, цвета на предыдущих шагах также изменятся на цвет 3-го шага. Я хочу сделать это своими разными цветами. Я включил 1 или 2 фотографии для лучшего понимания.

Кроме того, я хочу, чтобы мои рисунки перетаскивались, но, поскольку я использую холст, я не могу использовать jquery-ui (.draggable), а также я не могу изменить идентификатор своих рисунков из-за холста.

jQuery(document).ready(function($) {

  //Canvas
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');

  //Variables
  var canvasOffset = $("#canvas").offset();
  var canvasx = canvasOffset.left;
  var canvasy = canvasOffset.top;
  var last_mousex = 0;
  var last_mousey = 0;
  var mousex = 0;
  var mousey = 0;
  var mousedown = false;
  var shapes = [];
  var width;
  var height;

  //Mousedown
  $(canvas).on('mousedown', function(e) {
    last_mousex = parseInt(e.clientX - canvasx);
    last_mousey = parseInt(e.clientY - canvasy);
    mousedown = true;
  });

  //Mouseup
  $(canvas).on('mouseup', function(e) {
    const lastPos = {
      lastMouseX: last_mousex,
      lastMouseY: last_mousey,
      rectWidth: width,
      rectHeight: height
    };
    shapes.push(lastPos);
    mousedown = false;
  });

  //Mousemove
  $(canvas).on('mousemove', function(e) {
    mousex = parseInt(e.clientX - canvasx);
    mousey = parseInt(e.clientY - canvasy);
    if (mousedown) {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      ctx.beginPath();
      width = mousex - last_mousex;
      height = mousey - last_mousey;
      var col = $(".color").val();
      if (shapes.length > 0) {
        for (var i in shapes) {
          ctx.rect(shapes[i].lastMouseX, shapes[i].lastMouseY, shapes[i].rectWidth, shapes[i].rectHeight);
        }
      }
      ctx.rect(last_mousex, last_mousey, width, height);
      ctx.strokeStyle = col;
      ctx.lineWidth = 10;
      ctx.stroke();
    }
    $("#canvas").mousedown(function(e) {
      handleMouseDown(e);
    });
    $("#canvas").mousemove(function(e) {
      handleMouseMove(e);
    });
    $("#canvas").mouseup(function(e) {
      handleMouseUp(e);
    });

    //Output
    $('#output').html('current: ' + mousex + ', ' + mousey + '<br/>last: ' + last_mousex + ', ' + last_mousey + '<br/>mousedown: ' + mousedown);
  });
});
.color {
  border: 1px solid black;
  font-family: 'Times New Roman', Times, serif;
  font-size: 40px;
}

#canvas {
  cursor: crosshair;
  border: 1px solid #000000;
  background-image: url("kroki2v3.png");
  background-repeat: no-repeat;
  margin: 0;
  padding: 0;
}

#output {
  font-family: 'Times New Roman', Times, serif;
  font-size: 40px;
}
<html>

<head>
  <meta charset="utf-8" />
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>

<body>
  <input type="text" maxlength="50" class="color" required />
  <div id="container" style="display: none;"><img src="kroki2v3.png" id="img01" alt="" style="display: none;"></div>
  <canvas id="canvas" width="3200" height="1400"></canvas>
  <div id="output"></div>
</body>

</html>

1 Ответ

2 голосов
/ 03 июля 2019

Я сделал несколько изменений в вашем коде:

  1. сделать var col глобальной переменной

  2. при наведении мыши сохранитьцвет текущего прямоугольника: color:col

  3. когда вы рисуете фигуры в массиве shapes, вам нужно ctx.beginPath() для каждого прямоугольника.Также вы устанавливаете цвет обводки для каждого прямоугольника: ctx.strokeStyle = shapes[i].color;

Наблюдение: вы можете использовать метод strokeRect () вместо rect() и stroke()

В коде я отметил те точки, где я внес изменения.Прочитайте комментарии.

jQuery(document).ready(function($) {

  //Canvas
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');

  //Variables
  var canvasOffset = $("#canvas").offset();
  var canvasx = canvasOffset.left;
  var canvasy = canvasOffset.top;
  var last_mousex = 0;
  var last_mousey = 0;
  var mousex = 0;
  var mousey = 0;
  var mousedown = false;
  var shapes = [];
  var width;
  var height;
  // make var col a global variable
  var col = "black";

  //Mousedown
  $(canvas).on('mousedown', function(e) {
    last_mousex = parseInt(e.clientX - canvasx);
    last_mousey = parseInt(e.clientY - canvasy);
    mousedown = true;
  });

  //Mouseup
  $(canvas).on('mouseup', function(e) {
    const lastPos = {
      lastMouseX: last_mousex,
      lastMouseY: last_mousey,
      rectWidth: width,
      rectHeight: height,
      // save the color of the rect
      color:col
    };
    shapes.push(lastPos);
    mousedown = false;
  });

  //Mousemove
  $(canvas).on('mousemove', function(e) {
    mousex = parseInt(e.clientX - canvasx);
    mousey = parseInt(e.clientY - canvasy);
    if (mousedown) {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      
      width = mousex - last_mousex;
      height = mousey - last_mousey;
      col = $(".color").val();
      if (shapes.length > 0) {
        for (var i in shapes) {
          // for every shape in the shapes array beginPath
          ctx.beginPath();
          //set the color of the stroke
          ctx.strokeStyle = shapes[i].color;
          //draw the rect
          ctx.rect(shapes[i].lastMouseX, shapes[i].lastMouseY, shapes[i].rectWidth, shapes[i].rectHeight);
          ctx.stroke();
        }
      }
      
      //for the new rect beginPath
      ctx.beginPath();
      ctx.rect(last_mousex, last_mousey, width, height);
      ctx.strokeStyle = col;
      ctx.lineWidth = 10;
      ctx.stroke();
    }
    
    /*
    $("#canvas").mousedown(function(e) {
      handleMouseDown(e);
    });
    $("#canvas").mousemove(function(e) {
      handleMouseMove(e);
    });
    $("#canvas").mouseup(function(e) {
      handleMouseUp(e);
    });*/

    //Output
    $('#output').html('current: ' + mousex + ', ' + mousey + '<br/>last: ' + last_mousex + ', ' + last_mousey + '<br/>mousedown: ' + mousedown);
  });
});
.color {
  border: 1px solid black;
  font-family: 'Times New Roman', Times, serif;
  font-size: 40px;
}

#canvas {
  cursor: crosshair;
  border: 1px solid #000000;
  background-image: url("kroki2v3.png");
  background-repeat: no-repeat;
  margin: 0;
  padding: 0;
}

#output {
  font-family: 'Times New Roman', Times, serif;
  font-size: 40px;
}
<html>

<head>
  <meta charset="utf-8" />
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>

<body>
  <input type="text" maxlength="50" class="color" required />
  <div id="container" style="display: none;"><img src="kroki2v3.png" id="img01" alt="" style="display: none;"></div>
  <canvas id="canvas" width="3200" height="1400"></canvas>
  <div id="output"></div>
</body>

</html>
...