2015-09-24 18 views
6

Pracuję nad aplikacją fabricjs & Potrzebuję ustawić wewnątrz obrysu na obiekt, to znaczy zastosować obrys do obiektu bez zwiększania jego rozmiaru.Czy mogę ustawić wewnątrz skoku w tkaninie js

np gdybym zastosować strokeWidth 20 do 100 * 100 rect to jest to wielkość jest również zwiększenie, ale chcę, jeśli skok jest zastosowanie do obiektów następnie rozmiar będzie również pozostają takie same

var recta = new fabric.Rect({ 
 
     left: 10, 
 
     top: 10, 
 
     fill: '#000', 
 
     width: 100, 
 
     height: 100, 
 
     
 
    }); 
 

 
var rectb = new fabric.Rect({ 
 
     left: 150, 
 
     top: 10, 
 
     fill: '#000', 
 
     width: 100, 
 
     height: 100, 
 
     
 
    }); 
 
    canvas.add(recta, rectb); 
 
rectb.set('stroke', '#f00'); 
 
rectb.set('strokeWidth', 20); 
 
canvas.renderAll();
<script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<canvas style="border:#000 1px solid" id="design-canvas" width="500" height="400"> 
 
<script type="text/javascript"> 
 
canvas = new fabric.Canvas('design-canvas'); 
 
    </script>

Czy istnieje jakikolwiek sposób, aby zastosować podstęp lub udaru bez zwiększ rozmiar

z góry dzięki

Odpowiedz

2

As podsumowując, że byłby to po prostu dla prostokątów, Najlepszym sposobem byłoby zbyt 4-liniowe aktualizowanie pozycji w oparciu o te prostokąty x, y, szerokość i wysokość. Następnie możesz ustawić szerokość obrysu tych linii osobno.

Innym sposobem byłoby zbyt proste zmienienie elementu będącego właścicielem. Spójrz na to JSFiddle.

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: 1, 
    strokeWidth: 5, 
    stroke: 'red', 
    selectable: false, 
    originX: 'center', originY: 'center' 
    }); 
    canvas.add(circle); 
}); 

canvas.on('mouse:move', function(o){ 
    if (!isDown) return; 
    var pointer = canvas.getPointer(o.e); 
    circle.set({ radius: Math.abs(origX - pointer.x) }); 
    canvas.renderAll(); 
}); 

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

@rtawr, na prostokącie można to zrobić, ale co możemy zrobić w przypadku innych kształtów, takich jak okrąg, trójkąt SVG i SVG itp – Dinesh

+0

Dla nie jestem pewien, ale dla okręgu lub trójkąta byłoby tak samo jak w przypadku prostokąta, utwórz zestaw linii, które będą działać jako "obramowanie" kształtu. W przypadku koła konieczne jest przybliżenie go jako zestawu linii. W przypadku SVG można z grubsza utworzyć inną wersję SVG pod oryginałem, powiększyć o wartość skalowaną i ustawić kolor na kolor ramki Nie byłoby to jednak doskonałe rozwiązanie. –