Flash Player在视口外停止动画

时间:2012-12-04 10:44:45

标签: javascript actionscript-3 flash

我在网站上有几部flash电影。它们都循环播放动画,持续约15秒(但这不是一成不变的)。它们都开始同时播放并且同步。

但是,当我调整浏览器窗口大小或滚动页面时,如果Flash视频实例不在视口中,它将停止播放。当它返回到视口时,它会恢复,然后与其他Flash播放器实例不同步。

我认为这是一个Flash播放器优化。无论如何都可能通过JS / AS3禁用此行为?它似乎发生在Windows上的Firefox和Chrome中。

更新

只是澄清一下。我有使用本地连接和ExternalInterface来同步广告的方法。我正在寻找的方法是禁用 FlashPlayer的“优化”,这会导致帧速率大幅降低。

3 个答案:

答案 0 :(得分:2)

您无法停用此功能。当闪存应用程序不可见时,它可以降低内存和CPU使用率。

可供您使用的是Throttle API。这是一个专用API,允许Flash应用程序的创建者在其应用程序将被减速/限制时完全通知。

这是一个例子。

addEventListener(ThrottleEvent.THROTTLE, onThrottleEventHandler);

function onThrottleEventHandler(e:ThrottleEvent):void
{
    if(e.state == ThrottleType.THROTTLE)
    {
        /**
         * the player is about to be slowed down to a frame rate
         * set in e.targetFrameRate
         */
    }
    else if(e.state == ThrottleType.PAUSE)
    {
        /**
         * the player is going to be paused completely, AKA 0 fps
         */
    }
    else if(e.state == ThrottleType.RESUME)
    {
        /**
         * the player is now back to normal as it has resumed
         * from the paused or throttled state
         */
    }
}

现在你可以找到一种最适合你的方式,但我的建议是存储当通过限制或暂停时经过的当前时间:

currentTime = getTimer();

然后计算应用程序恢复使用后经过的时间:

passedTime = getTimer() - currentTime;

然后用这些信息做你喜欢的事。

希望这有帮助,因为您熟悉Throttle API,应该为您提供更大程度的控制。有关它的更多信息,请在以下文档中查看:ThrottleEvent

答案 1 :(得分:0)

我相信这种行为是正常的,它是一种从未修复过的闪存错误。

我相信吸气可能会给你一个解决方案,但不会出现在enter_frame事件中。那只是野蛮的。

我会做的是:

创建一个计时器事件..每隔X秒......所以它会调用一个checkFunction, 在我的checkFunction()中。我会检查我的所有movieClips是否同步。 如果我发现1不是..生病了一个简单的gotoAndPlay(xFrame);

    var aMovieClips:Array; //get all ur movieclips into this array.

    var timeToCheck = 1000; //time to check for a unsincronized movieclip
    var time:Timer=new Timer(timeToCheck,0);//do inifinite call each 1000 seconds
    time.start();
    time.addEventListener(TimerEvent.TIMER, checkFunction);

    public function checkFunction(e:TimerEvent):void
    {
    var aCurrentFrames:Array;
    for (var n:int = 0;n<aMovieClips.length();n++)
        aCurrentFrames.push(aMovieClips[n].currentFrame);
    //so now u have all current frames of all movie clips.. so u can add a
    //gotoAndPlay(x); to any unsyncronized movieclip  
    }

答案 2 :(得分:0)

如果每个SWF同步进展非常重要,我会用JavaScript控制它。

假设每个SWF文件都是一个简单的MovieClip,我会这样做:

将每个FLA文件的文档类设置为:

package {
    import flash.display.MovieClip;
    import flash.external.ExternalInterface;

    public class ExternalInterfaceControlledMC extends MovieClip {

        public function ExternalInterfaceControlledMC() {
            this.stop();
            if (ExternalInterface.available) {
                try {
                    ExternalInterface.addCallback("setFrame", jsSetFrame);
                } catch (error:Error) {
                    trace("An Error occurred:", error.message);
                }
            } else {
                trace("ExternalInterface is not available");
            }
        }

        private function jsSetFrame(value:String):void {
            var frameNumber = int(value) % this.totalFrames;
            this.gotoAndStop(frameNumber);
        }
    }
}

在JavaScript中,您可以将每个SWF实例的引用添加到数组中,然后使用计时器告诉每个SWF进展到帧编号。

var swfElements; //Array
var currFrame = 1;

function onPageLoad() {
    //Init timer
    setInterval("progressFrame", 1000 / 30); //30 fps
}

function progressFrame() {
    for (var i = 0; i < swfElements.length; i++) {
        swfElements[i].setFrame(currFrame);
    }
    currFrame++;
}

请注意,此代码的任何内容均未经过测试,仅用于说明我的思路。