在fabric.js画布中操作svg文件

时间:2016-03-23 12:11:45

标签: javascript jquery svg fabricjs

我正在使用fabric.js进行svg文件操作。我正在正确地将svg字符串fabric.loadSVGFromString加载到画布中。我的问题是如何操纵这个svg的某些部分。

例如,如electronic board所示,我在其上导入了一个有很多洞的电子面包棒。如何检测是否在其中一个孔上点击了鼠标?我怎么能得到点击的部分?

谢谢

2 个答案:

答案 0 :(得分:1)

我做了一个很简短的演示,你可以做些什么。 重点是创建一个可以作为单个形状导入的svg,将形状锁定在画布上,然后处理单击事件。



var canvas = new fabric.Canvas("bb");
svg = '<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.2" baseProfile="tiny" x="0in" y="0in" width="6.50331in" height="2.1in" viewBox="0 0 468.238 151.2" ><g partID="57380"><g  id="breadboardbreadboard"> <g  id="background">  <rect  fill="#D9D9D9" height="151.199" width="468.238" y="0"/> </g> <g  id="stripes"><rect  fill="#B3B0B0" height="0.4" width="468.238" y="20.932"/>  <rect  fill="#B3B0B0" height="0.4" width="468.238" y="129.475"/> </g> <g >  <rect  fill="#FF0000" height="0.4" width="468.238" y="19.2"/>  <rect  fill="#FF0000" height="0.4" width="468.238" y="148.799"/>  <rect  fill="#0000FF" height="0.4" width="468.238" y="2.4"/>  <rect  fill="#0000FF" height="0.4" width="468.238" y="132"/> </g> <g >  <rect  fill="#CCC9C9" height="7.2" width="468.238" y="71.2"/> </g> <g  id="sockets">  <g  id="pin1A">   <path  fill="#BFBFBF" d="M8.526,115.2c0,-1.322,1.072,-2.394,2.394,-2.394s2.394,1.071,2.394,2.394"/>   <path  fill="#E6E6E6" d="M13.313,115.2c0,1.322,-1.072,2.394,-2.394,2.394s-2.394,-1.071,-2.394,-2.394"/>   <circle  r="1.197" fill="#383838" cx="10.92" cy="115.2"/>  </g>  <g  id="pin1B">   <path  fill="#BFBFBF" d="M8.526,108c0,-1.322,1.072,-2.395,2.394,-2.395s2.394,1.072,2.394,2.395"/>   <path  fill="#E6E6E6" d="M13.313,108c0,1.321,-1.072,2.393,-2.394,2.393S8.526,109.322,8.526,108"/>   <circle  r="1.197" fill="#383838" cx="10.92" cy="108"/>  </g>  <g  id="pin1C">   <path  fill="#BFBFBF" d="M8.526,100.799c0,-1.321,1.072,-2.393,2.394,-2.393s2.394,1.071,2.394,2.393"/>   <path  fill="#E6E6E6" d="M13.313,100.799c0,1.322,-1.072,2.395,-2.394,2.395s-2.394,-1.072,-2.394,-2.395l0,0"/>   <circle  r="1.197" fill="#383838" cx="10.92" cy="100.8"/>  </g></g></g></svg>';


fabric.loadSVGFromString(svg, function(objs) {
  var obj;
  for(var i = 0; i < objs.length; i++) {
    obj = objs[i];
    obj.lockMovementX = true;
    obj.lockMovementY = true;
    obj.hasControls= false;
    canvas.add(obj);
  }});

canvas.on("object:selected", function(evt) {
  var id = evt.target.id;
  if (id.slice(0,3) == 'pin') {
    alert(id.slice(3,5));
  }
});
&#13;
<script src="http://www.deltalink.it/andreab/fabric/fabric.js"></script>
<canvas width="600" height="400" id="bb" ></canvas>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

一种方法是:

  • 首先,您必须在面包板图像上存储每个孔的一系列坐标
  • 将背景图像循环加载到该数组中的每个条目之后,并在相应的孔上创建一个形状(例如,fabric.Circle
  • 创建形状后立即
  • mousedown事件处理程序附加到此形状
  • 在该事件处理程序中执行您的点击处理

以下是一些可以帮助您的参考资料: