1

Краткое объяснение:хранения requestAnimationFrame

Я сделал requestAnimation, который в качестве альтернативы имеет 2 обратных вызовов в зависимости от счетчика;

один из обратных вызовов будет увеличивать счетчик, а другой уменьшит его (всегда зацикливаясь внутри определенного диапазона 0 // arr.length).

Все работает, как не ожидается до остановки и перезапуска анимации,
это код, который активирует и должен Хранить requestAnimationFrame (click()):

function start() { 
     if (!spiral) { 
      spiral = window.requestAnimationFrame(animation); 
     } 
    } 

function click() { 
     if (spiral) { 
      var trackSpiral = spiral; 
      spiral = undefined; 
      window.cancelAnimationFrame(spiral); 

     } else { 

      spiral = trackSpiral; 
    /* (count > precedingCount || count == 0) ? 
        spiral = requestAnimationFrame(animation) : 
        spiral = requestAnimationFrame(animationReverse);*/    
     } 
    } 
     window.addEventListener('load', start) 

     window.addEventListener('click', click) 

В качестве обходного пути я использовал precidingCount var и в зависимости от того, будет ли он увеличиваться или нет, он может решить, какой запрос обратного вызова RequestAnimationFrame должен срабатывать;

Вопросы:

Может кто-нибудь объяснить, почему просто хранить и ссылаясь на var назначенную requestAnimation не работает, как я ожидал?

Есть ли лучший шаблон для остановки-перезагрузки requestAnimation?

here's a working pen (чтобы увидеть выпуск строки комментариев от 180 до 182) _

+3

'requestAnimationFrame' получает вас ровно один кадр. Это больше похоже на 'setTimeout', чем' setInterval'. Чтобы получить следующий, вы должны попросить его снова.Отмена только для редкого случая, когда вы хотите отменить его до его выполнения, который, как правило, составляет несколько десятков миллисекунд после запроса. –

+0

Разве вы не должны сначала «cancelAnimationFrame (спираль)», только тогда 'spiral = undefined'? – raina77ow

+0

@ raina77ow Я согласен; но он также будет работать наоборот .. – maioman

ответ

1

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

var animating = false; 

function tick() { 
    if (!animating) return; 
    animate();       // do one step of animation 
    window.requestAnimationFrame(tick); // request next frame 
} 

function click() { if (animating = !animating) tick(); } 

window.addEventListener('load', click); 
window.addEventListener('click', click); 
+0

вы, например, похожий на элегантный способ иметь флаг, сообщающий нам, является ли анимация истинным и в конечном итоге прекратит рекурсию, когда false (Я представляю, что это то, что вы имели в виду, потому что это не в коде - [скрипка] (http://jsfiddle.net/daxeuwuL/)); более или менее то, что я делаю, присваивая requestAnimation переменной и «undefining» ее при остановке; это правильно или я что-то упускаю? – maioman

+0

SOrry, я отказался от важной строки, чтобы выйти раньше, чем 'tick', когда' animating' является 'false'. –

+0

Не совсем. Возвращаемое значение из RAF в значительной степени бесполезно, оно обеспечивает не что иное, как способ преждевременного отмены текущего ожидающего запроса. Вы не хотите устанавливать и отменять эту переменную. Вы хотите иметь флаг, который определяет, выполняются ли последующие вызовы RAF. –

0

Может кто-нибудь объяснить, почему просто хранить и вспоминая вар назначены requestAnimation не работает, как я ожидал?

Вы должны объявить var вне функции, если var объявлен только в функции, тогда он ограничен этой областью.

Есть ли лучший шаблон для остановки повторного запросаAnimation?

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

(function rAF(){ 
    // animate .... call again 
    rAF_id = window.requestAnimationFrame(rAF) 
}(); 
// .. wait ... cancel 
setTimeout(window.cancelAnimationFrame(rAF_id), 5000) 

Следующий код должен начинаться forwardAnimation, остановить forwardAnimation, начать reverseAnimation, остановить reverseAnimation и повторить.

(function(callback1, callback2, animating) { 

    callback = callback1; 

    function click() { 
    if (animating = !animating) { 
     callback = callback !== callback1 ? callback1 : callback2; 
     (function loop() { 
     rAF = window.requestAnimationFrame(loop); 
     callback(); 
     })(); 
    } else { 
     window.cancelAnimationFrame(rAF); 
    } 
    } 

    window.addEventListener("load", function load() { 
    click(); 
    window.removeEventListener("load", load); 
    window.addEventListener('click', click); 
    }); 
}(forwardAnimation, reverseAnimation)); 

Working Example

SVG Vertigo (незаконченный)

+0

почему голосует ?, общий пример работает! – TarranJones

Смежные вопросы