fabric.js直线并点击选择

时间:2016-01-26 15:03:41

标签: fabricjs

我为这段代码制作了3种模式:

  1. 选择行
  2. 画线和
  3. 删除行。
  4. 看起来它正在发挥作用。但我想改变两件事。 例如,每当我选择一条线时,我只需要点击它。

    你能告诉我如何改进我的代码吗?

    感谢您的回答。

    这是我的代码:

    <!DOCTYPE html>
    <html>
    <head>
     <script type ="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
     <script type ="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <title>Test</title>
    </head>
    <body>
    <button id="select">Selection mode</button>
    <button id="draw">Drawing mode</button>
    
    <button id="delete">Delete selected object(s)</button><br />
    <canvas id="c" width="400" height="400" style="border:1px solid #ccc"></canvas>
    
    <script type="text/javascript">
    var line, isDown,mode;
    
    var canvas = new fabric.Canvas('c');
    
    $("#select").click(function(){
        mode="select";   
             canvas.selection=true;
         canvas.perPixelTargetFind = true;
         canvas.targetFindTolerance = 4;
         canvas.renderAll();
    });
    $("#draw").click(function(){
        
         
        mode="draw";
    });
    $("#delete").click(function(){
        
        
        deleteObjects();
    });
    
    // Adding objects to the canvas...
    
     
    canvas.on('mouse:down', function(o){
      isDown = true;
      var pointer = canvas.getPointer(o.e);
      var points = [ pointer.x, pointer.y, pointer.x, pointer.y ];
       
      if(mode=="draw"){
        line = new fabric.Line(points, {
        strokeWidth: 5,
        fill: 'red',
        stroke: 'red',
        originX: 'center',
        originY: 'center',
    
      });
      canvas.add(line);}
    });
     
    canvas.on('mouse:move', function(o){
      if (!isDown) return;
      var pointer = canvas.getPointer(o.e);
      
      if(mode=="draw"){
      line.set({ x2: pointer.x, y2: pointer.y });
      canvas.renderAll(); }
    });
    
    canvas.on('mouse:up', function(o){
      isDown = false;
    });
    
      
    
    // select all objects
    function deleteObjects(){
        var activeObject = canvas.getActiveObject(),
        activeGroup = canvas.getActiveGroup();
        if (activeObject) {
            if (confirm('Are you sure?')) {
                canvas.remove(activeObject);
            }
        }
        else if (activeGroup) {
            if (confirm('Are you sure?')) {
                var objectsInGroup = activeGroup.getObjects();
                canvas.discardActiveGroup();
                objectsInGroup.forEach(function(object) {
                canvas.remove(object);
                });
            }
        }
    }
    </script>
    </body>
    </html>

    Ps。:抱歉英语不好或错误。

2 个答案:

答案 0 :(得分:7)

在画布中添加一行时,通常可以选择。 但是,由于你修改了它自己的属性,如宽度和高度,这些属性来自2个点,它的宽度和高度都会改变。

如果您以编程方式更改维度,则必须明确调用line.setCoords(),否则不会再次计算交互点。

perPixelTargetFind是可选的,每次进入选择模式时都不需要调用它。

所以答案是:

在你的mouseup事件中调用line.setCoords()。

检查摘录。

&#13;
&#13;
<!DOCTYPE html>
<html>
<head>
 <script type ="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
 <script type ="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<title>Test</title>
</head>
<body>
<button id="select">Selection mode</button>
<button id="draw">Drawing mode</button>

<button id="delete">Delete selected object(s)</button><br />
<canvas id="c" width="400" height="400" style="border:1px solid #ccc"></canvas>

<script type="text/javascript">
var line, isDown,mode;

var canvas = new fabric.Canvas('c');
     canvas.perPixelTargetFind = true;
     canvas.targetFindTolerance = 4;

$("#select").click(function(){
    mode="select";   
    canvas.selection=true;
    canvas.renderAll();
});
$("#draw").click(function(){
    
     
    mode="draw";
});
$("#delete").click(function(){
    
    
    deleteObjects();
});

// Adding objects to the canvas...

 
canvas.on('mouse:down', function(o){
  isDown = true;
  var pointer = canvas.getPointer(o.e);
  var points = [ pointer.x, pointer.y, pointer.x, pointer.y ];
   
  if(mode=="draw"){
    line = new fabric.Line(points, {
    strokeWidth: 5,
    fill: 'red',
    stroke: 'red',
    originX: 'center',
    originY: 'center',

  });
  canvas.add(line);}
});
 
canvas.on('mouse:move', function(o){
  if (!isDown) return;
  var pointer = canvas.getPointer(o.e);
  
  if(mode=="draw"){
  line.set({ x2: pointer.x, y2: pointer.y });
  canvas.renderAll(); }
});

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

  

// select all objects
function deleteObjects(){
    var activeObject = canvas.getActiveObject(),
    activeGroup = canvas.getActiveGroup();
    if (activeObject) {
        if (confirm('Are you sure?')) {
            canvas.remove(activeObject);
        }
    }
    else if (activeGroup) {
        if (confirm('Are you sure?')) {
            var objectsInGroup = activeGroup.getObjects();
            canvas.discardActiveGroup();
            objectsInGroup.forEach(function(object) {
            canvas.remove(object);
            });
        }
    }
}
</script>
</body>
</html>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

我认为在您创建该行的代码中,您可以将其更改为以下内容,以便您在单击时选择该行

试试这个jsfiddle

  if(mode=="draw"){
line = new fabric.Line(points, {
strokeWidth: 5,
fill: 'red',
stroke: 'red',
originX: 'center',
originY: 'center',
selectable: true,
targetFindTolerance: true
}