2013-01-03 12 views
11

In fabricjs möchte ich eine Szene erstellen, in der das Objekt unter der Maus im Z-Index an den Anfang der Szene steigt. Sobald die Maus das Objekt verlässt, geht es zurück zum Z-Index, woher es kam. Man kann object.zindex nicht einstellen (was nett wäre). Stattdessen verwende ich ein Platzhalterobjekt, das an der alten Position in die Objektliste eingefügt wird, und dann wird das alte Objekt mit canvas.insertAt an die Position zurückgesetzt, an der es sich in der Liste befand. Dies funktioniert jedoch nicht.Kontroll-Z-Index in Fabric.js

Siehe http://jsfiddle.net/rFSEV/ für den Status dieser.

var canvasS = new fabric.Canvas('canvasS', { renderOnAddition: false, hoverCursor: 'pointer', selection: false }); 
var bars = {}; //storage for bars (bar number indexed by group object) 
var selectedBar = null; //selected bar (group object) 
var placeholder = new fabric.Text("XXXXX", { fontSize: 12 }); 

//pass null or a bar 
function selectBar(bar) { 
    if (selectedBar) { 
     //remove the old topmost bar and put it back in the right zindex 
     //PROBLEM: It doesn't go back; it stays at the same zindex 
     selectedBar.remove(); 
     canvasS.insertAt(selectedBar, selectedBar.XZIndex, true); 
     selectedBar = null; 
     } 
    if (bar) { 
     //put a placeholder object ("XXX" for now) in the position 
     //where the bar was, and put the bar in the top position 
     //so it shows topmost 
     selectedBar = bar; 
     canvasS.insertAt(placeholder, selectedBar.XZIndex, true); 
     canvasS.add(bar); 
     canvasS.renderAll(); 
     } 
    } 

canvasS.on({ 
    'mouse:move': function(e) { 
     //hook up dynamic zorder 
     if (!e.target) return; 
     if (bars[e.target]) 
      selectBar(e.target); 
     else 
      selectBar(null); 
     }, 
    }); 

var objcount = canvasS.getObjects().length; 

//create bars 
for (var i = 0; i < 20; ++i) { 
    var rect = new fabric.Rect({ 
     left: 0, 
     top: 0, 
     rx: 3, 
     ry: 3, 
     stroke: 'red', 
     width: 200, 
     height: 25 
    }); 
    rect.setGradientFill({ 
     x1: 0, 
     y1: 0, 
     x2: 0, 
     y2: rect.height, 
     colorStops: { 
     0: '#080', 
     1: '#fff' 
     } 
    });  
    var text = new fabric.Text("Bar number " + (i+1), { 
     fontSize: 12 
    }); 
    var group = new fabric.Group([ rect, text ], { 
     left: i + 101, 
     top: i * 4 + 26 
    }); 
    group.hasControls = group.hasBorders = false; 

    //our properties (not part of fabric) 
    group.XBar = rect; 
    group.XZIndex = objcount++; 

    canvasS.add(group); 
    bars[group] = i; 
    } 
canvasS.renderAll(); 
+3

Es gibt 4 Methoden in Fabric, um den Z-Index zu steuern: bringForward (1 Ebene höher), bringToFront (ganz oben), sendBackwards (1 Ebene runter) und sendToBack (ganz unten). Sie können alle auf dem Objekt direkt oder auf der Leinwand (passierendes gewünschtes Objekt) aufgerufen werden. – kangax

+0

Das sind gute Informationen, aber sagen Sie, dass insertAt keine Auswirkung auf den Z-Index hat? (Was ist der Zweck von insertAt dann?). Auch wenn diese 4 Methoden die einzige Option wären, müssten wir sendBackwards N-mal aufrufen: Sagen wir, um es vom z-Index 105 auf 55 zu verschieben, müssten wir es 50 mal in einer Schleife aufrufen, was jeden neu zeichnen würde Zeit. Das ist verrückt komplex. – Ian

+1

'insertAt' sollte auch funktionieren. Es ist genau das Objekt an der richtigen Stelle einzufügen. Es wird jedoch zum Hinzufügen neuer Objekte auf der Leinwand verwendet. Um den Z-Index bestehender Objekte zu ändern, können Sie entweder diese 4 Methoden verwenden oder das Array 'canvas._objects' direkt modifizieren. Z-Index ist einfach der gleiche wie der Index von Objekten in diesem Array (0 zuerst gerendert, dann 1, dann 2 usw.) – kangax

Antwort

18

Seit fabric.js Version 1.1.4 eine neue Methode zur zIndex Manipulation steht zur Verfügung:

canvas.moveTo(object, index); 
object.moveTo(index); 

Ich denke, das für Ihren Anwendungsfall hilfreich. Ich habe Ihre jsfiddle aktualisiert - ich hoffe, das ist, was Sie wollen:
jsfiddle

+1

Siehe auch https://github.com/kangax/fabric.js/issues/135 um den aktuellen zIndex zu erhalten. –

+8

Außerdem: 'bringToFront',' sendToBack', 'bringForward',' sendBackwards' –

5

Auch stellen Sie sicher, dass z-Index nach dem Hinzufügen Objekt Leinwand ändern.

So Code wie folgt aussieht:

canvas.add(object); 
canvas.moveTo(object, index); 

Ansonsten fabricjs don`t Sorge um z-Indizes Sie Setup.