Canvas clearRect не работает с помощью Animate

#javascript #canvas

#язык JavaScript #холст

Вопрос:

Я использую технику анимированного рисования линий для создания линий между каждой из моих точек. Как только точка активирована, я хочу, чтобы старая точка была удалена. Я установил clearRect за пределами своего интервала, но он не удаляет старую строку. В моем предыдущем коде (до создания setInterval) все работало безупречно, с момента добавления setinterval не так много.

Вот сценарий только для очистки / создания. Спасибо вам за вашу помощь.

 function draw(st,en){  var c = document.getElementById("map_id");  var ctx = c.getContext("2d");  ctx.clearRect(0, 0, c.width, c.height);  ctx.translate(0.5, 0.5);  var amount = 0;    setInterval(function() {  amount  = 0.05; // change to alter duration  if (amount gt; 1) amount = 1;  ctx.clearRect(0, 0, c.width, c.height);  ctx.strokeStyle = "#ccc";  ctx.moveTo(st['x'], st['y']);  ctx.lineWidth = 5;  // lerp : a   (b - a) * f  ctx.lineTo(st['x']   (en['x'] - st['x']) * amount, st['y']   (en['y'] - st['y']) * amount);  ctx.stroke();  }, 30);  }  

Обновить **** Я нашел сообщение, касающееся моей проблемы. В нем говорится, что мне нужно включить beginPath. Я так и сделал, но теперь я вижу мерцание своих строк, что означает, что setInterval не останавливается после его завершения.

Таким образом, проверка завершения нарисованной линии для снятия интервала является решением. Почти на месте.

Ответ №1:

У вас есть решение моей проблемы.

Я отследил сумму var, чтобы определить, когда она достигла 1, с помощью окна if ( сумма == 1). clearInterval(map_int)

Проблема решена! Смотрите решение ниже

 function draw(st,en){  var c = document.getElementById("map_id");  var ctx = c.getContext("2d");  ctx.clearRect(0, 0, c.width, c.height);  ctx.translate(0.5, 0.5);  var amount = 0;    let map_int = setInterval(function() {  amount  = 0.05; // change to alter duration  if (amount gt; 1) amount = 1;  ctx.beginPath();  ctx.clearRect(0, 0, c.width, c.height);  ctx.strokeStyle = "#ccc";  ctx.moveTo(st['x'], st['y']);  ctx.lineWidth = 5;  // lerp : a   (b - a) * f  ctx.lineTo(st['x']   (en['x'] - st['x']) * amount, st['y']   (en['y'] - st['y']) * amount);  ctx.stroke();  if(amount == 1) window.clearInterval(map_int);  }, 15);  }