Это вопрос математики:
drawRing(384, 384, 384, 20, seconds / 60, 3 / 2 * Math.PI, false);
Это линия, которая рисует круг секунд. Так что проблема в том, что в любой момент у вас есть что-то вроде 34/60, 35/60 и так далее. Это означает, что ваш круг секунд равен 60/60, поэтому не использует миллисекунды и рисует его каждую секунду.
Линейное решение для ослабления: заставьте ваши секунды вращаться 60 000/60 000 -> 60 секунд на 1000 миллисекунд каждая. И математика:
drawRing(384, 384, 384, 20, ((seconds*1000)+milliseconds) / 60000, 3 / 2 * Math.PI, false);
Решение In Out Quadric или выберите одно this :
Math.easeInOutQuad = function (t, b, c, d) {
t /= d/2;
if (t < 1) return c/2*t*t + b;
t--;
return -c/2 * (t*(t-2) - 1) + b;
};
И я оптимизировал и изменил ваш код:
//+1 animation happens before the second hand
//-1 animation happens after the second hand
animatedSeconds = seconds+1;
if (milliseconds > 10) {
if (!startValue) { startValue = milliseconds; }
if (milliseconds - startValue <= 100) {
animatedSeconds -= -0.5+ Math.easeInOutQuad(milliseconds - startValue, startValue, 1000 - startValue, 125) / 1000;
}
} else {
startValue = 0;
}
drawRing(384, 384, 384, 20, animatedSeconds / 60, 3 / 2 * Math.PI, false);
Надеюсь, это то, что вы ищете.