Как управлять скоростью анимации в canvas?

94
05 ноября 2019, 07:50

Коллеги, как думаете, как я могу под конец анимации плавно замедлять отрисовку круга? Опыт javascript = junior.

P.S. Обновил js , добавил функцию анимации, нашел здесь http://kodhus.com/easings/ Понять бы как это юзать правильно

let canvas = document.querySelector('#cvs'); 
let ctx = canvas.getContext('2d'); 
let levelOfKnowledge = document.querySelector('#percent'); 
let nameOfKnowledge = 'HTML'; //имя знания 
let pi = Math.PI; 
let coefficient = pi * 2 / 100; 
let min = 0; //точка старта анимации 
let maxPercent = 78; //процент знаний 
let circleStyle = 50; 
 
//функция которая вроде как должна помочь с плавностью анимации 
// t: current time/currnet step 
// b: starting position 
// c: amount of change (end - start) 
// d: total animation time/steps 
function easeInOutQuart(t, b, c, d) { 
  if ((t/=d/2) < 1) return c/2*t*t*t*t + b; 
  return -c/2 * ((t-=2)*t*t*t - 2) + b; 
} 
 
let start = 0; 
let frameRate = 60 / 1000; 
let duration = 1000; 
let currentStep = 0; 
let newStep = 0; 
 
let draw = () => { 
  ctx.clearRect(0, 0, canvas.width, canvas.height); 
  currentStep++; 
  newStep = easeInOutQuart(currentStep, start, start - maxPercent, frameRate * duration); //запишу в переменную что бы читалось лучше 
   
  ctx.beginPath(); 
  ctx.strokeStyle = "hsl(190, 80%," + circleStyle + "%" + ")"; 
  ctx.lineWidth = "30"; 
  ctx.arc(150, 150, 100, 0, min / newStep, false); // использую здесь 
  ctx.stroke(); 
  levelOfKnowledge.innerHTML = `${nameOfKnowledge}  ${Math.round(min)} %`; 
  min++; 
  circleStyle--; 
   
   
  if (min <= maxPercent) { 
    requestAnimationFrame(draw); 
  } else { 
     
    // alert(`Мой скилл ${nameOfKnowledge} равен ${maxPercent}% ✔`) 
  } 
   
}; 
 
draw();
canvas { 
  border: 1px solid #000; 
} 
 
#percent { 
  color: green; 
  position: absolute; 
  left: 20px; 
  bottom: 20px; 
} 
 
.doghnuts { 
  display: flex; 
  flex-direction: row; 
  align-items: center; 
  position: relative; 
}
<div class="doghnuts"> 
  <canvas width="350" height="350" id="cvs"></canvas> 
  <div id="percent"></div> 
</div>

Кому удобно на codepen: https://codepen.io/likeavenus/pen/XGdpzN

p.s. Нашёл такую функцию, вроде как должна помочь, но пока не работает так как нужно. В описании сказано:

t: current time/currnet step

b: starting position

c: amount of change (end - start)

d: total animation time/steps

function easeInOutQuart(t, b, c, d) {
  if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
  return -c/2 * ((t-=2)*t*t*t - 2) + b;
}
READ ALSO
Проблема с слайдером цен и чекбоксами

Проблема с слайдером цен и чекбоксами

Помогите пожалуйстаКак сделать так чтобы значения чекбоксов прибавлялись к Общей стоимости моего калькулятора? Спасибо

120
Как парсить тело POST-запроса в NodeJS?

Как парсить тело POST-запроса в NodeJS?

Отправляю следующий запрос к серверу:

115
Как работают замыкания в JavaScript

Как работают замыкания в JavaScript

Как сказал Альберт Эйнштейн:

123
Как сделать функцию на два элемента?

Как сделать функцию на два элемента?

написала скрипт эмуляции проверкиНа первом элемента все работает, на втором - нет

128