कपड़े में, मैं एक दृश्य बनाना चाहता हूं जिसमें माउस के नीचे ऑब्जेक्ट जेड-इंडेक्स में दृश्य के शीर्ष पर उगता है, फिर एक बार जब माउस उस ऑब्जेक्ट को छोड़ देता है, तो यह वापस जाता है जेड-इंडेक्स में जहां से आया था। कोई object.zindex (जो अच्छा होगा) सेट नहीं कर सकता है। इसके बजाए, मैं प्लेसहोल्डर ऑब्जेक्ट का उपयोग कर रहा हूं जिसे पुरानी स्थिति में ऑब्जेक्ट सूची में रखा गया है, और फिर पुरानी ऑब्जेक्ट को उस स्थिति में वापस रखा जाता है जहां यह कैनवास.इनर्टएट का उपयोग कर सूची में था। हालांकि यह काम नहीं कर रहा है।Fabric.js में नियंत्रण जेड-इंडेक्स
इस स्थिति के लिए http://jsfiddle.net/rFSEV/ देखें।
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();
जेड-इंडेक्स को नियंत्रित करने के लिए फैब्रिक में 4 तरीके हैं: लाने के लिए फॉरवर्ड (1 लेवल अप), लाने के लिए टॉफ्रंट (सभी तरह से ऊपर), भेजें बैकवर्ड (1 लेवल डाउन), और sendToBack (सभी तरह से नीचे) भेजें। उन्हें ऑब्जेक्ट पर सीधे या कैनवास (वांछित ऑब्जेक्ट पास करने) पर बुलाया जा सकता है। – kangax
यह अच्छी जानकारी है, लेकिन क्या आप कह रहे हैं कि सम्मिलित है इसका ज़ेड-इंडेक्स पर कोई प्रभाव नहीं पड़ता है? (तब सम्मिलित करने का उद्देश्य क्या है?)। इसके अलावा यदि उन 4 विधियों का एकमात्र विकल्प है, तो हमें भेजना होगा बैकवर्ड्स एन बार: कहें, इसे जेड-इंडेक्स 105 से 55 तक ले जाने के लिए, हमें इसे लूप में 50 बार कॉल करना होगा, जो स्पष्ट रूप से प्रत्येक को दोबारा हटा देगा पहर। वह पागलपन जटिल है। – Ian
'insertAt' भी काम करना चाहिए। यह सही जगह पर ऑब्जेक्ट डालने के लिए बिल्कुल सही है। हालांकि, इसका उपयोग कैनवास पर नई वस्तुओं को जोड़ने के लिए किया जाता है। मौजूदा वस्तुओं के जेड-इंडेक्स को बदलने के लिए, आप या तो उन 4 विधियों का उपयोग कर सकते हैं या सीधे 'canvas._objects' सरणी संशोधित कर सकते हैं। जेड-इंडेक्स बस उस सरणी में ऑब्जेक्ट्स की अनुक्रमणिका के समान है (0 पहले प्रस्तुत किया गया, फिर 1, फिर 2, और इसी तरह) – kangax