The HTML Canvas Deep Dive book has been released as open-source. You can find the source on GitHub.
Adobe Illustrator to Canvas extension.
Some drawing functions are executed immediately (strokeRect(), fillRect(),
), while others are buffered (lineTo(), rect(),
) and drawn later using a function such as fill()
or stroke()
.
ctx.beginPath(); //Clears out the buffer for(var i=0; i < 1000; i++) { var x = Math.random() * w; var y = Math.random() * h; var width = Math.random() * w; var height = Math.random() * h; ctx.rect(x, y, width, height); // store 1000 rectangles in path/buffer } ctx.stroke(); // draws the whole buffer at once
Buffering is quicker because the shapes are stored in the graphics processor and it allows for parallel processing.
Resizing a canvas can be tricky if we don't know a few rules that might not be easily guessed:
This is a handy way to do the sizing:
addListeners(); // Event handling function addListeners() { window.addEventListener('scroll', scrollCheck); window.addEventListener('resize', resize); } function scrollCheck() { if(window.pageYOffset > canvas.height) { //Stop animation if it has scrolled off the screen. animateHeader = false; } else { if (!animateHeader) { //Kick-off the tweenLeg and animate loops if they are not running. for(var i in bees) { tweenLeg(bees[i]); } animateHeader = true; animate(); } } } function resizeCanvas() { //Size canvas to entire viewport. canvas.width = getViewport().width; canvas.height = getViewport().height; }
function drawLine(x1, y1, x2, y2, color, width) { ctx.save(); // set color and lineWidth, if these parameters // are not defined, do nothing (default values) if(color) ctx.strokeStyle = color; if(width) ctx.lineWidth = width; // start a new path ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke(); ctx.restore(); }
function drawRoundedRect(ctx,x,y,width,height,radius,fill,stroke) { ctx.save(); ctx.beginPath(); // draw top and top right corner ctx.moveTo(x+radius,y); ctx.arcTo(x+width,y,x+width,y+radius,radius); // draw right side and bottom right corner ctx.arcTo(x+width,y+height,x+width-radius,y+height,radius); // draw bottom and bottom left corner ctx.arcTo(x,y+height,x,y+height-radius,radius); // draw left and top left corner ctx.arcTo(x,y,x+radius,y,radius); if(fill) { ctx.fill(); } if(stroke){ ctx.stroke(); } ctx.restore(); }
I have a ”Flying Bees” demo that shows how to create many instances of, say a circle, and then animate them.