जो मैं बनाने की कोशिश कर रहा हूं वह एक छोटा कैनवास विजेट है जो उपयोगकर्ता को गतिशील रूप से एक छवि पर आकार बनाने की अनुमति देता है और फिर उसे उस क्षेत्र से ऊपर रखता है जिसने अपनी रुचि पकड़ी है, प्रभावी रूप से यह एक प्रभावी है हाइलाइटर।गतिशील रूप से निर्मित समूह वाली वस्तु को निहित क्षेत्र में स्थानांतरित करना? (html5canvas - fabric.js)
समस्या ज़ूम फ़ंक्शन जोड़ने के साथ है, क्योंकि जब मैं छवि पर ज़ूम करता हूं तो मैं इसे सुनिश्चित करना चाहता हूं;
- गतिशील रूप से बनाए गए आकार छवि क्षेत्र के बाहर कहीं भी खींचा जाने का कोई संभावित तरीका नहीं है। (पूरा - आईएसएच, दूसरे चरण पर निर्भर करता है)
- आप पृष्ठ दृश्य से छवि को खींच नहीं सकते हैं, कैनवास क्षेत्र सफेद स्थान नहीं दिखा सकता है। छवि का हिस्सा हमेशा दिखाया जाना चाहिए, और पूरे कैनवास क्षेत्र को भरना चाहिए। (समस्या)
यहां दो उदाहरण है कि मैं तैयार किया है, जिनमें से न तो सही ढंग से काम कर रहे हैं;
First example - getBoundingRect does not update and is bound to the image
Second example - getBoundingRect does update and is bound to the grouped object
लिंक विवरण आप देख सकते हैं मुझे लगता है कि मैं इस समस्या संकुचित कर दिया है नीचे, या कम से कम कैसे getBoundingRect बर्ताव करता है के साथ स्क्रिप्ट के बीच एक महत्वपूर्ण अंतर पर ध्यान से।
पहला प्लंक ठीक काम करता प्रतीत होता है, जब तक आप कई बार ज़ूम इन करने और ज़ूम ज़ूम स्तर पर ज़ूम करने का प्रयास नहीं करते हैं, तो ऐसा लगता है कि यह कुछ बगैर लग सकता है (कुछ क्लिक और थोड़ा गड़बड़ हो सकता है, यह बहुत है असंगत)। दूसरा प्लंक बहुत चिड़चिड़ाहट है और बहुत अच्छी तरह से काम नहीं करता है।
मैं इस पर एक सप्ताह या उससे भी ज्यादा समय तक अटक गया हूं, और मैं ब्रेकिंग पॉइंट पर हूं! तो वास्तव में उम्मीद है कि कोई यह बता सकता है कि मैं क्या गलत कर रहा हूं?
पहले प्लंक के लिए नीचे कोड स्निपेट;
// creates group
var objs = canvas.getObjects();
var group = new fabric.Group(objs, {
status: 'moving'
});
// sets grouped object position
var originalX = active.left,
originalY = active.top,
mouseX = evt.e.pageX,
mouseY = evt.e.pageY;
active.on('moving', function(evt) {
group.left += evt.e.pageX - mouseX;
group.top += evt.e.pageY - mouseY;
active.left = originalX;
active.top = originalY;
originalX = active.left;
originalY = active.top;
mouseX = evt.e.pageX;
mouseY = evt.e.pageY;
// sets boundary area for image when zoomed
// THIS IS THE PART THAT DOESN'T WORK
active.setCoords();
// SET BOUNDING RECT TO 'active'
var boundingRect = active.getBoundingRect();
var zoom = canvas.getZoom();
var viewportMatrix = canvas.viewportTransform;
// scales bounding rect when zoomed
boundingRect.top = (boundingRect.top - viewportMatrix[5])/zoom;
boundingRect.left = (boundingRect.left - viewportMatrix[4])/zoom;
boundingRect.width /= zoom;
boundingRect.height /= zoom;
var canvasHeight = canvas.height/zoom,
canvasWidth = canvas.width/zoom,
rTop = boundingRect.top + boundingRect.height,
rLeft = boundingRect.left + boundingRect.width;
// checks top left
if (rTop < canvasHeight || rLeft < canvasWidth) {
group.top = Math.max(group.top, canvasHeight - boundingRect.height);
group.left = Math.max(group.left, canvasWidth - boundingRect.width);
}
// checks bottom right
if (rTop > 0 || rLeft > 0) {
group.top = Math.min(group.top, canvas.height - boundingRect.height + active.top - boundingRect.top);
group.left = Math.min(group.left, canvas.width - boundingRect.width + active.left - boundingRect.left);
}
});
// deactivates all objects on mouseup
active.on('mouseup', function() {
active.off('moving');
canvas.deactivateAll().renderAll();
})
// sets group
canvas.setActiveGroup(group.setCoords()).renderAll();
}
संपादित करें:
मैं टिप्पणी नहीं जोड़ा गया है और plunks में कोड को आसान बनाने की कोशिश की है।
प्रासंगिक कोड if (active.id == "img") {
कोड ब्लॉक के भीतर शुरू होता है।
मैंने अप्रासंगिक कोड को नीचे के कार्यों के रूप में रखा है, उन्हें बड़े पैमाने पर अनदेखा किया जा सकता है। (createNewRect()
+ preventRectFromLeaving()
)
मैंने भ्रम से बचने के लिए एक टुकड़े को हटा दिया है।
मुझे बताएं कि यह मदद करता है, या अगर मुझे आगे सरल बनाने की कोशिश करनी चाहिए।
धन्यवाद!
इस प्रत्येक उदाहरण में कोड का एक टन है। कम कोड के साथ सरल उदाहरणों में इसे उबालने का कोई तरीका? प्रत्येक में क्या हो रहा है यह बताने में बहुत मुश्किल है। – StefanHayden
@StefanHayden हो गया! कम कोड नहीं है, लेकिन मैंने चीजों को चारों ओर स्थानांतरित कर दिया है और इसे आसान बनाने की कोशिश करने के लिए टिप्पणियां जोड़ दी हैं, अगर मुझे इसे पढ़ने में आसान बनाता है तो मुझे बताएं? (प्रश्न में संपादन खंड भी जोड़ा गया) धन्यवाद! – alexc