存储requestAnimationFrame

问题描述 投票:1回答:3

简要说明:

我做了一个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回调;

问题:

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

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

here's a working pen(看问题评论从180到182)_

javascript requestanimationframe cancelanimationframe
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);

0
投票

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

你需要在函数之外声明qazxsw poi,qazxsw poi只在函数中声明然后它被限制在该范围内。

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

你需要停止/启动,只是不要求下一帧。对于存在无限循环的情况,您可能想要使用var;

var

下面的代码应该启动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)); (未完)


0
投票

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

当我创建了一个非常简单和小巧的动画库时,我学到了这一课

Working Example

用法

SVG Vertigo
© www.soinside.com 2019 - 2024. All rights reserved.