繁体   English   中英

选择最接近鼠标单击的对象

[英]Choose closest object to mouse click

我想找到最接近鼠标单击位置的对象。

那可能吗 ?

我的物体很小,例如DOT。 所以我无法选择它们,我想可能是我可以找到最接近鼠标单击位置的对象。

有什么办法找到它吗?

var canvas = new fabric.Canvas('c', { selection: false });
var circle, isDown, origX, origY;

    canvas.on('mouse:down', function(o){
      isDown = true;
      var pointer = canvas.getPointer(o.e);
      origX = pointer.x;
      origY = pointer.y;
      circle = new fabric.Circle({
        left: pointer.x,
        top: pointer.y,
        radius: 10,
        fill: 'red',
        selectable: false,
        originX: 'center', originY: 'center',
      });
      canvas.add(circle);
      canvas.renderAll();
    });

    canvas.on('mouse:up', function(o){
      isDown = false;
    });

您可以从canvas._object获取最近的对象。 mouse:move事件上。

  for ( i = 0; i < canvas._objects.length; i++){
    if(Math.pow(canvas._objects[i].left - origX,2) + Math.pow(canvas._objects[i].top - origY,2) < minLength){
       minObj = canvas._objects[i];
       minLength = Math.pow(canvas._objects[i].left - origX,2) + Math.pow(canvas._objects[i].top - origY,2);
    }
  }

全代码段

 var canvas = new fabric.Canvas('canvas', { selection: false }); var circle, isDown, origX, origY; canvas.on('mouse:down', function(o){ isDown = true; var pointer = canvas.getPointer(oe); origX = pointer.x; origY = pointer.y; circle = new fabric.Circle({ left: pointer.x, top: pointer.y, radius: 10, fill: 'red', selectable: false, originX: 'center', originY: 'center', }); canvas.add(circle); canvas.renderAll(); }); canvas.on('mouse:move', function(o){ var minLength = 10000000; var minObj = null; var pointer = canvas.getPointer(oe); origX = pointer.x; origY = pointer.y; for ( i = 0; i < canvas._objects.length; i++){ if(Math.pow(canvas._objects[i].left - origX,2) + Math.pow(canvas._objects[i].top - origY,2) < minLength){ minObj = canvas._objects[i]; minLength = Math.pow(canvas._objects[i].left - origX,2) + Math.pow(canvas._objects[i].top - origY,2); } } for ( i = 0; i < canvas._objects.length; i++){ if(canvas._objects[i] == minObj){ canvas._objects[i].set({fill: 'blue'}); }else{ canvas._objects[i].set({fill: 'red'}); } } canvas.renderAll(); }); canvas.on('mouse:up', function(o){ isDown = false; }); canvas.add(new fabric.Circle({ left: 10, top: 10, radius: 10, fill: 'red', selectable: false, originX: 'center', originY: 'center', })); canvas.add(new fabric.Circle({ left: 100, top: 100, radius: 10, fill: 'red', selectable: false, originX: 'center', originY: 'center', })); canvas.renderAll(); 
 <canvas id="canvas" width="800" height="600"></canvas> <script src = "https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.4.0/fabric.min.js"></script> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM