Flash资源共享库打包工具Swift-tool关于字体加载的问题
今天在研究mornUI,结果看到Swift-tool ,所以研究了一下。
结果按照wiki里面的操作,字体就是报错,折腾了好久。发现原来要用绝对的资源路径。
比如:
<?xml version="1.0" encoding="utf-8"?>
<lib allowDomain="*">
<bitmapdata file="img/tank.png" class="tank"/>
<bitmapdata file="img/pic.jpg" class="pic"/>
<font file="G:\test\f\YouYuan.ttf" class="ArialFont"/>
</lib>
https://code.google.com/p/swift-tool/
Swift is a tool for packaging images, fonts, sounds, binary data to swf as runtime shared library or swc as precompiled library. You can load and access these resources at runtime, such as RSL(runtime shared library). Swfit is a free software written by Java, so the Java runtime is required.
Swift has two ways to use. The first is xml2lib, you can use it to compile resources specified in a xml. The other is dir2lib, you can use it to compile resources in a specified directory.
Swfit可以帮助你把图片、字体、声音、二进制数据等资源打包成一个swf文件(或者swc文件),你可以在运行时动态加载并访问这些资源,实现运行时共享库,减少主应用程序体积和加速下载。Swfit是一个Java开发的免费工具,因此你需要安装Java虚拟机才能使用它。
Changelog
- 2011-06-02 Swift 1.0.3发布。增加allowDomain属性设置的支持,解决跨域加载的问题。具体用法可参考下面的xml库文件示例。
- 2011-01-31 Swift 1.0.2发布。增加对输出SWC的支持。只要把输入文件参数后缀改为swc,即可编译为swc文件。增加两个编译font的参数char和charRange,可与unicode搭配使用。
- 2010-12-31 Swift 1.0.1发布。添加对Flex4支持,可以将图片转换为兼容Flex4的组件或容器。
- 2010-12-30 修正转换JPG图片为Sprite后无法显示的bug。
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
注意事项:
- 此种方式下,所有资源的类名即资源的文件名(不包含扩展名)。如demo.png的类名即demo。
下面简单说明一下如何使用动态库:
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);