внешний вид ограничительной рамки — управление настройкой с помощью fabricjs

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


person Lindy    schedule 16.04.2013    source источник
comment
я знаю, что этот вопрос очень старый и, вероятно, сейчас вас не интересует, но, пожалуйста, посмотрите и одобрите его, чтобы другие пользователи могли извлечь из этого пользу.   -  person AndreaBogazzi    schedule 28.01.2016


Ответы (2)


Самый быстрый способ настроить элементы управления — написать собственную функцию _drawControl и сделать ее совместимой со стандартом Fabricjs, чтобы переопределить ее. Помните, что эта функция вызывается 9 раз для каждого рендера, так что старайтесь не использовать код и рисунки. Также, если вы изменяете контекст ( ctx ), не забудьте использовать .save и .restore, чтобы не испортить конвейер рендеринга.

FabricJs вызовет функцию с top и left, готовыми для прямоугольника, поэтому угол будет в top + size/2 и left + size/2, где размер равен this.cornerSize.

function newControls(control, ctx, methodName, left, top) {
  if (!this.isControlVisible(control)) {
        return;
      }
      var size = this.cornerSize;
      isVML() || this.transparentCorners || ctx.clearRect(left, top, size, size);
      ctx.arc(left + size/2, top + size/2, size/2, 0, 2 * Math.PI, false);
      ctx.stroke();
}

fabric.Object.prototype._drawControl = newControls;

function newControls(control, ctx, methodName, left, top) {
  if (!this.isControlVisible(control)) {
        return;
      }
      var size = this.cornerSize;
      this.transparentCorners || ctx.clearRect(left, top, size, size);
      ctx.beginPath();
      ctx.arc(left + size/2, top + size/2, size/2, 0, 2 * Math.PI, false);
      ctx.stroke();
}

fabric.Object.prototype._drawControl = newControls;
fabric.Object.prototype.cornerSize = 15;
var canvas = new fabric.Canvas('c');


canvas.add(new fabric.Rect({width:100, height:100, top:50, left:50}));
canvas.setActiveObject(canvas.getObjects()[0]);
<script type ="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
<canvas id="c" width="400" height="400" style="border:1px solid #ccc"></canvas>

person AndreaBogazzi    schedule 27.01.2016
comment
Я обнаружил проблему. Возможно, это моя реализация, но закругленные углы находятся внутри коробки, я думаю, это исходный угол. Есть ли способ предотвратить это? пример: jsfiddle.net/hello_world/gxbhjyzg/7 Спасибо! В идеале будет просто круг (тот же цвет заливки и границы) - person Horacio; 14.04.2016
comment
Вы не должны очищать поле ( clearRect ) перед рисованием. Если вы хотите белые круги, сделайте обводку и заливку. заливаем белым. - person AndreaBogazzi; 14.04.2016

Проверьте эти примеры:

http://fabricjs.com/customization/

Пример 2:

var canvas = new fabric.Canvas('c3');
  canvas.add(new fabric.Circle({ radius: 30, fill: '#f55', top: 100, left: 100 }));

  canvas.item(0).set({
    borderColor: 'red',
    cornerColor: 'green',
    cornerSize: 6,
    transparentCorners: false
  });
  canvas.setActiveObject(canvas.item(0));
person ptCoder    schedule 16.04.2013
comment
Извините, это не ответ на мой вопрос. - person Lindy; 16.04.2013
comment
Мне нужно настроить 9 маленьких рамок ограничивающей рамки, я хочу круг вместо маленького квадрата - person Lindy; 16.04.2013
comment
Нет, на данный момент нет встроенной поддержки изменения формы элементов управления объектами. Возможно, вы сможете взломать что-нибудь сверху. - person kangax; 16.04.2013
comment
может быть, мне нужно перезаписать ограничивающую рамку, когда происходит объект: выбрано - person Lindy; 17.04.2013