canvs绘制时钟

来源:互联网 发布:485串口网络服务器 编辑:程序博客网 时间:2024/06/09 17:46

1、思路分析:canvas参考资料http://www.w3school.com.cn/tags/html_ref_canvas.asp

①画背景。首先将画布的(0,0)点移到画布中心点,画出圆形,然后求出每一个数字对应的弧度数,并根据数学知识求出每个数字对应的(x,y)坐标,最后在圆中填充出数字和刻度。

②画时针。

③画分针。

④画秒针。

⑤注意时针与分针的联系。

⑥让时钟动起来。

⑦解决时钟缩放问题。

2、代码:

getContext() 方法返回一个用于在画布上绘图的环境。语法:Canvas.getContext(contextID);

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initical-scale=1" />
<title>Canvas clock</title>
<style type="text/css">
div{
text-align:center;
margin-top:250px;
}
#clock{
border: 1px solid #ccc;
}
</style>
</head>
<body>
<div>
<!--width,height不能写在style里面,其值不带'px'-->
<canvas id="clock" height='200'; width='200'>
当前浏览器不支持Canvas,请更换浏览器后再重试。
</canvas>
</div>
<script type="text/javascript">
var dom=document.getElementById("clock");
var ctx=dom.getContext("2d");//获取上下文环境(2D)
var width=ctx.canvas.width;//获取canvas宽
var height=ctx.canvas.height;//获取canvas宽
var r=width/2;//圆半径为canvas宽度的一半
var rem = width / 200;//缩放比例


//画背景
function drawBackground(){
ctx.save();//保存当前环境状态
ctx.translate(r,r);//重新映射画布上的(0,0)位置
ctx.beginPath();//起始一条路径,或重置当前路径
ctx.lineWidth=10 * rem;//设置圆的线条大小
ctx.arc(0,0,r-ctx.lineWidth / 2,0,2*Math.PI,false);//给出圆的状态
ctx.stroke();//画出圆的形状


var hourNumbers=[3,4,5,6,7,8,9,10,11,12,1,2];//水平方向为起始点
ctx.font=18 * rem + "px Arial";
//使得其中文字水平、垂直方向居中
ctx.textAlign="center";//设置或返回文本内容的当前对齐方式
ctx.textBaseline="middle";//设置或返回在绘制文本时使用的当前文本基线


//在圆上填写数字
hourNumbers.forEach(function(number,i){
var rad=2*Math.PI/12*i;//每小时转过的弧度数*小时数
var x=Math.cos(rad)*(r-30 * rem);//对应的x坐标
var y=Math.sin(rad)*(r-30 * rem);//对应的y坐标
ctx.fillText(number,x,y);//在画布上绘制“被填充的”文本
});


//在圆上画出对应的刻度
for(var i=0;i<60;i++){
var rad=2*Math.PI/60*i;
var x=Math.cos(rad)*(r-18 * rem);
var y=Math.sin(rad)*(r-18 * rem);
ctx.beginPath();
if(i%5===0){
ctx.fillStyle='#000';
ctx.arc(x,y,2 * rem,0,2*Math.PI,false);
}else{
ctx.fillStyle='#ccc';
ctx.arc(x,y,2 * rem,0,2*Math.PI,false);
}
ctx.fill();//填充
}
}


function drawHour(hour,minute){
ctx.save();
ctx.beginPath();
var rad = 2 * Math.PI /12 * hour;
var mrad = 2* Math.PI /12 / 60 * minute;
ctx.rotate(rad + mrad);//旋转弧度数
ctx.lineWidth = 6 * rem;
ctx.lineCap = 'round';//设置线尾线条为圆角
ctx.moveTo(0,10 * rem);
ctx.lineTo(0,-r / 2);
ctx.stroke();//绘制已定义的路径
ctx.restore();//返回之前保存过的路径状态和属性
}


function drawMinute(minute){
ctx.save();
ctx.beginPath();
var rad = 2 * Math.PI /60 * minute;
ctx.rotate(rad);
ctx.lineWidth = 3 * rem;
ctx.lineCap = 'round';
ctx.moveTo(0,10 * rem);
ctx.lineTo(0,-r + 30 * rem);
ctx.stroke();
ctx.restore();
}


function drawSecond(second){
ctx.save();
ctx.beginPath();
ctx.fillStyle = '#c14543';
var rad = 2 * Math.PI /60 * second;
ctx.rotate(rad);
ctx.moveTo(-2 * rem,20 * rem);
ctx.lineTo(2 * rem,20 * rem);
ctx.lineTo(1,-r + 18 * rem);
ctx.lineTo(-1,-r + 18 * rem);
ctx.fill();
ctx.restore();
}


function drawDot(){
ctx.beginPath();
ctx.fillStyle = '#fff';
ctx.arc(0,0,3 * rem,0,2*Math.PI,false);
ctx.fill();
}


function draw(){
ctx.clearRect(0,0,width,height);//清除
var now = new Date();
var hour = now.getHours();
var minute = now.getMinutes();
var second = now.getSeconds();
drawBackground();
drawHour(hour,minute);
drawMinute(minute);
drawSecond(second);
drawDot();
ctx.restore();
}

draw();
setInterval(draw,1000);


</script>
</body>
</html>

原创粉丝点击