как создать ограничение границы холста, которое масштабируется при увеличении? (fabric.js )

#javascript #canvas #html5-canvas #fabricjs

#javascript #холст #html5-холст #fabricjs

Вопрос:

Я прочитал несколько сообщений на эту тему, но мне еще предстоит найти решение для моей конкретной проблемы.

Вот plnk;

http://plnkr.co/edit/ScJGKwR74H8UjsaJqfZF?p=preview

Цель здесь в том, чтобы вы могли увеличивать изображение, но изображение всегда остается видимым внутри холста без пробелов при перетаскивании. Проблема действительно возникает в этой части кода;

   obj = e.target;

  obj.setCoords();

  var boundingRect = obj.getBoundingRect();
  var zoom = canvas.getZoom();
  var viewportMatrix = canvas.viewportTransform;

  boundingRect.top = (boundingRect.top - viewportMatrix[5]) / zoom;
  boundingRect.left = (boundingRect.left - viewportMatrix[4]) / zoom;
  boundingRect.width /= zoom;
  boundingRect.height /= zoom;

  var pHeight = obj.canvas.height * zoom,
      pWidth = obj.canvas.width * zoom,
      nHeight = obj.canvas.height - pHeight,
      nWidth = obj.canvas.width - pWidth;

  // top-left  corner
  if (boundingRect.top < nHeight || boundingRect.left < nWidth) {
    obj.top = Math.max(obj.top, nHeight   obj.top - boundingRect.top);
    obj.left = Math.max(obj.left, nWidth   obj.left - boundingRect.left);
  }
  

Когда я нажимаю кнопку масштабирования, я хочу, чтобы выводилось отрицательное число, поскольку я хочу, чтобы изображение перетаскивалось с экрана, но никогда не оставляло пробелов. У меня он работает наполовину, но я не уверен, как его получить, чтобы граничный предел всегда вычислялся для масштабированной версии изображения?

Надеюсь, кто-нибудь может указать, где я ошибаюсь?

Спасибо

Ответ №1:

Я попытался слегка реорганизовать логику в верхнем левом углу, чтобы она использовала нижний правый угол для предотвращения ее выхода из холста в любом направлении. Это выглядит так:

   var canvasHeight = obj.canvas.height / zoom,
    canvasWidth = obj.canvas.width / zoom,
    rTop = boundingRect.top   boundingRect.height,
    rLeft = boundingRect.left   boundingRect.width;

  // Where top left corner check used to be
  if (rTop < canvasHeight || rLeft < canvasWidth) {
    obj.top = Math.max(obj.top, canvasHeight - boundingRect.height);
    obj.left = Math.max(obj.left, canvasWidth - boundingRect.width);
  }
  

По сути, вместо проверки того, превысила ли верхняя часть изображения разницу в размере холста, он проверяет, оторвалась ли нижняя часть изображения от нижней части увеличенного холста.

http://plnkr.co/edit/cjAWEqrdnL6skKQYsFM2?p=preview

Комментарии:

1. Привет — спасибо за ответ, есть проблема при попытке установить границу с сгруппированным объектом? У меня было несколько попыток отсортировать его, но безуспешно, если бы вы могли взглянуть? Plunk 1 (верхний / левый угол работает, нижний / правый нет) и Plunk 2 (ничего не работает, но потенциально может быть исправлено?)

2. Привет (снова), у меня это работает, но это не очень надежно, так как при увеличении масштаба остается пустое пространство, plnk .

3. Наверное, я немного смущен тем, что вы делаете. Логика одинакова для объекта или группы объектов; если вы просто подставляете группу в прослушивателе, все должно функционировать одинаково. Я думаю, что некоторые вещи, которые вы делаете, добавляя прямоугольник на холст, а затем вручную управляя группой, все портят.