Модификация циферблата часов на canvas

214
11 ноября 2018, 16:30

Есть часы, подскажите как можно вместо линий показывающих деления часов, вставить цифры? Не до конца понимаю, как написать такую функцию..

 function clockPainting() { 
 	var now = new Date(); 
 	var sec = now.getSeconds(); 
 	var min = now.getMinutes(); 
 	var hr = now.getHours(); 
 
 	var ctx = document.getElementById("canvas").getContext("2d"); 
 	ctx.save(); // помещаем текущий контекст в стэк 
 
 	ctx.clearRect(0, 0, 150, 150); 
 	ctx.translate(75, 75); 
 	ctx.scale(0.4, 0.4); 
 	ctx.rotate(-Math.PI / 2); 
 
 	ctx.strokeStyle = "black"; 
 	ctx.fillStyle = "red"; 
 	ctx.lineWidth = 8; 
 	ctx.lineCap = "round"; 
 
 	ctx.save(); 
 	ctx.beginPath(); 
 
 	for (var i = 0; i < 12; i++) { 
 		ctx.rotate(Math.PI / 6); 
 		ctx.moveTo(100, 0); 
 		ctx.lineTo(120, 0); 
 	} 
 
 	ctx.stroke(); // нарисовали то, что ранее описали 
 	ctx.restore(); // достаем последний сохраненный контекст из стэка 
 
 	ctx.save(); 
 	// рисуем часовую стрелку, вращая холст 
 	ctx.rotate((Math.PI / 6) * hr + 
 		(Math.PI / 360) * min + 
 		(Math.PI / 21600) * sec); 
 	ctx.lineWidth = 14; 
 
 	ctx.beginPath(); 
 	ctx.moveTo(-20, 0); 
 
 	// линия почти до часовых меток 
 	ctx.lineTo(80, 0); 
 	ctx.stroke(); 
 	ctx.restore(); 
 
 	ctx.save(); 
 
 	// минутная стрелка 
 	ctx.rotate((Math.PI / 30 * min) + 
 		(Math.PI / 1800) * sec); 
 	ctx.lineWidth = 10; 
 
 	ctx.beginPath(); 
 	ctx.moveTo(-28, 0); 
 	ctx.lineTo(112, 0); 
 	ctx.stroke(); 
 	ctx.restore(); 
 
 	ctx.save(); 
 
 	// секундная стрелка 
 	ctx.rotate(sec * Math.PI / 30); 
 	ctx.strokeStyle = "#D40000"; // цвет контура 
 	ctx.fillStyle = "#D40000"; 
 	ctx.lineWidth = 6; 
 
 	ctx.beginPath(); 
 	ctx.moveTo(-30, 0); 
 	ctx.lineTo(83, 0); 
 	ctx.stroke(); 
 	ctx.restore(); 
 
 	ctx.restore(); 
 } 
 window.onload = function () { 
 	setInterval(clockPainting, 1000); // функция, перерисовывающая часы 
 	//через равные промежутки времени 
 }
        <canvas id="canvas" height="150" width="150"></canvas>

Answer 1

function clockPainting() { 
  var now = new Date(); 
  var sec = now.getSeconds(); 
  var min = now.getMinutes(); 
  var hr = now.getHours(); 
 
  var ctx = document.getElementById("canvas").getContext("2d"); 
  ctx.save(); // помещаем текущий контекст в стэк 
 
  ctx.clearRect(0, 0, 150, 150); 
  ctx.translate(75, 75); 
  ctx.scale(0.4, 0.4); 
  ctx.rotate(-Math.PI / 2); 
 
  ctx.strokeStyle = "black"; 
  ctx.fillStyle = "red"; 
  ctx.lineWidth = 8; 
  ctx.lineCap = "round"; 
 
  ctx.save(); 
  ctx.beginPath(); 
 
  // рисуем деления часов 
  /* 
  for (var i = 0; i < 12; i++) { 
    ctx.rotate(Math.PI / 6); 
    ctx.moveTo(100, 0); 
    ctx.lineTo(120, 0); 
  } 
  ctx.stroke(); 
  */ 
 
  // рисуем статичный циферблат 
  var ang; 
  var radius = 150; 
  ctx.rotate(Math.PI / 2); 
  ctx.font = radius * 0.25 + "px arial"; 
  ctx.textBaseline = "middle"; 
  ctx.textAlign = "center"; 
  for (var num = 1; num < 13; num++) { 
    ang = num * (Math.PI / 6); 
    ctx.rotate(ang); 
    ctx.translate(0, -radius); 
    ctx.rotate(-ang); 
    ctx.fillStyle = "lightgrey"; 
    ctx.fillText((num).toString(), 3, 5); 
    ctx.fillStyle = "red"; 
    ctx.fillText((num).toString(), 0, 0); 
    ctx.rotate(ang); 
    ctx.translate(0, radius); 
    ctx.rotate(-ang); 
  } 
 
  ctx.stroke(); // нарисовали то, что ранее описали 
  ctx.restore(); // достаем последний сохраненный контекст из стэка 
 
  ctx.save(); 
  // рисуем часовую стрелку, вращая холст 
  ctx.rotate((Math.PI / 6) * hr + 
    (Math.PI / 360) * min + 
    (Math.PI / 21600) * sec); 
  ctx.lineWidth = 14; 
 
  ctx.beginPath(); 
  ctx.moveTo(-20, 0); 
 
  // линия почти до часовых меток 
  ctx.lineTo(80, 0); 
  ctx.stroke(); 
  ctx.restore(); 
 
  ctx.save(); 
 
  // минутная стрелка 
  ctx.rotate((Math.PI / 30 * min) + 
    (Math.PI / 1800) * sec); 
  ctx.lineWidth = 10; 
 
  ctx.beginPath(); 
  ctx.moveTo(-28, 0); 
  ctx.lineTo(112, 0); 
  ctx.stroke(); 
  ctx.restore(); 
 
  ctx.save(); 
 
  // секундная стрелка 
  ctx.rotate(sec * Math.PI / 30); 
  ctx.strokeStyle = "#D40000"; // цвет контура 
  ctx.fillStyle = "#D40000"; 
  ctx.lineWidth = 6; 
 
  ctx.beginPath(); 
  ctx.moveTo(-30, 0); 
  ctx.lineTo(83, 0); 
  ctx.stroke(); 
  ctx.restore(); 
 
  ctx.restore(); 
} 
window.onload = function() { 
  setInterval(clockPainting, 1000); // функция, перерисовывающая часы 
  //через равные промежутки времени 
}
<canvas id="canvas" height="150" width="150"></canvas>

READ ALSO
Легкая задача на js , где ошибка?

Легкая задача на js , где ошибка?

Всем привет, подскажите, пожалуйста, где ошибка у меня не работает ничего

175
Помогите удалить класс js

Помогите удалить класс js

Переделываю модальное окноЕсть одна кнопка с одним классом и 4 кнопки с другим классом, которые открывают одно и тоже модальное окно и добавляют...

286
Phaser.js, как сделать обработку событий?

Phaser.js, как сделать обработку событий?

Как обрабатывать события в Phaserjs ? Вот код приложения (в консоли получаю ошибку TypeError: Cannot read property 'onInputDown' of undefined)

203
последовательность операции boolean

последовательность операции boolean

какая будет последовательность операций? p == true && !(p && !q) && q != (r || !r && s || !s)

185