操作子SWF(三)外部SWC

发表评论 阅读评论

加载SubSWF后,使用反射可以轻松获取到SubSWF里的所有Class,但是前提需要知道他们的完全限定名.对于大型项目如果大量使用硬编码来写类名会很容易将类名拼写错误,排错会浪费掉很多的时间.有没有一个好方法来避免这种错误呢,那就是让编译器来帮忙排错吧.

流程

  1. 将每个素材分别都做成库元件.
  2. 将每个素材的库元件绑定AS类.
  3. 导出subSWF.swc(类库)和subSWF.swf文件.
  4. 在MainSWF项目里添加subSWF为外部库文件.这样既不会在MainSWF里混入SubSWF里的代码,又有代码提示和编译检测.
  5. MainSWF加载SubSWF到当前应用程序域.
  6. 加载完成后能直接操作这些AS类了,不必用反射

简单代码

在SubSWF里给库元件绑定类,参见上一节.

在Flash CS6里设置SubSWF导出SubSWF.swc.

在Flash CS6中设置导出swc

在Flash CS6里为MainSWF连接SubSWF.swc为外部库文件

在Flash CS6中导入外部swc

这是MainSWF的代码

import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.DisplayObject;
import flash.system.LoaderContext;

// 说明要加载的子swf的文件路径
var req:URLRequest = new URLRequest("subSwf.swf");
var loader:Loader = new Loader();
// 一定要用loder.contentLoaderInfo添加侦听,不然不会触发COMPLETE事件
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
// 第二个参数就是设置为当前应用程序域,必须要在当前应用程序域才能直接使用swc
var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
loader.load(req, context);

function completeHandler(e:Event):void
{
    // 移除侦听,防止内存泄露
    loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, completeHandler);

    // 由于导入了swc才能有代码提示
    // 由于将SubSWF加载到了当前应用程序域才能不必使用反射获取类定义
    var mySymbol:MySymbol = new MySymbol();
    // 获取到mySymol的示例后进行想要做的操作
    mySymbol.rotation = 30;
    // 将mySymbol加载到显示列表才能显示
    this.addChild(mySymbol);
}

结语

使用swc最大的好处是有代码提示有编译时类型检查,这样可以最大程度的减少人为编码错误.其次是不必使用反射来获取类定义,这样就减少了编码量.当然该方法需要将子swf加载到当前应用程序域里,否则还是需要反射来获取类定义.

标签:

  1. | |

    蛮好的系列教程。但是我觉得既然讲到加载运行时加载swf,就有必要阐述清楚ApplicationDomain的作用和使用,否则在某些情况下会引发异常。

  2. | |

    @Tony
    应用程序域已经在《教程:深入理解Flash的应用程序域(Application Domains) 》这篇文章里有写了,后续还会有关于应用程序域的文章.

  3. | |

    lite3 :
    @Tony
    应用程序域已经在《教程:深入理解Flash的应用程序域(Application Domains) 》这篇文章里有写了,后续还会有关于应用程序域的文章.

    翻译的真不错,翻译是再创作,能翻译完就很不容易了。而且Application Domain讲的很详细,完全超越官方文档。:)

  4. | |

    @Tony
    呵呵,这篇文章是我抄别人的,不是自己翻的

  5. | |

    这个挺好呀

回到顶部