Czy istnieje sposób na warstwowanie obiektów na płótnie Fabric.js za pośrednictwem oficjalnego interfejsu API? W tej chwili jedynym sposobem, jaki udało mi się to zrobić, jest ręczne wykonanie iteracji w canvas._objects i uporządkowanie ich tak, aby były rysowane w określonej kolejności. Czy istnieje lepszy sposób na zrobienie tego, który nie (potencjalnie) nie złamie obiektu?Układanie obiektów canvas w Fabric.js
Odpowiedz
[Edytuj] Poprawiłem moje informacje poniżej (moje złe, początkowo myślałem o api KineticJs).
FabricJS ma następujące metody API, które zmieniają kolejność nakładania obiektów:
canvas.sendBackwards(myObject)
canvas.sendToBack(myObject)
canvas.bringForward(myObject)
canvas.bringToFront(myObject)
pod przykryciem, FabricJs zmienia kolejność nakładania przez usunięcie obiektu z getObjects() Tablica oraz do łączenia go z powrotem żądana pozycja. Ma ładną optymalizację, która sprawdza przecinające się obiekty.
bringForward: function (object) {
var objects = this.getObjects(),
idx = objects.indexOf(object),
nextIntersectingIdx = idx;
// if object is not on top of stack (last item in an array)
if (idx !== objects.length-1) {
// traverse up the stack looking for the nearest intersecting object
for (var i = idx + 1, l = this._objects.length; i < l; ++i) {
var isIntersecting = object.intersectsWithObject(objects[i]) ||
object.isContainedWithinObject(this._objects[i]) ||
this._objects[i].isContainedWithinObject(object);
if (isIntersecting) {
nextIntersectingIdx = i;
break;
}
}
removeFromArray(objects, object);
objects.splice(nextIntersectingIdx, 0, object);
}
this.renderAll();
},
krok 1: Można użyć preserveObjectStacking: true
Krok 2: użyj sendtoback, sendtofront .... fabricjs opcje jak poniżej
Jeśli chcesz ustawić specyficzny porządkowanie wszystkich obiektów, zamiast przesuwania jednego obiektu do przodu/do tyłu, iteracyjne wywołania do wywołania/wysłania do przodu/do tyłu są powolne.
Można użyć kodu z bringToFront
jako inspiracji, aby przyspieszyć ten przypadek zużyć: https://github.com/kangax/fabric.js/blob/586e61dd282b22c1d50e15c0361875707e526fd8/src/static_canvas.class.js#L1468
I to zrobić:
fabric.Canvas.prototype.orderObjects = function(compare) {
this._objects.sort(compare);
this.renderAll();
}
Gdzie porównania określa sortowania, jak:
function compare(x,y) {
return x.getWidth() * x.getHeight() < y.getWidth() * y.getHeight();
}
some_canvas.orderObjects(compare)
Jeśli chcesz przynieść mniejsze przedmioty z przodu.
- 1. Czy mamy zmodyfikowane wydarzenie canvas w Fabric.js?
- 2. Jak wyłączyć punkty skalowania elementów canvas za pomocą pliku fabric.js?
- 3. Układanie pojedynczych obiektów JSON-LD
- 4. fabric.js ... jak centrum płótna
- 5. Układanie dwóch obrazów Canvas "jedna nad drugą + kliknięcie zdarzenia
- 6. Skala fabric.js obiekty na płótnie
- 7. Jak programowo zaznaczyć obiekt Fabric.js
- 8. Fabric.js: płótno o 100% szerokości możliwe?
- 9. Control z-index w Fabric.js
- 10. Układanie bitmapy na płótnie
- 11. Układanie elementów kolekcji w siatce
- 12. Implementacja i układanie kombinatoryki
- 13. Układanie tablelayoutów z Androidem
- 14. jak ustawić kontrast i nasycenie za pomocą fabric.js
- 15. układanie w stosy w teorii grafów
- 16. HTML5 canvas zaawansowany ramy
- 17. addEventListener w tagu Canvas
- 18. td układanie bez użycia css
- 19. Automatyczne układanie za pomocą initWithFrame?
- 20. Układanie wideo HTML5 na iPadzie
- 21. Graphviz: Układanie pól w pionie wewnątrz podramka
- 22. Układanie i określanie subskrybentów w module UIViewController
- 23. układanie wielu cech w akka Aktorzy
- 24. Układanie UIViews z trybami mieszania w iOS
- 25. Wydajność Fabric.js Sprite Sprite vs Pojedyncze obrazy
- 26. Fabric.js - zmiana koloru/wypełnienia/suwu importowanego svg
- 27. Zdobądź obiekt canvas podczas korzystania z tkaniny js
- 28. Rysowanie linii przerywanej za pomocą pliku fabric.js
- 29. Ruch jpeg w html5 canvas
- 30. Czy mogę używać elementów HTML5 Canvas lub CSS3 Sprites do animowania obiektów w grze?
Dziękujemy! To oszczędza mi wielu kłopotów. – Zwade
czy fabricjki mają wbudowany system indeksowania stosu obiektów ... wtedy mógłbym zrobić coś takiego jak 'var idx = some_object.get_zIndex()' – dsdsdsdsd
Możesz otrzymać indeks z: canvas.getObjects(). IndexOf (some_object) . Dostępne są cztery komendy do zmiany kolejności układania: some_object.sendBackwards(), some_object.sendToBack(), some_object.bringForward() i some_object.bringToFront(). – markE