慕神2706593
2016-10-22 15:45
为什么我的是酱紫的
代码:
var dom=document.getElementById('clock');
var ctx=dom.getContext('2d');
var width=ctx.canvas.width;
var height=ctx.canvas.height;
var r=width/2;
function drawBackground(){
ctx.save();
ctx.translate(r,r);
ctx.beginPath();
ctx.lineWidth=10;
ctx.arc(0,0,r-5,0,2*Math.PI,false);
ctx.stroke();
var hourNumbers=[3,4,5,6,7,8,9,10,11,12,1,2];
hourNumbers.forEach(function(number,i){
ctx.font='18px Arial'
ctx.textAlign='center';
ctx.textBaseline='middle';
var rad=2*Math.PI/12*i;
var x=Math.cos(rad)*(r-30);
var y=Math.sin(rad)*(r-30);
ctx.fillText(number,x,y);
});
for(var i=0;i<60;i++){
var rad=2*Math.PI/60*i;
var x=(r-20)*Math.cos(rad);
var y=(r-20)*Math.sin(rad);
ctx.beginPath();
if(i%5==0){
ctx.arc(x,y,2,0,2*Math.PI,false);
ctx.fillStyle='#000';
}
else{
ctx.arc(x,y,2,0,2*Math.PI,false);
ctx.fillStyle='#ccc';
}
ctx.fill();
}
}
function drawHour(hour,minu){
ctx.save();
ctx.beginPath();
var rad=2*Math.PI/12*hour;
var mrad=2*Math.PI/12/60*minu;
ctx.lineWidth=5;
ctx.linecap='round';
ctx.rotate(rad+mrad);
ctx.moveTo(0,10);
ctx.lineTo(0,-r/3);
ctx.stroke();
ctx.restore();
}
function drawMinute(minu){
ctx.save();
ctx.beginPath();
var rad=2*Math.PI/60*minu;
ctx.lineWidth=3;
ctx.linecap='round';
ctx.rotate(rad);
ctx.moveTo(0,10);
ctx.lineTo(0,-r/2);
ctx.stroke();
ctx.restore();
}
function drawSecond(second){
ctx.save();
ctx.beginPath();
var rad=2*Math.PI/60*second;
ctx.lineWidth=1;
ctx.linecap='round';
ctx.strokeStyle='#0000ff';
ctx.rotate(rad);
ctx.moveTo(0,10);
ctx.lineTo(0,-r/2-10);
ctx.stroke();
ctx.restore();
}
function drawDot(){
ctx.beginPath();
ctx.fillStyle='#fff';
ctx.arc(0,0,3,0,2*Math.PI,false);
ctx.fill();
}
drawBackground();
drawDot();
function draw(){
ctx.clearRect(0,0,width,height);
var now =new Date();
var hour=now.getHours();
var minu=now.getMinutes();
var second=now.getSeconds();
drawHour(hour,minu);
drawMinute(minu);
drawSecond(second);
drawBackground();
drawDot();
ctx.restore();
}
draw();
setInterval(draw,1000);
还有。。怎么用火狐调试~~
你把drawBackground和drawDot函数放在draw()函数外面没有意义,因为每次执行draw函数都会直接清除画布,还是会被清除掉.
尝试下这样:
setInterval(function(){ ctx.clearRect(0,0,w,h); draw(); },1000);
个人感觉画布在restore和save上要多加小心,很容易出错了,我是调试时没有在draw()函数忘了写上ctx.restore()出现跟你一样的情况,加上之后发现虽然不错位了,但是没有清除的效果,所以就改成了上面的在定时器里清除画布全部代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <style type="text/css"> div{ text-align: center; margin-top: 250px; } #click{ border: 1px solid #CCC; } </style> </head> <body> <div> <canvas id="click" width="200px" height="200px"></canvas> </div> <script> var canvas=document.getElementById('click'); var ctx=canvas.getContext('2d'); var w=ctx.canvas.width; var h=ctx.canvas.height; var r=w/2; function drawCircle(){ ctx.save(); ctx.translate(r,r); ctx.beginPath(); ctx.lineWidth=10; ctx.arc(0,0,r-5,0,2*Math.PI,false); ctx.stroke(); var hoursNum=[3,4,5,6,7,8,9,10,11,12,1,2]; hoursNum.forEach(function(number,i){ ctx.font='18px 微软雅黑'; ctx.textAlign='center'; ctx.textBaseline='middle'; var rad=2*Math.PI/12*i; var y=(r-30)*Math.sin(rad); var x=(r-30)*Math.cos(rad); ctx.fillText(number,x,y); }) } function drawDots(){ for(j=0;j<60;j++){ ctx.beginPath(); var rad=2*Math.PI/60*j; var y=(r-15)*Math.sin(rad); var x=(r-15)*Math.cos(rad); ctx.beginPath(); if(j%5===0){ ctx.fillStyle='#000' ctx.arc(x,y,3,0,2*Math.PI,false); }else{ ctx.fillStyle='#CCC'; ctx.arc(x,y,2,0,2*Math.PI,false); } ctx.fill(); } ctx.beginPath(); ctx.fillStyle='white'; ctx.arc(0,0,2.5,0,2*Math.PI,false); ctx.fill(); } function drawHour(h,min){ ctx.save(); ctx.beginPath(); ctx.lineWidth=6; ctx.lineCap='round'; var rad=2*Math.PI/12*h; var minRad=2*Math.PI/720*min; ctx.rotate(rad+minRad); ctx.moveTo(0,10); ctx.lineTo(0,-(r-50)); ctx.stroke(); ctx.restore(); } function drawMinute(min,sec){ ctx.save(); ctx.beginPath(); ctx.lineWidth=4.5; ctx.lineCap='round'; var rad=2*Math.PI/60*min; var secRad=2*Math.PI/3600*sec; ctx.rotate(rad+secRad); ctx.moveTo(0,10); ctx.lineTo(0,-(r-40)); ctx.stroke(); ctx.restore(); } function drawSecond(sec){ ctx.save(); ctx.beginPath(); ctx.fillStyle='crimson'; ctx.rotate(2*Math.PI/60*sec); ctx.moveTo(-2,20); ctx.lineTo(2,20); ctx.lineTo(1,-r+18); ctx.lineTo(-1,-r+18); ctx.fill(); ctx.restore(); } function draw(){ ctx.clearRect(0,0,w,h) drawCircle(); var now=new Date(); var h=now.getHours(); var min=now.getMinutes(); var sec=now.getSeconds(); drawHour(h,min); drawMinute(min,sec); drawSecond(sec); drawDots(); } draw(); setInterval(draw,1000); </script> </body> </html>
function draw(){ var now=new Date(); var h=now.getHours(); var min=now.getMinutes(); var sec=now.getSeconds(); drawCircle(); drawHour(h,min); drawMinute(min,sec); drawSecond(sec); drawDots(); ctx.restore(); } draw(); setInterval(function(){ ctx.clearRect(0,0,w,h); draw(); },1000);
抱歉我上面代码最后部分贴错了,这是我写的正确的.
lineWidth变大了,他是在原来的基础上宽度向两边扩大,所以减去的是lineWidth的一半
Canvas 绘制时钟
49750 学习 · 160 问题
相似问题
回答 2
回答 3