2016-11-25 18 views
0

時間をキャンバスに描画しますが、時間が変わると再び描画されます。 私はキャンバスを消去することを考えていましたが、他のものもあります。キャンバス - 描画時間

function startTime() { 
    var today = new Date(); 
    var h = today.getHours(); 
    var m = today.getMinutes(); 
    var s = today.getSeconds(); 

    m = checkTime(m); 
    s = checkTime(s); 
    ctx.font="20px Arial"; 
    ctx.fillText(h + ':' + m, 4, 24); 
    var t = setTimeout(startTime, 500); 
} 

function checkTime(i) { 
    if (i < 10) {i = "0" + i}; 
    return i; 
} 

ヘルプがありますか?ありがとう!

+0

私は[ここ](http://stackoverflow.com/a/29829625/285915)記載されているアプローチは、このために働くかもしれません。 – mrmcgreg

+0

すべてを再描画するだけで、キャンバスAPIは高速です。頻繁に更新されないレンダリングが遅い場合は、これらのものをオフスクリーンキャンバスに描画し、drawImage(canvas、0,0)を呼び出します。 – Kaiido

答えて

0

クリーンキャンバス全体をワイプする必要が、代わりに新しい時間が

context.clearRect(X、Y、幅、高さ)描画されるキャンバスの一部のみをクリアするclearRect()を使用します。ここで

ctx.clearRect(4,24,100,50); // clear old time 
ctx.font="20px Arial"; 
ctx.fillText(h + ':' + m, 4, 24); //draw new time 
+0

clearRectの2番目のパラメータは4以下にする必要があります。テキストはy = 24で描かれましたが、それはテキストの下端を定義し、上端は定義しません。 – Jon

+0

必要に応じて値を調整する – Viney

0

はあなたのコードビットを変更することができる方法です。実際に何かを再描画することは決してありません。別のものの上に数字を描くだけです。あなたはあなたのコードを実行させる場合、数字がお互いの上にスタックすることに気付くでしょう。

clearRectを使用する場合は、希望のピクセルサイズで定義されたキャンバスの一部を再描画できます。この例のスニペットを実行し、表示されます、時間だけが再描画されます

var ctx = document.getElementById('time').getContext('2d'); 
 
ctx.rect(0, 75, 25, 25) 
 
ctx.rect(75, 0, 25, 25) 
 
ctx.rect(75, 75, 25, 25) 
 
ctx.stroke() 
 

 
function startTime() { 
 
    var today = new Date(); 
 
    var h = today.getHours(); 
 
    var m = today.getMinutes(); 
 
    var s = today.getSeconds(); 
 

 
    m = checkTime(m); 
 
    s = checkTime(s); 
 
    ctx.clearRect(0, 0, 50, 30); // <- point of interest 
 
    ctx.font="20px Arial"; 
 
    ctx.fillText(h + ':' + m, 4, 24); 
 
    var t = setTimeout(startTime, 500); 
 
} 
 

 
function checkTime(i) { 
 
    if (i < 10) { 
 
    i = "0" + i; 
 
    } 
 
    return i; 
 
} 
 

 
startTime()
<canvas id='time' width="100" height="100"></canvas>

0

使用clearRectは、キャンバスの一部だけをクリアするために(それ以外の矩形が消えてしまいます)。以下の例では、表示されるテキストの正確な幅を取得するためにmeasureTextを使用しています。 私は、クリアされた領域の高さをハードコーディングしていますが、それは高さを得ることは可能ですが、it is complicatedです。

N.B.私はフィードバックを素早く得るために、ディスプレイに秒を追加しました。

var canvas = document.getElementsByTagName('canvas')[0]; 
 
var ctx = canvas.getContext('2d'); 
 
var previousTextMetrics = null; 
 

 
startTime(); 
 

 
function startTime() { 
 
    //clear the previously displayed text 
 
    if (previousTextMetrics) { 
 
    ctx.clearRect(4, 4, previousTextMetrics.width, 20); 
 
    } 
 

 
    var today = new Date(); 
 
    var h = today.getHours(); 
 
    var m = today.getMinutes(); 
 
    var s = today.getSeconds(); 
 
    m = checkTime(m); 
 
    s = checkTime(s); 
 
    ctx.font = "20px Arial"; 
 
    var text = h + ':' + m + ':' + s; 
 
    ctx.fillText(text, 4, 24); 
 
    //read metrics, including the width of the text 
 
    previousTextMetrics = ctx.measureText(text); 
 

 
    var t = setTimeout(startTime, 500); 
 
} 
 

 
function checkTime(i) { 
 
    if (i < 10) { 
 
    i = "0" + i 
 
    }; 
 
    return i; 
 
}
<canvas></canvas>

関連する問題