MovieClipSWFLoader根据我的意愿自动播放,但仅限于慢速连接

时间:2013-09-04 18:00:41

标签: actionscript-3 flash flex

我有一个加载一些XML的应用程序,并设置一种幻灯片,每张幻灯片可以包含多个资源,例如图像和SWF。当我直接从localhost加载所有内容(通过Apache提供)时,SWF不会自动播放,但如果我使用Charles将速度限制为localhost,它会在SWF完成加载之前开始播放,并且在包含SWF可见。

我正在使用

创建我的加载器
var loader:MovieClipSWFLoader = new MovieClipSWFLoader();

loader.smoothBitmapContent = true;
loader.autoLoad     = true;
loader.scaleContent = false;
loader.trustContent = true;
loader.autoStop     = true;
loader.maintainAspectRatio = true;
loader.showBusyCursor = false;
loader.x            = data.@posX;
loader.y            = data.@posY;
loader.width        = data.@width;
loader.height       = data.@height;
loader.source       = (new URLRequest(data.@url)).url; // Using URLRequest because data contains relative URLs, and the loader doesn't like that (thinks it's a path maybe?)

其中data是一个简短的XML片段,包含应用程序需要知道的内容。一个例子是<swf posX="10" posY="50" width="100" height="100" url="swfs/1.swf"/>

这个特定的SWF有一个在第9帧播放的声音,最终在SWF应该在舞台上可见之前在后台播放。无论SWF加载速度多快,它都可以在应用程序显示SWF时运行。

我还尝试将autoLoad设置为false并手动调用load(),但它仍然会发生。与调用gotoAndStop(1)gotoFirstFrameAndStop()一样无效。

添加一些trace - 调用触发的事件时,我会Event.OPENProgressEvent.PROGRESSEvent.INIT,然后在{{1}的其余部分之间在完成ProgressEvent.PROGRESSHTTPStatusEvent.HTTP_STATUS之前播放的事件。

该应用程序使用Flex 4.6编译并使用Flash Player 11.7.700.169进行测试

2 个答案:

答案 0 :(得分:1)

在加载的SWF中,在第一帧上设置一个停靠点。在onLoadComplete函数中,在加载的swf上调用init()函数。在该函数中,您将告诉加载的swf播放,或gotoAndPlay('label'或帧号)。

或者,在加载的SWF中,添加一个AddedToStage事件监听器并在该事件执行时调用init()函数:

if( stage )
{
    init();
}
else
{
    addEventListener( Event.ADDED_TO_STAGE, onAdded );
}

function onAdded( evt:Event ):void
{
    removeEventListener( Event.ADDED_TO_STAGE, onAdded );

    init();
}

function init():void
{
    // start your loaded swf playing or doing something
}

答案 1 :(得分:0)

由于我并不总是控制SWF,因此Ribs的回答并不总是有效,但对于我自己创建的那些,我打算添加类似的代码,只是为了格外小心。

我设法通过向每个单独的事件监听器添加gotoFirstFrameAndStop()来使其工作,当它工作时,逐个删除,直到我只有真正需要的那些。

对于其他遇到同样问题的人,我添加了

loader.addEventListener(Event.INIT, stopAutoplayingSWF);
loader.addEventListener(Event.COMPLETE, stopAutoplayingSWF);

private function stopAutoplayingSWF(e:Event):void
{
  (e.currentTarget as MovieClipSWFLoader).gotoFirstFrameAndStop();
}

可能不需要Event.COMPLETE上的最后一个,因为SWF在它被解雇之前开始播放,但它似乎没有受到伤害。