http://we.zuisg.com/?p=280
# 简介:
项目中经常要嵌入许多资源文件,比如图片(JPEG/PNG)、字体、动画swf、xml文件等等,普通做法一般都是使用Embed标签或者在Flash CS中导出类并生成swc/swf的方式来使用,但总感觉嵌入资源管理不统一,或者需要借助Flash CS工具。另外如果项目从嵌入换成外部载入的方式,又要改动代码。很久前就知道swift-tool这个打包资源文件的开源工具类库,最近正好想起,所以拿来试用一下,看看能不能使用到项目中。
swift-tool:http://code.google.com/p/swift-tool/
摘录官网的开头一段:“Swfit可以帮助你把图片、字体、声音、二进制数据等资源打包成一个swf文件(或者swc文件),你可以在运行时动态加载并访问这些资源,实现运行时 共享库,减少主应用程序体积和加速下载。Swfit是一个Java开发的免费工具,因此你需要安装Java虚拟机才能使用它。”
看过这个应该知道是干什么用的,官网说明非常详细,而且最近一次更新就在2011年6月,也算是一个活跃度较高的工具。基本是基于打包配置文件来管理资源文件,囊括了项目中需要使用的几乎所有类型的资源文件,较为实用。
简单看一下打包的配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?
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>、<bitmap>等标签即是对应AS3中的类,而且有了万能的bytearray类型,甚至也加入了对Flex4的支持,使用很方便,对于图片还提供了quality设置,不是一般的好用,具体见官网说明。
# 使用Tips
1、可打包生成swf或swc文件,我一般生成swc(内嵌方式),直接放在项目的libs目录下,可以直接使用打包配置文件中定义的class名,十分方便。
2、若打包的资源文件列表中有xml文件,会自动压缩(同直接Embed xml文件)
3、嵌入XML使用方法
1
|
var
xmlData:XML = XML(
new
XMLData());
// XMLData为打包配置文件中定义的class名称
|
4、嵌入SWF文件的使用方法:swf文件没有专有标签,打包swf需要使用bytearray方式
->打包配置文件:<bytearray file="attack.swf"/>
->项目中使用:
1
2
3
4
5
6
7
8
9
|
......
var
loader:Loader =
new
Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);
loader.loadBytes(
new
MCData());
......
private
function
onLoaderComplete(event:Event):
void
{
var
swf:MovieClip = MovieClip(event.target.content);
}
|
# 发现的问题:
在打包PNG文件的时候,发现使用compress="true"的图片质量明显要差于Flash CS生成的图片质量,虽然官网有说明“在图片类型资源中,如果是png格式,当参数compression为true时,图片将被编码成带alpha通道DefineBitsJPEG3,默认压缩比率即quality为80,相比原始图片可以得到更高的压缩比率。这也是Flash CS5中的处理方式。”,但我经过我的测试,使用swift-tool导出的PNG图片质量还是差了一点,而且生成的swc也要比Flash CS工具导出的要大一点。以下是我测试的图片,大家自己看大象的边缘。。。。。
如果不使用compress="true"(即不使用压缩),虽然画质得到了保证,但生成的swc大小大的惊人。以上的测试结果也许是使用java的压缩图片的算法和Flash CS5工具不同所导致的,这个问题我已经Email作者咨询了。
# 总结:
总的说来这还是一个很好用的开源工具,可以帮助我们在不使用Flash CS工具的前提下集中管理资源文件,如果能解决图片压缩的问题,应该是完全可以应用在项目中的。
/-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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
下面简单说明一下如何使用动态库:
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);