在表盘之上,建有一个 canvas( 画布 ),如清单15所示。
清单 15.画布
-
<canvas id="canvas" width="128px" height="128px" class="canvas"></canvas>
接下来,清单17将在画布上模拟出时钟以及分针,在这之前,额外需要一个后台线程用以计算时间,它被定义在名为time.js的独立脚本文件中,如清单16所示。
清单 16.后台线程
-
onmessage = function(event)
-
{
-
//var i = 1;
-
setInterval(function() {
-
//i++;
-
postMessage("");
-
}, 60000);
-
};
每过60秒钟,后台线程将会向前台线程发送一个空消息,以告诉前台线程有60秒钟已经过去了。
清单 17.前台线程的初始化
-
var canvas = document.getElementById("canvas");
-
if (canvas == null)
-
return false;
-
var context = canvas.getContext('2d');// 这是一个二维的图像
-
context.lineWidth = 2;
-
context.translate(64, 64);// 定义原点
-
-
// 初始化分针
-
context.beginPath();
-
context.moveTo(0,0);// 从原点开始
-
var date = new Date();
-
var mhx = 37*Math.cos((date.getMinutes()-15)*Math.PI/30);
-
var mhy = 37*Math.sin((date.getMinutes()-15)*Math.PI/30);
-
context.lineTo(mhx, mhy);// 至分针末端所在位置
-
context.closePath();
-
context.stroke();
-
-
// 初始化时针
-
context.beginPath();
-
context.moveTo(0,0);// 从原点开始
-
var date = new Date();
-
var hour = date.getHours();
-
if(hour>=12)
-
hourhour = hour - 12;
-
var minute = date.getMinutes();
-
var hhx = 27*Math.cos((hour-3)*Math.PI/6 + minute*Math.PI/360);
-
var hhy = 27*Math.sin((hour-3)*Math.PI/6 + minute*Math.PI/360);
-
context.lineTo(hhx, hhy);// 至时针末端所在位置
-
context.closePath();
-
context.stroke();
前台线程首先会获取canvas,并设置表盘中心为坐标原点。然后,获取当前时间,计算分针当前所应指向的坐标,然后从原点出发,画出分针。对于时针,若系统为24小时制,需要首先转化为12小时制,此后的处理类似于分针。
接下来,需要将前台与后台线程联系起来,利用HTML5提供的多线程编程方法,声明Worker对象作为后台线程的代理,并利用onmessage事件,对后台线程发出的消息进行处理。
清单 18.前台线程的onmessage事件
-
var worker = new Worker("js/timer.js");
-
-
worker.onmessage = function(event){
-
-
context.clearRect(-64, -64, 128, 128);// 清空分针和时针
-
-
// 重画分针
-
context.beginPath();
-
context.moveTo(0,0);// 从原点开始
-
var date = new Date();
-
var mhx = 37*Math.cos((date.getMinutes()-15)*Math.PI/30);
-
var mhy = 37*Math.sin((date.getMinutes()-15)*Math.PI/30);
-
context.lineTo(mhx, mhy);// 至分针末端所在位置
-
context.closePath();
-
context.stroke();
-
(责任编辑:12图资源库)