БлогNot. Простая анимация на JavaScript в элементе canvas

Простая анимация на JavaScript в элементе canvas

1. Делаем горизонтальный рисунок-ленту, показывающий фазы движения объекта, в простейшем случае такой:

фазы движения объекта, рисунок images.png
фазы движения объекта, рисунок images.png

Рисунок должен легко "нарезаться" на кусочки одинаковой ширины и мы знаем количество этих кусочков (в данном случае - шесть).

2. Пишем функцию animate, аргументами которой будут:

  • id элемента для размещения канвы, а канву скрипт создаст сам по размерам рисунка (поделив его ширину на количество кадров в рисунке);
  • URL рисунка;
  • количество кадров по горизонтали в рисунке, в принципе, функция drawFrame может учесть и кадры, расположенные по вертикали (см. в коде);
  • количество кадров анимации в секунду, которое мы хотим установить.

По загрузке рисунка (img.onload) создаётся канва и вычисляются размерные величины.

Добавим также код, останавливающий анимацию при наведении мыши на канву и возобновляющий при убирании, чтобы ситуация отличалась от простого вывода анимированной gif'ки.

Сама анимация будет выполняться стандартным методом requestAnimationFrame, который мы заставим выполняться нужное количество раз в секунду с помощью обычного метода setInterval.

3. Запускаем функцию-обёртку animate по загрузке страницы.

Вот скрипт в работе и исходник:

<div id="animateDemo" style="margin: 0 auto; text-align: center;"></div>
<script>
 function animate(id,url,steps,fps) {
  let canvas, ctx, img, imgWidth, timerId = null;
  let currentLoopIndex = 0;
  
  img = new Image();
  img.src = url;
  img.onload = function() {
   canvas = document.createElement('canvas');
   ctx = canvas.getContext('2d');
   imgWidth = Math.floor (this.width / steps);
   canvas.width = imgWidth; 
   canvas.height = this.height;
   canvas.onmouseover = function () { clearInterval(timerId); };
   canvas.onmouseout = function () { init(); };
   document.getElementById(id).appendChild (canvas);
   init();
  };

  function drawFrame(frameX, frameY, canvasX, canvasY) {
   //https://developer.mozilla.org/ru/docs/Web/API/CanvasRenderingContext2D/drawImage
   ctx.drawImage(img,
    frameX * imgWidth, frameY * canvas.height, imgWidth, canvas.height,
    canvasX, canvasY, imgWidth, canvas.height
   );
  }

  function step() {
   ctx.clearRect(0, 0, canvas.width, canvas.height);
   drawFrame(currentLoopIndex, 0, 0, 0);
   currentLoopIndex++;
   if (currentLoopIndex >= steps) currentLoopIndex = 0;
  }

  function init() {
   timerId = setInterval( function() { window.requestAnimationFrame(step); }, 1000 / fps);
  }
 }

 window.addEventListener ('load', function (e) {
  animate('animateDemo','images.png',6,5); 
   //id элемента для размещения канвы, 
   //URL рисунка, 
   //количество кадров по горизонтали в рисунке, 
   //количество кадров в сек.
  }
 );  
</script>
<noscript>
 <div style="margin: 0 auto; text-align: center;">
  Включите в браузере JavaScript для работы приложения!
 </div>
</noscript>

В исходнике предполагается, что файл рисунка images.png находится в той же папке, что и скрипт.

06.03.2020, 21:29 [1543 просмотра]


теги: javascript графика время

К этой статье пока нет комментариев, Ваш будет первым