topical media & game development
#javascript-code-07-clock.htm / htm
<html>
<head>
<title>Canvas Clock Demo</title>
<script>
// Wait for the browser to load
window.onload = function() {
// Draw the clock
clock();
// and re-draw the clock every second thereafter
setInterval(clock, 1000);
};
function clock() {
// Get the current date and time
var now = new Date();
var sec = now.getSeconds();
var min = now.getMinutes();
var hr = now.getHours();
hr = hr >= 12 ? hr - 12 : hr;
// Get the drawing context of the canvas element
var ctx = document.getElementById('canvas').getContext('2d');
ctx.save();
// Initalize the drawing canvas
ctx.clearRect(0,0,150,150);
// When we draw at 0,0 we're actually drawing at 75,75
ctx.translate(75,75);
// Drawing a 100px line actually draws a 40px line
ctx.scale(0.4,0.4);
// Start the cursor rotated at 12:00
ctx.rotate(-Math.PI/2);
// Initalize the drawing properties
ctx.strokeStyle = "black";
ctx.fillStyle = "black";
ctx.lineWidth = 8;
ctx.lineCap = "round";
// Hour marks
ctx.save();
ctx.beginPath();
// For each hour
for ( var i = 0; i < 12; i++ ) {
// Rotate the canvas 1/12th of the way
// (remember: A circle = 2 * PI)
ctx.rotate(Math.PI/6);
// Move the cursor to near the outside of the canvas
ctx.moveTo(100,0);
// and draw a short (20px) tick
ctx.lineTo(120,0);
}
ctx.stroke();
ctx.restore();
// Minute marks
ctx.save();
// These ticks will be lighter than the hours
ctx.lineWidth = 5;
ctx.beginPath();
// For each minute
for ( var i = 0; i < 60; i++ ) {
// except for the minutes that are 'on the hour'
if ( i % 5 != 0 ) {
// Move the cursor farther out
ctx.moveTo(117,0);
// And draw a short (3px) line
ctx.lineTo(120,0);
}
// Rotate the canvas 1/60th of the way around
ctx.rotate(Math.PI/30);
}
ctx.stroke();
ctx.restore();
// Draw Hour Hand
ctx.save();
// Rotate the canvas to the correct position
ctx.rotate( (Math.PI/6) * hr + (Math.PI/360) * min + (Math.PI/21600) * sec )
// This line is going to be wide
ctx.lineWidth = 14;
ctx.beginPath();
// Start drawing from just off-center (making it look like a clock hand)
ctx.moveTo(-20,0);
// And draw to near the hour ticks
ctx.lineTo(80,0);
ctx.stroke();
ctx.restore();
// Draw Minute Hand
ctx.save();
// Rotate the canvas to the current minute position
ctx.rotate( (Math.PI/30) * min + (Math.PI/1800) * sec )
// This line will be thinner than the hour hand
ctx.lineWidth = 10;
ctx.beginPath();
// But it's also longer, so set it farther back
ctx.moveTo(-28,0);
// And draw it farther out
ctx.lineTo(112,0);
ctx.stroke();
ctx.restore();
// Draw Second Hand
ctx.save();
// Rotate the canvas to the current second position
ctx.rotate(sec * Math.PI/30);
// This line will be redish
ctx.strokeStyle = "#D40000";
ctx.fillStyle = "#D40000";
// and thinner than the other hands
ctx.lineWidth = 6;
ctx.beginPath();
// But also set farther back
ctx.moveTo(-30,0);
// But stubbier
ctx.lineTo(83,0);
ctx.stroke();
ctx.restore();
// Outside Blue Circle
ctx.save();
// The border will be wide
ctx.lineWidth = 14;
// and blue-ish
ctx.strokeStyle = '#325FA2';
ctx.beginPath();
// Draw a complete circle, 142px out
ctx.arc(0,0,142,0,Math.PI*2,true);
ctx.stroke();
ctx.restore();
ctx.restore();
}
</script>
</head>
<body>
<canvas id="canvas" height="150" width="150"></canvas>
</body>
</html>
(C) Æliens
20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.