2012-04-16 144 views
-3

我有一只手表“秒针”图像需要每秒钟移动一次。如果我使用画布,我会每秒删除画布,因此加载手表照片和“秒针”照片会很难看。Html5,JavaScript,画布动画?

我需要帮助。

+4

得到任何代码显示? – alex 2012-04-16 00:23:26

+2

然后,请勿将手表照片放在画布上,将画布放在画布上。 – david 2012-04-16 00:30:49

+0

我没有代码,我只是有想法,我无法实现它,真的需要帮助。 – 2012-04-16 06:33:56

回答

1

您需要使用图层...仅绘制正在移动的部分。 有一个在该地址一个伟大的教程: http://arc.id.au/CanvasLayers.html

从该网站引用:

传统的动画的技术是使用透明层覆盖在背景图像的堆叠,与物品进行动画每个都在一个单独的图层上绘制。只有在每个框架上更改的图层都重绘,其他图层保持不变。图形引擎可以将要暴露的区域从底层重新绘制出来,而不需要用户代码。

0

一个(有点)简单的方法是使用两个画布。

<帆布ID = “foregroundCanvas” > < /帆布>
<帆布ID = “backgroundCanvas” > < /帆布>

这里是W3Schools的一个伟大的教程:
http://www.w3schools.com/canvas/canvas_clock_start.asp

的以下是链接中的代码。

<!DOCTYPE html> 
<html> 
<body> 

<canvas id="canvas" width="400" height="400" 
style="background-color:#333"> 
</canvas> 

<script> 
var canvas = document.getElementById("canvas"); 
var ctx = canvas.getContext("2d"); 
var radius = canvas.height/2; 
ctx.translate(radius, radius); 
radius = radius * 0.90 
setInterval(drawClock, 1000); 

function drawClock() { 
    drawFace(ctx, radius); 
    drawNumbers(ctx, radius); 
    drawTime(ctx, radius); 
} 

function drawFace(ctx, radius) { 
    var grad; 
    ctx.beginPath(); 
    ctx.arc(0, 0, radius, 0, 2*Math.PI); 
    ctx.fillStyle = 'white'; 
    ctx.fill(); 
    grad = ctx.createRadialGradient(0,0,radius*0.95, 0,0,radius*1.05); 
    grad.addColorStop(0, '#333'); 
    grad.addColorStop(0.5, 'white'); 
    grad.addColorStop(1, '#333'); 
    ctx.strokeStyle = grad; 
    ctx.lineWidth = radius*0.1; 
    ctx.stroke(); 
    ctx.beginPath(); 
    ctx.arc(0, 0, radius*0.1, 0, 2*Math.PI); 
    ctx.fillStyle = '#333'; 
    ctx.fill(); 
} 

function drawNumbers(ctx, radius) { 
    var ang; 
    var num; 
    ctx.font = radius*0.15 + "px arial"; 
    ctx.textBaseline="middle"; 
    ctx.textAlign="center"; 
    for(num = 1; num < 13; num++){ 
    ang = num * Math.PI/6; 
    ctx.rotate(ang); 
    ctx.translate(0, -radius*0.85); 
    ctx.rotate(-ang); 
    ctx.fillText(num.toString(), 0, 0); 
    ctx.rotate(ang); 
    ctx.translate(0, radius*0.85); 
    ctx.rotate(-ang); 
    } 
} 

function drawTime(ctx, radius){ 
    var now = new Date(); 
    var hour = now.getHours(); 
    var minute = now.getMinutes(); 
    var second = now.getSeconds(); 
    //hour 
    hour=hour%12; 
    hour=(hour*Math.PI/6)+ 
    (minute*Math.PI/(6*60))+ 
    (second*Math.PI/(360*60)); 
    drawHand(ctx, hour, radius*0.5, radius*0.07); 
    //minute 
    minute=(minute*Math.PI/30)+(second*Math.PI/(30*60)); 
    drawHand(ctx, minute, radius*0.8, radius*0.07); 
    // second 
    second=(second*Math.PI/30); 
    drawHand(ctx, second, radius*0.9, radius*0.02); 
} 

function drawHand(ctx, pos, length, width) { 
    ctx.beginPath(); 
    ctx.lineWidth = width; 
    ctx.lineCap = "round"; 
    ctx.moveTo(0,0); 
    ctx.rotate(pos); 
    ctx.lineTo(0, -length); 
    ctx.stroke(); 
    ctx.rotate(-pos); 
} 
</script> 

</body> 
</html>