কোনও এক্সটেনশন লাইব্রেরি ছাড়া, একই ক্যানভাস উপাদানটিতে একাধিক স্তর থাকা কি সম্ভব?
সুতরাং আমি যদি উপরের স্তরে একটি ক্লিয়াররেট করি তবে এটি নীচেরটিটি মুছবে না?
ধন্যবাদ।
কোনও এক্সটেনশন লাইব্রেরি ছাড়া, একই ক্যানভাস উপাদানটিতে একাধিক স্তর থাকা কি সম্ভব?
সুতরাং আমি যদি উপরের স্তরে একটি ক্লিয়াররেট করি তবে এটি নীচেরটিটি মুছবে না?
ধন্যবাদ।
উত্তর:
না, তবে, আপনি <canvas>
একে অপরের উপরে একাধিক উপাদান স্তর করতে পারেন এবং অনুরূপ কিছু অর্জন করতে পারেন।
<div style="position: relative;">
<canvas id="layer1" width="100" height="100"
style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="layer2" width="100" height="100"
style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
</div>
আপনার প্রথম স্তরটি layer1
ক্যানভাসে এবং দ্বিতীয় স্তরটি ক্যানভাসে আঁকুন layer2
। তারপরে আপনি যখন clearRect
শীর্ষ স্তরে থাকবেন তখন নীচের ক্যানভাসে যা কিছু আছে তা প্রদর্শিত হবে।
display: none;
। অথবা কেবল ক্যানভাসটি সাফ করুন, যদি স্তরটি দেখানো উচিত তখন আবার এটি পুনরায় আঁকা খুব ব্যয়বহুল না হয়।
এর সাথে সম্পর্কিত:
আপনার ক্যানভাসে যদি আপনার কিছু থাকে এবং আপনি এর পিছনে কিছু আঁকতে চান - আপনি প্রসঙ্গের সাথে যুক্ত করতে পারেন lo লোকালকম্পেশন অপারেটিং সেটিংটি 'গন্তব্য-ওভার'-এ পরিবর্তন করুন এবং তারপরে আপনি' সোর্স-ওভার 'এ ফিরে আসবেন আবার হয়ে গেল
var context = document.getElementById('cvs').getContext('2d');
// Draw a red square
context.fillStyle = 'red';
context.fillRect(50,50,100,100);
// Change the globalCompositeOperation to destination-over so that anything
// that is drawn on to the canvas from this point on is drawn at the back
// of what's already on the canvas
context.globalCompositeOperation = 'destination-over';
// Draw a big yellow rectangle
context.fillStyle = 'yellow';
context.fillRect(0,0,600,250);
// Now return the globalCompositeOperation to source-over and draw a
// blue rectangle
context.globalCompositeOperation = 'source-over';
// Draw a blue rectangle
context.fillStyle = 'blue';
context.fillRect(75,75,100,100);
<canvas id="cvs" />
আপনি canvas
ডকুমেন্টে সংযুক্ত না করে একাধিক উপাদান তৈরি করতে পারেন । এগুলি আপনার স্তরগুলি হবে :
তারপরে আপনি তাদের সাথে যা খুশি তাই করুন এবং শেষে কেবল তাদের সামগ্রীটি গন্তব্য ক্যানভাসে সঠিক ক্রমে রেন্ডার drawImage
করুন context
।
উদাহরণ:
/* using canvas from DOM */
var domCanvas = document.getElementById('some-canvas');
var domContext = domCanvas.getContext('2d');
domContext.fillRect(50,50,150,50);
/* virtual canvase 1 - not appended to the DOM */
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
ctx.fillStyle = 'blue';
ctx.fillRect(50,50,150,150);
/* virtual canvase 2 - not appended to the DOM */
var canvas2 = document.createElement('canvas')
var ctx2 = canvas2.getContext('2d');
ctx2.fillStyle = 'yellow';
ctx2.fillRect(50,50,100,50)
/* render virtual canvases on DOM canvas */
domContext.drawImage(canvas, 0, 0, 200, 200);
domContext.drawImage(canvas2, 0, 0, 200, 200);
এবং এখানে কিছু কোডেন রয়েছে: https://codepen.io/anon/pen/mQWMMW
আমারও একই সমস্যা ছিল, আমি যখন অবস্থান সহ একাধিক ক্যানভাস উপাদানগুলি করছি: নিখুঁত কাজটি করে, আপনি যদি কোনও চিত্রের মধ্যে আউটপুট সংরক্ষণ করতে চান, এটি কার্যকর হবে না।
সুতরাং আমি এগিয়ে গেলাম এবং কোডগুলিতে একটি সাধারণ লেয়ারিং "সিস্টেম" করলাম যেন প্রতিটি স্তরের নিজস্ব কোড রয়েছে তবে এটি সমস্ত একই উপাদান হিসাবে রেন্ডার হয়ে যায়।
https://github.com/federicojacobi/layeredCanvas
আমি অতিরিক্ত ক্ষমতা যুক্ত করার ইচ্ছা করি, তবে আপাতত তা করবে।
আপনি একাধিক ফাংশন করতে পারেন এবং "জাল" স্তরগুলির জন্য তাদের কল করতে পারেন।
আপনি http://www.concretejs.com যাচাইও করতে পারেন যা একটি আধুনিক, লাইটওয়েট, এইচটিএমএল 5 ক্যানভাস ফ্রেমওয়ার্ক যা হিট সনাক্তকরণ, লেয়ারিং এবং প্রচুর অন্যান্য পেরিফেরিয়াল জিনিস সক্ষম করে। আপনি এই জাতীয় জিনিসগুলি করতে পারেন:
var wrapper = new Concrete.Wrapper({
width: 500,
height: 300,
container: el
});
var layer1 = new Concrete.Layer();
var layer2 = new Concrete.Layer();
wrapper.add(layer1).add(layer2);
// draw stuff
layer1.sceneCanvas.context.fillStyle = 'red';
layer1.sceneCanvas.context.fillRect(0, 0, 100, 100);
// reorder layers
layer1.moveUp();
// destroy a layer
layer1.destroy();
আমি বুঝতে পারি যে Q একটি লাইব্রেরি ব্যবহার করতে চায় না, তবে গুগল অনুসন্ধান থেকে আগত অন্যদের জন্য আমি এটি সরবরাহ করব। @ এরিকরওয়েল একটি ভাল প্লাগইন উল্লেখ করেছেন, তবে, আপনি চেষ্টা করতে পারেন এমন আরও একটি প্লাগইন রয়েছে, এইচটিএমএল 2 ক্যানভাস ।
আমাদের ক্ষেত্রে আমরা z-index
একটি "পণ্য নির্মাতা" উইজেট হিসাবে স্তরযুক্ত স্বচ্ছ পিএনজি ব্যবহার করছি । এইচটিএমএল 2 ক্যানভাস চিত্রগুলি ঠেলাঠেলি না করে বা জটিলতা, কর্মক্ষেত্র এবং নিজেই "অ-প্রতিক্রিয়াশীল" ক্যানভাস ব্যবহার না করে স্ট্যাকটি সিদ্ধ করতে উজ্জ্বলতার সাথে কাজ করেছিল। আমরা ভ্যানিলা ক্যানভাস + জেএস সহ এই সাবলীলভাবে / বুদ্ধিমান করতে পারিনি।
z-index
আপেক্ষিক অবস্থানযুক্ত মোড়কের মধ্যে স্তরযুক্ত সামগ্রী তৈরি করতে প্রথমে পরম ডিভগুলিতে ব্যবহার করুন। তারপরে একটি রেন্ডার করা ক্যানভাস পেতে এইচটিএমএল 2 ক্যানভাসের মাধ্যমে মোড়কটি টিপুন, যা আপনি যেমন হিসাবে রেখে যেতে পারেন বা কোনও চিত্র হিসাবে আউটপুট রাখতে পারেন যাতে কোনও ক্লায়েন্ট এটি সংরক্ষণ করতে পারে।
তবে স্তর 02, সমস্ত স্তরগুলিকে স্তর 01 এ কভার করবে I আমি এটি উভয় স্তরে অঙ্কন দেখানোর জন্য ব্যবহার করেছি। শৈলীতে (ব্যাকগ্রাউন্ড-রঙ: স্বচ্ছ;) ব্যবহার করুন।
<div style="position: relative;">
<canvas id="lay01" width="500" height="500" style="position: absolute; left: 0; top: 0; z-index: 0; background-color: transparent;">
</canvas>
<canvas id="lay02" width="500" height="500" style="position: absolute; left: 0; top: 0; z-index: 1; background-color: transparent;">
</canvas>
</div>