Flash Builder 4.6 Mobile Flex AS3:如何与嵌入式SWF进行通信

时间:2012-12-19 22:52:31

标签: actionscript-3 flash-builder flash communication

我有一个Flash条形码扫描仪(相机),想在移动项目中使用它来扫描QR码。很有可能重新使用此SWF并将其嵌入到移动Flex应用程序中。 SWF是在Flash CS5中制作的。

到目前为止,嵌入(并将其添加到舞台并显示)是成功的,但我如何与SWF进行通信?例如,调用它的函数或使用事件。

以下是代码段:

[Embed(source="../cam/cam.swf")]
private var cam:Class;

....
....

public const EVT_SNAPSHOT : String = "onSnapShot";
public var camera : Object;


public function onInit(e:Event) : void
{
 this.camera = new cam();
 this.camera.addEventListener(Event.ADDED_TO_STAGE, this.cameraInit );
 this.stage.addChild( this.camera as DisplayObject );
}

private function cameraInit(e:Event):void
{
 trace( 'Added to stage' );
 this.stage.addEventListener( EVT_SNAPSHOT, this.cameraDoScan ); // does not bind?
 trace( this.camera.hasOwnProperty('getAppInfo') ); // shows 'false'
}

private function cameraDoScan(e:MouseEvent):void
{
 trace('MouseClick!');
}

有谁知道与这个'东西'沟通?

1 个答案:

答案 0 :(得分:0)

使用外部swf模块的最有效方法是将其加载到当前的ApplicationDomain中,这样您就可以访问此加载的swf中包含的所有类:

package
{
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
import flash.utils.ByteArray;
import flash.utils.getDefinitionByName;

public class astest extends Sprite
{

    [Embed(source="/../assets/art.swf", mimeType="application/octet-stream")]
    private static const art:Class;

    public function astest()
    {
        var artBytes:ByteArray = new art() as ByteArray;
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onArtLoaded);
        loader.loadBytes(artBytes, new LoaderContext(false, ApplicationDomain.currentDomain));
    }

    protected function onArtLoaded(e:Event):void
    {
        var domain:ApplicationDomain = ApplicationDomain.currentDomain;
        if(domain.hasDefinition("welcome_view"))
        {
            var moduleClass:Class = domain.getDefinition("welcome_view") as Class;
            var module:Object = new moduleClass();
            //module.moduleFunction();
            addChild(module as DisplayObject);
        }else
        {
            trace("loaded swf hasn't class 'welcome_view'");
        }
    }
}
}