AS3加载AS2的swf文件报错

今天做一个demo,要用as加载一个swf,报错“如果AVM1 内容AS1 AS2已加载到 AVM2 (AS3) 内容中则不可将其移动到 displayList 的其他部分

以下是在网上找到的解决方案

问题描述:我们都知道flash player有两个虚拟机AVM1和AVM2。前者是flash player9以下的版本运行时所需要的,它用来解析as1和as2。后者是专门为as3开发的,用来解析as3。
我用flash player10加载了一个player8及以下的swf(2.0的),并且把content添加到显示列表中。结果就出现这样的问题。
ArgumentError: Error #2180: 如果 AVM1 内容(AS1 或 AS2)已加载到 AVM2 (AS3) 内容中,则不可将其移动到 displayList 的其他部分。
at flash.display::DisplayObjectContainer/addChild()
at flash.display::Stage/addChild()
at _fla::MainTimeline/com()
经测试,只有flash player10以上得版本会出这样的问题,换成9就没问题了。不知道player10是什么搞的,用的不是AVM2吗?也就是只要你用player 10加载player9以前版本发布的swf就会出错。
问题分析:我们来看看错误描述,“如果 AVM1 内容(AS1 或 AS2)已加载到 AVM2 (AS3) 内容中,则不可将其移动到 displayList 的其他部分”。说明as1或as2已经加载进来了,只是有把它移动到其他的现实列表导致这样的问题。
问题解决:直接把加载swf的loader加载到显示列表,这样就不会出问题。
归根结底,ADOBE其实认为正规的做法是将loader直接作为displayObject进行addChild即可,通过建立中转的方式会导致这部分长驻内存,除非关闭FLASHPLAYER否则释放不了。

 

package
{
 import flash.display.*;
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.net.URLRequest;

 public class Test extends Sprite
 {
  var pictLdr:Loader;
  var pictURL:String = "test.swf"
  var pictURLReq:URLRequest;
  
  public function Test()
  
  {
   pictLdr = new Loader();
   pictURLReq  = new URLRequest(pictURL)
   pictLdr.load(pictURLReq);
   pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);
  }
  
  function imgLoaded(event:Event):void
  {
   this.addChild(pictLdr);
  }

 }
}

posted @ 2012-03-13 17:49  深圳-宝爷  阅读(1088)  评论(0编辑  收藏  举报