X

操作子SWF(二)使用反射

当我们有多个很小的素材,比如一些矢量的素材图标,这些图标的体积通常都比较小,如果每个都放到一个swf里就会出现太多的swf文件,造成文件太碎,管理不方便.那么我们就需要将这些相关的素材整合到一个swf文件里,同时又要能被加载后访问到,就用到了库元件导出类.这样就能被加载来访问到了.

流程

  1. 将每个素材分别都做成库元件.
  2. 将每个素材的库元件绑定AS类.
  3. 发布成swf文件.
  4. MainSWF加载SubSWF.
  5. 加载完成后,通过反射获取到SubSWF里库元件绑定的AS类.
  6. 获取到的这些AS类进行操作. 将SubSWF里的库元件绑定到AS类

简单代码

首先在SubSWF里将flash库元件导出绑定AS类,例如MySymbol:

其次是MainSWF的代码:

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

// 说明要加载的子swf的文件路径
var req:URLRequest = new URLRequest("subSwf.swf");
var loader:Loader = new Loader();
// 一定要用loder.contentLoaderInfo添加侦听,不然不会触发COMPLETE事件
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.load(req);

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

    // 需要先反射获取SubSWF里的MySymbol类才能进行操作
    var MySymbolRef:Class = loader.loaderInfo.applicationDomain.getDefinition("MySymbol") as Class;
    // 获取到类后要实例化一个显示对象才行操作
    var mySymbol:DisplayObject = new MySymbolRef() as DisplayObject;
    // 获取到mySymol的示例后进行想要做的操作
    mySymbol.rotation = 30;
    // 将mySymbol加载到显示列表才能显示
    this.addChild(mySymbol);
}

结语

该方法同样适用于SubSWF的文档类,如果想更方便的获取SubSWF里的类定义,可以将SubSWF加载到当前应用程序域.具体方法请看这里.

这样就能容易的操作单个swf的不同元件了.同样也可以为对文档类进行操作.

This post was last modified on 2019 年 03 月 04 日 00:29

View Comments (3)

This website uses cookies.