Swfit可以帮助你把图片、字体、声音、二进制数据等资源打包成一个swf文件(或者swc文件),你可以在运行时动态加载并访问这些资源,实现运行时共享库,减少主应用程序体积和加速下载。Swfit是一个Java开发的免费工具,因此你需要安装Java虚拟机才能使用它。





Swift有两种使用方式,一是xml2lib,顾名思义,它可以根据指定的xml文件内容编译成swf库文件。二是dir2lib,它则可以把指定文件夹中的所有有效资源编译成swf库文件。

xml2lib

Usage:

  • java -jar Swift.jar xml2lib lib.xml lib.swf
  • java -jar Swift.jar xml2lib lib.xml lib.swc

下面是一个xml库文件例子:

<?xml version="1.0" encoding="utf-8"?>
<lib allowDomain="*">
        <bitmapdata file="image/img1.png" class="PNGBitmapData"/>
        <bitmapdata file="image/img2.jpg" class="JPGBitmapData"/>
        <bitmap file="image/img3.jpg" quality="80" class="JPGBitmap"/>
        <bitmap file="image/img4.png" compression="true" quality="80" class="PNGBitmap"/>
        <sprite file="image/img5.png" class="PNGSprite"/>
        <sprite file="image/img6.jpg" class="JPGSprite"/>       
        <flexmovieclip file="image/img7.jpg" class="FlexMC"/>
        <flexcontainer file="image/img8.jpg" class="FlexContainer"/>

        <font file="Arial.ttf" unicode="u+0020-007e,u+00a0-036f" class="ArialFont" />
        <font file="msyh.ttf" char="微软雅黑" charRange="a-z,A-Z" 
              unicode="u+5fae,u+8f6f,u+96c5,u+9ed1,u+4e00-u+4eff" class="MsyhFont" />
        <sound file="sound/test.mp3" class="TestSound"/>
        <bytearray file="data/test.xml" class="XMLData"/>
</lib>
支持资源类型有:
  • bitmapdata - 把指定图片文件编译成flash.display.BitmapData类,支持参数有compression,quality。
  • bitmap - 把指定图片文件编译成flash.display.Bitmap类,支持参数有compression,quality。
  • sprite - 把指定图片文件编译成flash.display.Sprite类,支持参数有compression,quality。
  • flexmovieclip - 把指定图片文件编译成mx.flash.UIMovieClip类,支持参数有compression,quality。
  • flexcontainer - 把指定图片文件编译成mx.flash.ContainerMovieClip类,支持参数有compression,quality。
  • font - 把指定的字体文件编译成flash.text.Font类,支持参数有unicode,char,charRange。
  • sound - 把指定声音文件编译成flash.media.Sound类。
  • bytearray - 把指定的任何文件编译成flash.utils.ByteArray类。

注意事项:

  • 所有资源都有file和class两个参数。file指定资源文件路径,当使用相对路径的时候,要注意这个路径是相对于执行Swift.jar命令的路径,而不是相对于xml文件的路径。class参数指定资源编译成swf后的as3类定义名,从而能够通过ApplicationDomain.getDefinition()来获取资源定义。
  • 在图片类型资源中,如果是png格式,当参数compression为true时,图片将被编码成带alpha通道DefineBitsJPEG3,默认压缩比率即quality为80,相比原始图片可以得到更高的压缩比率。这也是Flash CS5中的处理方式。
  • 在编译font字体资源时,如果不指定unicode、char或charRange参数,Swift将把字体中的所有有效字型都编译到swf中。一般的字体比较小的如英文字体可以完全编译,而像中文字体这种大型字体建议根据需要指定嵌入字型的范围,可以是unicode范围如\u4e00-\u9fa5,或者字符列表char和字符范围charRange。
  • 声音sound资源目前只支持11hz倍率的音频文件,如11hz,22hz,44hz等。
  • allowDomain参数可指定访问域,与Security.allowDomain()方法作用一致。

dir2lib

Usage:

  • java -jar Swift.jar dir2lib d:/myLib/ d:/myLib/lib.swf
  • java -jar Swift.jar dir2lib d:/myLib/ d:/myLib/lib.swc


下面简单说明一下如何使用动态库:

Load libraries(加载动态库)

加载跟普通swf并无差别,值得注意的是在不同域下要考虑跨域安全问题,请参考相应文档。

var loader:Loader = new Loader();
var context:LoaderContext = new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
loader.load(new URLRequest("library.swf"), context);

Get AS3 Class Definition (获取AS3类定义)

加载的library的类定义都可以通过其ApplicationDomain的getDefinition()方法获得,例如:

var BmpDataClass:Class = loader.content.loaderInfo.applicationDomain.getDefinition("JPGBitmapData") as Class;
var bmp:Bitmap = new Bitmap(new BmpDataClass());
addChild(bmp);

共享字体使用示例:

var fontClass:Class = loader.content.loaderInfo.applicationDomain.getDefinition("MsyhFont") as Class;
Font.registerFont(fontClass);

var fonts:Array = Font.enumerateFonts();
var font:Font = fonts[0];
var fontName:String = font.fontName;            
                        
var tf:TextField = new TextField();
tf.embedFonts = true;
tf.defaultTextFormat = new TextFormat(fontName);
addChild(tf);
googleCode download :http://code.google.com/p/swift-tool/