1

简要说明:

我制作了一个 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)

作为一种解决方法,我使用了 aprecidingCount var并且取决于它是否在增加,它可以决定触发哪个 requestAnimationFrame 回调;

问题:

有人可以解释为什么只存储和调用var分配给 requestAnimation 的操作不能像我预期的那样工作吗?

是否有更好的模式来停止重新启动 requestAnimation?

这是一支工作笔(查看从 180 到 182 的问题注释行)_

4

3 回答 3

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);
于 2015-08-13T13:08:43.617 回答
0

有人可以解释为什么只存储和调用分配给 requestAnimation 的 var 不能像我预期的那样工作吗?

您需要var在函数之外声明,如果var仅在函数中声明,则它仅限于该范围。

是否有更好的模式来停止重新启动 requestAnimation?

您继续需要停止/开始,只是不要请求下一帧。对于您可能想要使用无限循环的情况 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));

工作示例

SVG 眩晕(未完成)

于 2016-05-12T11:50:09.303 回答
0

我认为您的方法与常见用法不同。我建议在需要时调用它而不是启动/停止。

我在创建一个动画库时学到了这个教训,它非常简单而且很小。

https://github.com/allenhwkim/jsanimation

用法

import {slideInRight} from 'jsanimation';
slideInRight(el);
于 2019-04-24T23:23:52.197 回答