如何访问已加载的SWF的公共属性和方法

时间:2011-03-18 15:26:18

标签: flex actionscript-3 actionscript

您将如何调用在actionscript中加载的SWF的公共属性和方法?

我多年来一直使用stackoverflow来回答我的编程问题,所以我想通过编写一个问题的指南来回馈我在找出问题时遇到了很多麻烦。这是我的第一个用户指南,请告诉我是否有什么可以改进它。

3 个答案:

答案 0 :(得分:1)

闪存引擎的一个更强大的功能是通过使用Loader类在闪存程序中加载闪存程序的能力。不幸的是,与加载程序的通信是有限的。虽然您可以建立LocalConnection对象,但它可以安全支持的流量有限制。

一个简单的解决方案是在主程序的安全域中加载SWF文件。这样做的好处是可以将加载的SWF的公共方法和属性公开给加载器,反之亦然。

首先扩展Loader类,该类将用于与加载的文件进行交互。

public class ParentChildLoader extends Loader

接下来,我们必须将SWF文件存储为ByteArray。变量路径是系统上的文件路径。您可以使用URLStream对象而不是FileStream作为http url。

var swfBytes:ByteArray = new ByteArray();
var file:File = new File(path);
if (file.exists)
{
    var loadStream:FileStream = new FileStream();
    loadStream.open(file, FileMode.READ);
    loadStream.readBytes(swfBytes);
    loadStream.close();
}

现在我们将SWF存储为ByteArray,我们将SWF加载到安全域并监听完整事件。

var context:LoaderContext = new LoaderContext();
context.allowLoadBytesCodeExecution = true;
addEventListener(Event.COMPLETE, onSwfLoad);
loadBytes(swfBytes, context);

如果要从加载程序访问加载的SWF属性,请使用content属性。

Object(this.content).foo(bar);
Object(this.content).a = b;

如果要从SWF访问加载程序的公共属性,请使用父属性。

Object(this.parent).foo(bar);
Object(this.parent).a = b;

这有许多实际应用,允许通用功能的重复使用,从而减少创意团队的一些编程负担。注意事项;加载的SWF存在于主程序的安全域中,因此只使用此方法加载您信任的文件是关键。

答案 1 :(得分:1)

更简洁的方法是使用接口。这是一个例子。由两个项目组成。 Project 1(PluginLoader)是您的基础应用程序。该项目的一部分包括AS3接口:

/* IPlugin.as */
package
    {
        public interface IPlugin
        {
            function getID():String;
            function doStuff():void;
        }
    } 

然后,在第二个项目(TestPlugin)中加载的swf实现了接口:

package
{
    import flash.display.Sprite;

    public class TestPlugin extends Sprite implements IPlugin
    {
        private const _ID:String = "TestPlugin";

        public function getID():String {
            return _ID;
        }

        public function doStuff():void {

            trace('Test plugin: Doing Stuff');
        }
    }
}

该接口将通过源文件或swc。

包含在该项目中

然后加载它(回到PluginLoader项目中):

    public class PluginLoader extends Sprite
    {
        public function PluginLoader()
        {
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
            loader.load(new URLRequest('plugins/TestPlugin.swf'));
        }

        private function completeHandler(e:Event):void {
            var plugin:IPlugin = e.target.content as IPlugin;
            trace(plugin.getID());
            plugin.doStuff();

        }
    }
}

答案 2 :(得分:0)

我不得不就你的做法不同意你。在我看来,这是“黑客”。有一个原因是你与加载的swfs进行了有限的沟通,这是因为你不知道他们做了什么以及他们如何管理它们。

如果你想在架构上谈话,这是一种尝试访问信息的非常糟糕的方式。主应用程序不应该访问已加载的swf中的属性。如果您正在构建一个大型应用程序并且加载的swf(可能是一个模块?)需要主应用程序具有的信息,那么您应该研究像Parsley这样的应用程序框架,它执行依赖注入以提供您加载的swf所需的数据。这是一种更清洁的方法,在建筑上是合理的。