【问题标题】:How to embed swf and load at runtime?如何在运行时嵌入 swf 和加载?
【发布时间】:2012-12-08 23:53:01
【问题描述】:

我正在尝试加载嵌入式 swf(充当声音库)。由于它是一个大型 swf,我想在运行时加载它,并有一个加载器栏指示加载了多少。

在网上做了一些研究,我发现使用mimeType="application/octet-stream" 可以做到这一点。 然而,结果是嵌入的 swf 仍然在加载主/包装 swf 的同时加载。因此,由于某种原因,当我到达第一行代码时(在本例中为 LoadTest 构造函数),整个嵌入式 swf 已经加载。我发现的大多数示例都与 Flex 相关,并且我使用的是 100% as3 项目(在 FlashDevelop 中),但我认为这没有任何不同的原因。

这是我正在使用的类(真正的类要复杂得多,但这将是加载嵌入式 swf 的基本机制)

package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.system.LoaderContext;

public class LoadTest extends Sprite {

    [Embed(source = "soundLib.swf", mimeType="application/octet-stream")]
    private var _soundLibSWFClass:Class;
    private var _assetLdr:Loader;

    public function LoadTest():void {
        this._assetLdr = new Loader();
        this._assetLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, this.handleComplete);
        this._assetLdr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, this.handleProgress);
        this._assetLdr.loadBytes(new _soundLibSWFClass(), new LoaderContext(false, this._assetLdr.contentLoaderInfo.applicationDomain));

        trace("start");
    }
    public function handleComplete(event:Event):void {
        trace("complete");
    }
    public function handleProgress(event:ProgressEvent):void {
        trace("progress " + event.bytesLoaded +", "+ event.bytesTotal);
    }

}
}

这是我在输出中得到的:

progress 0, 2411787
progress 2411787, 2411787
start
complete

这里有更多关于嵌入式 swf 的信息以及我目前尝试过的东西:

  • 声音库是在 Flash cs5 中创建的,所有声音都位于库中并具有适当的标识符。
  • 嵌入式 swf 的阶段为空。
  • 使用“在框架中导出类”选项,我厌倦了 1 和 2,但这并没有什么不同。
  • 我在加载其他 swf 库(例如包含电影剪辑)时遇到了同样的问题,但声音库似乎在测试中使用起来最直接
  • 我在不同的服务器上对此进行了测试
  • 我在每次测试前清除了缓存。
  • 我使用了带宽模拟来 100% 确定加载整个内容需要一段时间。
  • 即使我删除了所有加载程序的东西,主 swf 仍然需要一些时间来加载,这表明嵌入式 swf 是同时加载的。

希望任何人都可以帮助我解决这个问题,或者有另一种在运行时加载嵌入式 swf 的方法(基本上我需要一个 swf 而不是一次加载整个东西)。

谢谢!

【问题讨论】:

  • 感谢先生告诉我如何设置嵌入式 SWF 的 LoaderContext :D

标签: actionscript-3 flash embed loader


【解决方案1】:

Embed-tag 用于在编译时将数据烘焙到 swf 中。您要使用的是 Loader-object 上的 .load -function,并完全删除 Embed-tag。

this._assetLdr.load(new URLRequest("soundLib.swf"));

当然,您还需要确保 soundLib.swf 与您编译的 swf 位于同一文件夹中。

【讨论】:

  • 问题是该方法需要两个 swf 文件,而我希望将所有内容都放在一个 swf 中。
  • 作为库的 swf 文件与运行时加载的图像文件或任何其他资产没有什么不同。拥有两个 .swf 文件并不重要。只有其中一个处于控制之中。
  • 问题是在这种特殊情况下我只需要一个 swf。由于可以在 Flash SDK 中开发流式 swf hwen(将加载程序放在第一帧,将其余内容放在第二帧),在创建纯 as3 项目时也应该可以,对吧?
猜你喜欢
  • 1970-01-01
  • 2012-09-10
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 2010-10-10
  • 1970-01-01
相关资源
最近更新 更多