【请教】怎样load一个mxml编译的swf?
我需要在一个.as文件中load一个swf文件,并调用里面的function。
swf是从mxml文件生成的,用flex 4 的sdk通过ant编译的。
我用的代码如下:
private function getSWFString():void
{
swfLloader = new Loader();
var contextoaderContext = new LoaderContext(false,ApplicationDomain.currentDomain);
context.applicationDomain = new ApplicationDomain();
swfLloader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadSWFComplete);
swfLloader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onLoadSWFComplete);
swfLloader.load(new URLRequest("./mxmlTestApps/HtmlTest.swf"));
}
private function onLoadSWFComplete (event:Event):void
{
assertTrue("Error loading swf",!(event is ErrorEvent));
var canvas:Canvas = testApp.getDisplayObject();
s = new Sprite();
canvas.rawChildren.addChild(s);
s.addChild(swfLloader);
var result:String = swfLloader.content["onClick"]();
}
我用上面的代码可以正常处理as文件生成的swf文件。
为了处理mxml文件生成的swf,我替换了最后一行为:
SystemManager(swfLloader.content).application["onClick"];”。
运行的时候会报错:“TypeError: Error #1009: Cannot access a property or method of a null object reference.”
event.target.loader.content.application 确实为null。
我之所以用ant编译,是因为如果用flash builder编译,在load的时候会报错:
param 2 incompatible
virt Object mx.managers::SystemManager/callInContext()
over * _HtmlTest_mx_managers_SystemManager/callInContext()
VerifyError: Error #1053: Illegal override of _HtmlTest_mx_managers_SystemManager in _HtmlTest_mx_managers_SystemManager.
at global$init()
下面是我用的mxml文件,谁给看一下是哪里的问题?
<?xml version="1.0" encoding="UTF-8"?><Application height="600" width="800" xmlns:flow="http://ns.adobe.com/textLayout/2008" xmlns:local="*" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns="library://ns.adobe.com/flex/spark"><fx:Script>
import flashx.textLayout.conversion.ConversionType;
import flashx.textLayout.conversion.TextConverter;
import flashx.textLayout.elements.TextFlow;
public function onClick():void
{
trace(TextConverter.export(textExample.content as TextFlow, TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.STRING_TYPE) as String);
}
</fx:Script><Group><RichText id="textExample" x="10" y="10" fontSize="14" tabStops="s700" whiteSpaceCollapse="preserve" height="600" width="800" click="onClick()" paragraphSpaceAfter="15" textIndent="15" paddingLeft="4" paddingTop="4" fontFamily="Times New Roman"><content><div><p paragraphEndIndent="40"><span fontSize="12">There are many </span><span fontStyle="italic" fontSize="12" fontWeight="bold">such</span><span fontSize="12"> lime-kilns in </span><span textDecoration="underline" fontSize="12">that</span><span fontSize="12"> tract of country, for the purpose of burning the </span><span fontSize="18">white marble</span><span fontSize="12"> which composes a large part of the substance of the hills. </span></p><p textAlign="end" textIndent="0"><span fontSize="12">The man who now watched the </span><span color="0xcc0000" fontSize="12">fire</span><span fontSize="12"> was of a different order, and troubled himself with no thoughts save the very few that were requisite to his business. </span></p></div></content></RichText></Group></Application>
[解决办法]
代码太长,且格式太乱,不好查看,不过在多个flex的mxml文件中来回交互的话,最佳的方案是Module,有专门的flex Module可以使用
新建一个Module即可,代码和Application一样,就是原先的<mx:Application>标签需要换成<mx:Module>
使用ModuleLoader来进行载入,这样就可以实现交互了
你现在使用的方案是没有ApplicationDomain的,所以会得到null的结果,而module方案则会有相应的domain。详细可以查看上述中的相关API
[解决办法]
你要保证别人开放了相应的函数给你使用。
[解决办法]
<mx:SWFLoader x="114" y="333"/>
[解决办法]
一样的,AS里用new的就好了,new好了设了属性加到容器中
[解决办法]
别人生成的swf,里面的函数是否提供了对外的访问接口啊!如果没有提供,你想什么方法都没有用的
[解决办法]
给你个参考,不知有没有用.
1 页面加载 swf文件,加载的同时,把当前对象传导 swf 文件中,
setApp 就是 swf文件中的function .
<mx:SWFLoader id="myloader"
scaleContent="true"
creationComplete="onSwfLoaded(event)"
autoLoad="true"/>
private function onSwfLoaded(event:Event):void
{
myloader.load(swfPath);
myloader.addEventListener(Event.COMPLETE, loaderHandler);
}
private function loaderHandler(event:Event):void
{
Object(myloader.content).setApp(this);
}
2 在swf文件有一个button,单击它,关闭当前加载swf文件的页面,也即是 该button调用 exit function
public function exit(event:Event):void
{
PopUpManager.removePopUp(this);
}
[解决办法]
就這麼一小段
為甚麼不能寫成module?
[解决办法]
<mx:SWFLoader id="myloader"
scaleContent="true"
creationComplete="onSwfLoaded(event)"
autoLoad="true"/>
swf文件中做一个method, 目的是传过去当前的SWFLoader ,这样就不会为空了。
private function loaderHandler(event:Event):void
{
Object(myloader.content).setApp(this);
}
以上权当参考...