2012-04-16 41 views
-3

私は毎秒それを動かす必要がある時計 "秒針"のイメージを持っています。キャンバスを使用すると、毎秒キャンバスが削除されますので、時計の写真と「秒針」の写真を読み込むのは醜いでしょう。Html5、JavaScript、Canvas Animations?

私は助けが必要です。

+4

表示するコードはありますか? – alex

+2

次に、写真をキャンバスに入れないで、その上にキャンバスを描きます。 – david

+0

私はコードを書いていない、私はちょうどアイデアを持って、私はそれを実装することはできません、本当に助けが必要です。 –

答えて

1

レイヤーを使用する必要があります...動いている部分だけを描画します。 このアドレスの偉大なチュートリアルがあります:このウェブサイトから http://arc.id.au/CanvasLayers.html

引用:

伝統的なアニメーション技術は、アイテムをアニメーション化することで、背景画像をオーバーレイする透明層のスタックを使用することですが、それぞれは別々の層に描かれている。各フレームで変更されるレイヤーのみが再描画され、他のレイヤーは変更されません。グラフィックスエンジンは、ユーザコードを必要とせずに、下にあるレイヤから再描画される露出領域をソートすることができます。

0

2つのキャンバスを使用するのが1つ(やや簡単に)できます。ここで

<キャンバス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>