【问题标题】:Fabricjs Selection on multiple objects on mouse click鼠标单击时在多个对象上选择 Fabricjs
【发布时间】:2019-06-01 13:34:11
【问题描述】:

关于在画布鼠标单击上选择多个对象有什么建议吗?不是所有对象,我想选择覆盖在该点上的对象。

据我所知,鼠标事件的目标始终只是最顶层的对象。 我曾尝试在对象上绑定事件,但它不会为背面的那些触发。 我曾尝试根据项目大小和高度进行选择,但旋转后无法正常工作。

var canvas = this.__canvas = new fabric.Canvas('c', {
  enableRetinaScaling: false
});

function LoopOnObjects(e) {
  var mouse = canvas.getPointer(e.e, false);
  var x = Math.ceil(mouse.x);
  var y = Math.ceil(mouse.y);

  var count = 0;
  canvas.getObjects().forEach(function(object, index){
    if(CheckObjectWithin(object, x, y)) {
        count++;
    }
  });

  alert("ya, there is " + count + " objects touch on click");
}

function CheckObjectWithin(object, x, y) {
    var objectBoundRect = object.getBoundingRect(true);
    var widthRange = objectBoundRect.width;
    var heightRange = objectBoundRect.height;

    if (x > objectBoundRect.left && x < objectBoundRect.left + widthRange) {
        if (y > objectBoundRect.top && y < objectBoundRect.top + heightRange) {
            return true;
        }
    }

    return false;
}

function GetElement(e) {
    LoopOnObjects(e);
}

canvas.on("mouse:up", GetElement);

canvas.add(new fabric.Rect({
    width: 100, height: 100, left: 100, top: 20, angle: -10,
    fill: 'rgba(0,200,0,0.5)'
  }));
canvas.add(new fabric.Rect({
    width: 50, height: 100, left: 220, top: 80, angle: 45,
    stroke: '#eee', strokeWidth: 10,
    fill: 'rgba(0,0,200,0.5)'
  }));
canvas.add(new fabric.Circle({
    radius: 50, left: 220, top: 175, fill: '#aac'
  }));

template for testing

【问题讨论】:

    标签: javascript html canvas fabricjs


    【解决方案1】:

    实际上,已经有一个库方法:fabric.Object.prototype.containsPoint()。它适用于旋转,但请记住,该点是根据边界框而不是可见形状检查的(例如,圆形仍然有一个矩形边界框)。

    var canvas = this.__canvas = new fabric.Canvas('c');
    
    function loopOnObjects(e) {
      var mouse = canvas.getPointer(e.e, false);
      var point = new fabric.Point(mouse.x, mouse.y)
      
      var count = 0;
      canvas.getObjects().forEach(function(object, index){
        if (object.containsPoint(point)) {
        	count++;
        }
      });
    }
    
    function getElement(e) {
    	loopOnObjects(e);
    }
    
    canvas.on("mouse:down", getElement);
    
    canvas.add(new fabric.Rect({
        width: 100, height: 100, left: 100, top: 20, angle: -10,
        fill: 'rgba(0,200,0,0.5)'
      }));
    canvas.add(new fabric.Rect({
        width: 50, height: 100, left: 220, top: 80, angle: 45,
        stroke: '#eee', strokeWidth: 10,
        fill: 'rgba(0,0,200,0.5)'
      }));
    canvas.add(new fabric.Circle({
        radius: 50, left: 220, top: 175, fill: '#aac'
      }));
    #c {
        border: 1px black solid;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.22/fabric.min.js"></script>
    <canvas id="c" width="500" height="300"></canvas>

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-02
    • 2012-08-01
    • 2016-12-30
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    相关资源
    最近更新 更多