0

我有一个应用程序可以加载一些 XML,并设置一种幻灯片,其中每张幻灯片可以包含多个资产,例如图像和 SWF。当我直接从(通过 Apache 提供服务)加载所有内容时localhost,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.OPEN, ProgressEvent.PROGRESSEvent.INIT然后在其余ProgressEvent.PROGRESS事件之间的某个时间,它会播放,然后以HTTPStatusEvent.HTTP_STATUSand结束Event.COMPLETE

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

4

2 回答 2

1

在正在加载的 SWF 中,在第一帧上放置一个停止点。在您的 onLoadComplete 函数中,在加载的 swf 上调用 init() 函数。在那个函数中,你会告诉加载的 swf 播放,或者 gotoAndPlay('label' or frame number)。

或者,在正在加载的 SWF 中,添加 AdditionalToStage 事件侦听器并在该事件执行时调用 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
}
于 2013-09-04T22:10:25.270 回答
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 在发射之前就开始播放了,但它似乎并没有受到伤害。

于 2013-09-05T06:52:53.563 回答