Im arbeiten an einem Projekt der Erstellung eines Editors, ich benutze die Fabric.js, aber ich weiß nicht, wie Sie das Canvas-Objekt automatisch ausrichten.
Gibt es ein Beispiel für die automatische Ausrichtung von Canvas-Objekten mit einem anderen Objekt?
Bild von Snap Beispiel
auto snap example from other site
Link hier:
auto snap example siteGibt es sowieso, um Leinwand Objekt automatisch ausrichten auf Fabric.js
0
A
Antwort
2
ich auf die gleiche Sache arbeitete. Das scheint eine ziemlich häufige Feature-Anfrage zu sein, also dachte ich, ich würde teilen, was ich herausgefunden habe. Es könnte etwas verfeinert werden. Zum Beispiel habe ich bemerkt, wenn Sie die rote Box skalieren, wird die Skala nicht angewendet und es wird nicht richtig ausgerichtet. Ich denke jedoch, dass es das grundlegende Prinzip gut zeigt und Sie können es auf Ihre Bedürfnisse eingehen.
(Anmerkung: 2017.08.01. Die Arbeit an GitHub ein umfassenderes Codebasis zu platzieren (https://github.com/JerrodV/FabricObjectAlignment) Weitere Details in Kürze!)
Sie die Geige sehen können here
Html:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<canvas id="c" height="600" width="600" style="border:1px solid #c1c1c1;"></canvas>
</div>
</form>
<script src="Scripts/jquery-3.1.1.min.js"></script>
<script src="Scripts/fabric.min.js"></script>
<script src="Scripts/default.js"></script>
</body>
</html>
Javascript:
Def = {
canvas: null,
rect: null,
lines: {
top: null,
left: null,
right: null,
bottom: null
},
init: function() {
Def.canvas = new fabric.Canvas('c');
Def.canvas.on('object:moving', Def.events.objectMoving);
Def.canvas.add(new fabric.Rect({
height: 100,
width: 100,
top: 100,
left: 200,
fill: 'black',
selectable: false
}));
Def.canvas.add(new fabric.Rect({
height: 100,
width: 100,
top: 300,
left: 100,
fill: 'black',
selectable: false
}));
Def.rect = new fabric.Rect({
height: 100,
width: 100,
top: 200,
left: 250,
fill: 'red'
});
Def.canvas.add(Def.rect);
},
events: {
objectMoving: function (e) {
//Get the object being manipulated
var obj = e.target;
//Set up an object representing its current position
var curPos = {
top: parseInt(obj.get('top')),
left: parseInt(obj.get('left')),
right: parseInt(obj.get('left') + obj.get('width')),
bottom: parseInt(obj.get('top') + obj.get('height'))
};
//Set up an object that will let us be able to keep track of newly created lines
var matches = {
top: false,
left: false,
right: false,
bottom: false
}
//Get the objects from the canvas
var objects = Def.canvas.getObjects();
//For each object
for (var i in objects) {
//If the object we are looing at is a line or the object being manipulated, skip it
if (objects[i] === obj || objects[i].get('type') === 'line') { continue; }
//Set up an object representing the position of the canvas object
var objPos = {
top: parseInt(objects[i].get('top')),
left: parseInt(objects[i].get('left')),
right: parseInt(objects[i].get('left') + obj.get('width')),
bottom: parseInt(objects[i].get('top') + obj.get('height'))
}
//Look at all 4 sides of the object and see if the object being manipulated aligns with that side.
//Top////////////////////////////////////
if (Def.inRange(objPos.top, curPos.top)) {
//We match. If we don't already have aline on that side, add one.
if (!Def.lines.top) {
Def.drawLine('top', objPos.top);
//Keep track of the fact we found a match so we don't remove the line prematurely.
matches.top = true;
//Snap the object to the line
obj.set('top', objPos.top).setCoords();
}
}
//Left////////////////////////////////////
if (Def.inRange(objPos.left, curPos.left)) {
if (!Def.lines.left) {
Def.drawLine('left', objPos.left);
matches.left = true;
obj.set('left', objPos.left).setCoords();
}
}
//Right////////////////////////////////////
if (Def.inRange(objPos.right, curPos.right)) {
if (!Def.lines.right) {
Def.drawLine('right', objPos.right);
matches.right = true;
obj.set('left', objPos.right - objects[i].get('width')).setCoords();
}
}
//Bottom////////////////////////////////////
if (Def.inRange(objPos.bottom, curPos.bottom)) {
if (!Def.lines.bottom) {
Def.drawLine('bottom', objPos.bottom);
matches.bottom = true;
obj.set('top', objPos.bottom - objects[i].get('height')).setCoords();
}
}
//Look at the side we matched on. If we did not match, and we have a line, remove the line.
for (var j in matches) {
var m = matches[j];
var line = Def.lines[j];
if (!m && line) {
Def.canvas.remove(line);
Def.lines[j] = null;
}
}
}
Def.canvas.renderAll();
}
},
drawLine: function (side, pos) {
var ln = null
switch (side) {
case 'top':
ln = new fabric.Line([Def.canvas.get('width'), 0, 0, 0], {
left: 0,
top: pos,
stroke: 'rgb(178, 207, 255)'
});
Def.lines.top = ln;
break;
case 'left':
ln = new fabric.Line([0, Def.canvas.get('height'), 0, 0], {
left: pos,
top: 0,
stroke: 'rgb(178, 207, 255)'
});
Def.lines.left = ln;
break;
case 'right':
ln = new fabric.Line([0, Def.canvas.get('height'), 0, 0], {
left: pos,
top: 0,
stroke: 'rgb(178, 207, 255)'
});
Def.lines.right = ln;
break;
case 'bottom':
ln = new fabric.Line([Def.canvas.get('width'), 0, 0, 0], {
left: 0,
top: pos,
stroke: 'rgb(178, 207, 255)'
});
Def.lines.bottom = ln;
break;
}
Def.canvas.add(ln).renderAll();
},
alignTolerance : 6,
inRange: function (val1, val2) {
if ((Math.max(val1, val2) - Math.min(val1, val2)) <= Def.alignTolerance) { return true; }
else { return false; }
}
};
$(Def.init);
I h Sie finden das nützlich. Viel Glück!
Verwandte Themen
- 1. Scale fabric.js leinwand objekte
- 2. Mousedown-Ereignis auf Leinwand simulieren Fabric.js
- 3. fabric.js ... wie Leinwand zum Zentrum
- 4. Fabric.js: Leinwand mit 100% Breite möglich?
- 5. Gibt es sowieso, um die Rückschreibrate von bcache
- 6. Wie kann ich Text auf der Leinwand in Fabric.js strecken?
- 7. gibt es sowieso um von Double zu BigInteger zu konvertieren?
- 8. gibt es sowieso, um Lambda-Funktion mit HTML-Inhalten aufzurufen?
- 9. Gibt es sowieso um requestLocationUpdates schnell mit GPS_PROVIDER in Android
- 10. Fabric.js animieren Objekt/Bild
- 11. Gibt es sowieso Hangouts außerhalb von Google +?
- 12. Objekt/Bild auf Leinwand zeichnen
- 13. Gibt es sowieso, um .realm Dateien auf Android zu verstecken/zu verschleiern?
- 14. Interaktive Textfelder mit Fabric.js
- 15. In asp.net gibt es sowieso was in httpcontext.Cache zu sehen?
- 16. Gibt es sowieso zusammen cobertura Berichterstattung xml Berichte zusammenzufassen?
- 17. Problem beim Ausrichten der Leinwand in Flex
- 18. Gibt es sowieso C# implizite Operatoren von F #?
- 19. Gibt es sowieso Jquery in React Komponente zu verwenden
- 20. Gibt es sowieso Änderungen an den Tastaturkürzeln in Eclipse?
- 21. Gibt es sowieso Entity Framework in .NET Core?
- 22. Gibt es sowieso eine Reduzierung der nrepl (ritz-repl) Startzeit?
- 23. Gibt es sowieso Python-Bytecode-Cache zu löschen?
- 24. Gibt es eine ansprechende Möglichkeit, Wasserzeichen mithilfe von fabric.js zum Canvas hinzuzufügen?
- 25. Gibt es in ClosedXML sowieso den Spaltenbuchstaben vom Spaltenkopfnamen?
- 26. Fabric.js ändert meine Leinwand Größe 300x150 nach der Initialisierung
- 27. Fabric.js: Wie kann man ein oder mehrere Objekte auf der Leinwand abwählen?
- 28. Gibt es sowieso das 24h Format in UIDatePicker zu verstecken
- 29. Gibt es sowieso die Speicherbelegung des Python-Prozesses zu kontrollieren?
- 30. gibt es sowieso Bilder als die Knoten in Microsoft Glee