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/