当前位置 : 主页 > 网络编程 > JavaScript >

HTML5 canvas 改进 彭博 2012 年的时钟

来源:互联网 收集:自由互联 发布时间:2021-07-03
网页如果有影像文档的元素,那么在运行之前,必须下载它。彭博的钟表,就需要从 http://static.oschina.net/uploads/space/2012/0712/125855_nnla_89964.png 下载表盘刻度影像,方可制成钟表。如果,这
网页如果有影像文档的元素,那么在运行之前,必须下载它。彭博的钟表,就需要从  
http://static.oschina.nethttp://img.558idc.com/uploadfile/space/2012/0712/125855_nnla_89964.png
下载表盘刻度影像,方可制成钟表。如果,这个影像文档,一时得不到,这个钟表就无法正常显示。我有个提议:利用 HTML5 canvas的绘图功能,尽可能以“手工绘制”代替影像文档。
我的贡献:
1. 按照影像文档,“手工绘制”了表盘刻度。
2. 增添了变大、缩小的功能。
新手,望指点。

彭博 2012 年的时钟出处:
http://www.oschina.net/code/snippet_89964_11897
运行本代码见:
http://runjs.cn/detail/4umhjowy

1. [图片] clock.png    

2. [文件] clock_ZhongGuanCun.html ~ 5KB     下载(6)    

<html>
<head>
<meta charset="utf-8" />
<title>中关村钟表</title>
<script>
/*
根据 开源中国社区 彭博的作品 
"http://www.oschina.net/code/snippet_89964_11897" 
改进:用手工绘制表盘刻度, 增添变大、缩小功能。 
日期:2016-05-26
*/
var canvas, ctx, c, g;
var clockRadius =250;

function locateCircle(){
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d');	
ctx.translate(clockRadius,clockRadius);
c=document.getElementById("myCanvas");
g=c.getContext("2d");	
g.translate(clockRadius,clockRadius);	
}
	
function writting(){
	document.write("Hello World!");
}
function clockSmaller(){
	clockRadius--;
	}	
function clockBigger(){
	clockRadius++;
	}
function drawScene() {
	//获取即时时间
    var date = new Date();
    var hours = date.getHours();
    var minute = date.getMinutes();
    var seconds = date.getSeconds();
    hours = hours > 12 ? hours - 12 : hours;
    var hour = hours + minute / 60;
    // 清频
    ctx.clearRect(-clockRadius,-clockRadius ,2*clockRadius ,2*clockRadius); 
	ctx.beginPath();
 	ctx.font=  36*clockRadius/250  + 'px Arial';
    ctx.fillStyle = '#000';
    ctx.textAlign = 'center';
    ctx.textBaseline = 'middle';
    for (var n = 1; n <= 12; n++) {
        var theta = (n - 3) * (Math.PI * 2) / 12;
        var x = clockRadius * 0.7 * Math.cos(theta);
        var y = clockRadius * 0.7 * Math.sin(theta);
        ctx.fillText(n, x, y);
    }
    // 画时针
    ctx.save();
    var theta = (hour - 3) * 2 * Math.PI / 12;
    ctx.rotate(theta);
    ctx.beginPath();
    ctx.moveTo(-clockRadius*0.06, -clockRadius*0.02);
    ctx.lineTo(-clockRadius*0.06, clockRadius*0.02);
    ctx.lineTo(clockRadius * 0.5, clockRadius*0.01);
    ctx.lineTo(clockRadius * 0.5, -clockRadius*0.01);
    ctx.fill();
    ctx.restore(); //	也可以用 ctx.rotate(-theta);
 
    // 画分针
    ctx.save();
    var theta = (minute - 15) * 2 * Math.PI / 60;
    ctx.rotate(theta);
    ctx.beginPath();
    ctx.moveTo(-clockRadius*0.06, -clockRadius*0.016);
    ctx.lineTo(-clockRadius*0.06, clockRadius*0.016);
    ctx.lineTo(clockRadius * 0.8, 1);
    ctx.lineTo(clockRadius * 0.8, -1);
	ctx.fillStyle="orange";
    ctx.fill();
    ctx.restore(); // 也可以用ctx.rotate(-theta);
 
    // 画秒针
	ctx.save();
    var theta = (seconds - 15) * 2 * Math.PI / 60;
    ctx.rotate(theta);
    ctx.beginPath();
    ctx.moveTo(-clockRadius*0.06, -clockRadius*0.012);
    ctx.lineTo(-clockRadius*0.06, clockRadius*0.012);
    ctx.lineTo(clockRadius * 0.9, 1);
    ctx.lineTo(clockRadius * 0.9, -1);
    ctx.fillStyle = '#0f0';
    ctx.fill();
    ctx.restore();  // 也可以用 ctx.rotate(-theta);
	face();
}
 
function initialization(){
    locateCircle();
    setInterval('drawScene()', 1000); 	
}

function face(){
	g.save();
	g.clearRect(-clockRadius,-clockRadius ,2*clockRadius ,2*clockRadius);
	
	g.font= clockRadius/6 + "px 楷体";
// 创建梯度背景
var gradient=g.createLinearGradient(0,0,canvas.width,0);
gradient.addColorStop("0","magenta");
gradient.addColorStop("0.5","blue");
gradient.addColorStop("1.0","red");
g.fillStyle=gradient; //设置创建好的梯度背景
g.fillText("中关村",-clockRadius/4,clockRadius/3);

	g.fillStyle="green"; //用绿色填充表盘刻度
	for(var i=0;i<60;i++){ //画表盘刻度
		if (i%5==0){ // 画整点刻度
	g.beginPath();
    g.moveTo(clockRadius * 0.77, -clockRadius/48);
    g.lineTo(clockRadius * 0.96, -clockRadius/48);
    g.lineTo(clockRadius * 0.96, clockRadius/48);
    g.lineTo(clockRadius * 0.77, clockRadius/48);
    g.fill();
		} else{   // 画整点以外的分钟刻度
	g.beginPath();
	g.arc(clockRadius*0.862,0,clockRadius*0.024,0,2*Math.PI);
	g.fill();
		}
	g.rotate(Math.PI/30.0);  // 旋转一分钟的度数:6 度 
	}
	g.restore();
}
</script>
<style>

#myCanvas{
	z-index:2;
	position:absolute;
	left:0px;
	top:0px;
	border:solid 7px #0F9;  	
}

#canvas{
	z-index:3;
}
#clocks{
	position:absolute;
	left:0px;
	top:0px;	
}
#controlPanel{
	z-index=3;
	position:absolute;
	left:0px;
	top:514px;
	width:200px;	
}
</style>
</head>

<body onLoad="initialization()" >


<canvas id="myCanvas" width="500" height="500" > 
         <p>Your browserdoes not support the canvas element!</p  
></canvas>
<div class="clocks">
<canvas id="canvas" width="500" height="500"></canvas>
</div>
<div id="controlPanel">
<input type ="button"  value="缩小" onClick="clockSmaller()" /> 
<input  type="button"  value="变大" onClick="clockBigger()" /> 
</div>
</body>
</html>
网友评论