Normalmente è possibile ottenere una posizione dell'oggetto relativa al canvas dagli attributi .left
e .top
, ma questi diventano relativi al gruppo se l'oggetto si trova in una selezione/gruppo. C'è un modo per ottenere la loro posizione rispetto alla tela?Come ottenere la posizione relativa alla tela di un oggetto che si trova in un gruppo?
risposta
Quando un oggetto è all'interno di un gruppo, le sue coordinate relative alla tela dipenderà l'origine del gruppo (e origine dell'oggetto)
Diciamo che abbiamo questo codice che ha un rettangolo e un cerchio aggiunti a un gruppo.
var canvas = new fabric.Canvas(document.getElementById('c'));
var rect = new fabric.Rect({
width: 100,
height: 100,
left: 50,
top: 50,
fill: 'rgba(255,0,0,0.5)'
});
var circle = new fabric.Circle({
radius: 50,
left: 175,
top: 75,
fill: '#aac'
});
var group = new fabric.Group([rect, circle],{
originX: 'center',
originY: 'center'
});
canvas.add(group);
canvas.renderAll();
Questi sono i tre casi possibili di centraggio del gruppo:
originaria del gruppo impostato al centro (come nel codice sopra):
Come mostrato in figura,
rect.left
ci dà la distanza di sinistra dell'oggetto dal centro del gruppo.rect.group.left
indica la distanza del centro del gruppo dalla parte sinistra della tela.Così distanza di rect da sinistra di tela =
rect.left + rect.group.left
(http://jsfiddle.net/uue3hcj6/3/)Origine del gruppo è impostato in alto/sinistra (anche l'impostazione di default)
rect.left
ci dà distanza di sinistra dell'oggetto dal centro del gruppo.rect.group.left
ci dà la distanza di sinistra del gruppo dalla sinistra della tela. Ora per calcolare la distanza rimanente, dobbiamo aggiungere metà della larghezza del gruppo.Così distanza di rect da sinistra di tela =
rect.left + rect.group.left
+rect.group.width/2
(http://jsfiddle.net/uue3hcj6/6/)Origine del gruppo è impostato su basso/a destra
rect.left
ci dà distanza di sinistra dell'oggetto dal centro del gruppo.rect.group.left
indica la distanza del diritto del gruppo dalla parte sinistra della tela. Ora per calcolare la distanza totale, dobbiamo sottrarre la metà della larghezza del gruppo.Così distanza di rect da sinistra di tela =
rect.left + rect.group.left
-rect.group.width/2
(http://jsfiddle.net/uue3hcj6/7/)
Nota: Casi simili sono possibili per oggetto pure.
Eccellente, grazie @SwapnilJain –
Finalmente qualcuno ha spiegato tutta quella "magia" di fabricjs, grazie. – Kath
Non capisco qualcosa però. Nel tuo primo esempio se cambiamo la sinistra del cerchio, per esempio, e aggiungiamo l'angolo al gruppo, anche la posizione del rettangolo è cambiata! Sto provando a sistemare tutti gli oggetti all'interno del gruppo e ruotare il gruppo stesso attorno al suo centro, ma per qualche motivo tutti gli oggetti che si muovono non sono fissi e non riesco a capire perché. – Kath
La soluzione è prendere in considerazione la larghezza del gruppo. Il object.left
è relativamente al centro del gruppo, non è lasciato lato, in modo da prendere group.width/2
:
var canvas = new fabric.Canvas(document.getElementById('c'));
var rect = new fabric.Rect({
width: 100,
height: 100,
left: 50,
top: 50,
fill: 'rgba(255,0,0,0.5)'
});
var circle = new fabric.Circle({
radius: 50,
left: 150,
top: 75,
fill: '#aac'
});
canvas.add(rect);
canvas.add(circle);
canvas.renderAll();
function getPOS(){
var group = canvas.getActiveGroup();
if (group == null) {
var pos = rect.left;
}
else {
var pos = rect.group.left + rect.group.width/2 + rect.left;
}
alert("Position of rect from left:"+pos);
}
dovuto risolvere la questione con un altro approccio ... ho dovuto trovare immagini in dati di tela JSON, quindi il mio codice è:
let findItemByType = function(source, type, rX, rY)
{
rX = rX ? rX : 0;
rY = rY ? rY : 0;
let objs = [];
source.forEach(function(item){
if (item.type === type){
item.rX = rX + item.left;
item.rY = rY + item.top;
objs.push(item);
}
else {
if (item.objects)
{
item.rX = rX;
item.rY = rY;
let subresult = findItemByType(item.objects,
type,
item.rX + item.left + item.width/2,
item.rY + item.top + item.height/2);
if (subresult){
objs = objs.concat(subresult);
}
}
}
});
return objs;
}
let images = findItemByType(canvas.toJSON().objects, "image", 0, 0);
Questo codice dovrebbe portare una matrice di tutti gli oggetti di immagine e dovrebbe avere attributi rX e rY che sono posizioni relative delle immagini.
- 1. Ottenere la posizione dell'annotazione relativa alla schermata
- 2. Come si trova la posizione di un controllo/finestra Win32 in relazione alla finestra principale?
- 3. Come ottenere la posizione di un oggetto rispetto alla finestra in iOS?
- 4. Come liberare un oggetto che si trova in un record?
- 5. Postgres: trova la posizione di una riga specifica all'interno di un gruppo di risultati?
- 6. In che modo l'operatore di cancellazione C++ trova la posizione di memoria di un oggetto polimorfico?
- 7. utilizzando jQuery per ottenere la posizione di posizione assoluta o relativa di un div
- 8. Come ottenere la posizione globale/mondiale di un oggetto figlio?
- 9. Come posso ottenere la posizione corrente di un oggetto MenuBarra?
- 10. jaxws-maven-plugin che risolve la posizione WSDL relativa alla posizione della classe, perché?
- 11. posizione: relativa che appare sopra la posizione: assoluta
- 12. Come ottenere la posizione assoluta di un vertice in three.js?
- 13. come estrarre un oggetto JSON che si trova all'interno di un oggetto JSON
- 14. Trova la posizione di un elemento all'interno di un elenco
- 15. ottenere la posizione del mouse con javascript all'interno di tela
- 16. Come ottenere la posizione dello schermo di un elemento Swing?
- 17. Come si trova il PHID di un oggetto di Phabricator?
- 18. Come ottenere la posizione di un elemento in uno StackPanel?
- 19. Trova la dimensione di un oggetto polimorfico
- 20. Un div con posizione relativa su un galleggiante div
- 21. Come si trova la posizione di un cursore in una casella di testo? C#
- 22. ottenere la posizione corrente da un XmlReader
- 23. Come ottenere la posizione (src) di un file javascript?
- 24. Trova l'elemento html più vicino alla posizione (relativo o assoluto)
- 25. Come ottenere le coordinate di un oggetto in una tela tkinter?
- 26. Come ottenere la visualizzazione di un oggetto in listview in Android?
- 27. CSS: Mantenere di un div altezza relativa alla sua larghezza
- 28. Come cambiare la posizione della tela in Unity?
- 29. posizione relativa e destra
- 30. Come si trova la posizione dello schermo di un controllo in silverlight su WP7?
È questo quello che stai cercando? http://jsfiddle.net/uue3hcj6/3/ Come hai detto che diventano relativi al gruppo, puoi usare il gruppo a sinistra e in alto per trovare la posizione assoluta sulla tela. –
Questo non sembra funzionare con le selezioni: http://jsfiddle.net/uue3hcj6/4/ –
@SwapnilJain Sai perché i valori nel secondo non funzionano? –