首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > flex >

【请问】怎样load一个mxml编译的swf

2012-02-21 
【请教】怎样load一个mxml编译的swf?我需要在一个.as文件中load一个swf文件,并调用里面的function。swf是从mx

【请教】怎样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
[解决办法]
你要保证别人开放了相应的函数给你使用。
[解决办法]

JScript code
<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);
}

以上权当参考...

热点排行