【问题标题】:MovieClipSWFLoader autoplays against my wishes, but only on slow connectionsMovieClipSWFLoader 会违背我的意愿自动播放,但仅限于慢速连接
【发布时间】:2013-09-04 18:00:41
【问题描述】:

我有一个应用程序可以加载一些 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,然后在其余ProgressEvent.PROGRESS事件之间的某个时间,它会播放,然后以HTTPStatusEvent.HTTP_STATUSEvent.COMPLETE

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

【问题讨论】:

  • 注意到 Flash Player 11.8 是可用的最新版本。升级了,还是有问题

标签: actionscript-3 flash apache-flex


【解决方案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
}

【讨论】:

  • 这有时是可能的,但如果我不总是创建要加载的 SWF 怎么办?有时我只是递给我一个,并且想避免重新创建它
  • 您可以尝试在加载 swf 时调用 stop() 或 gotoAndStop(1),但如果您所说的在 onComplete 触发之前播放的 swf 是准确的,那么您可能不走运。你需要阻止 swf 播放,只有在它开始做自己的事情之前你可以控制它才能发生这种情况。
【解决方案2】:

由于我并不总是控制 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 在它触发之前就开始播放,但它似乎没有伤害。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2011-06-17
    • 2017-04-22
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多