在利用fxg制作點(diǎn)狀符號庫的過(guò)程中,需要動(dòng)態(tài)加載fxg文件,并將其作為類(lèi)使用。然而flex自身并不支持flex文件的直接讀取。雖然在flex項目中,可以將fxg文件直接放在flashbuilder4的源文件中,一起編譯后可直接作為類(lèi)使用,但是這樣fxg文件需要事先編譯,和程序不能脫離,達不到動(dòng)態(tài)加載的目的。
為了解決上述難題,一個(gè)可行的解決方案是將fxg文件打包成swf,然后加載swf并從中析取fxg作為類(lèi)使用。對于這種方法,我將分兩部分加以說(shuō)明。
據我所知,有兩種方法可以做到這一點(diǎn)。
第一種方法是在FlashBuilder4中創(chuàng )建一個(gè)新的flex庫項目,將fxg文件置于src文件夾中,編譯后生成swc。將swc解壓后有兩個(gè)文件:catalog.xml,用于各類(lèi)/資源的配置文件;library.swf,存放各種類(lèi)/資源。
這種方法十分簡(jiǎn)單,但最大的缺點(diǎn)在于依賴(lài)FlashBuilder。試想最終用戶(hù)想要根據自己制作的fxg生成點(diǎn)狀符號庫,還必須依賴(lài)flashbuilder是一件多么痛苦的事。換句話(huà)說(shuō),作為開(kāi)發(fā)者,這點(diǎn)還可接受;但是作為需要自己更改符號庫的最終用戶(hù),這點(diǎn)則是不可接受的。
于是我嘗試了第二種方法:精簡(jiǎn)Flex的sdk。
利用Flex的sdk中的命令可以將fxg打包成swc。具體如下:
compc -include-sources E:\fxg2swc\bin\fxg\ -output e:\fxg.swc。
sdk中有許多與此不相干的東西,都可以刪除掉,最后可精簡(jiǎn)至13M左右。這樣就可以作為一個(gè)小工具提供給最終用戶(hù)。
使用這種方法會(huì )遇到的一個(gè)問(wèn)題是生成的swc會(huì )很大,造成這點(diǎn)的原因在于其將libs下的一些文件也打包在內,可通過(guò)更改sdk中的frameworks/flex-config.xml文件加以解決:將<library-path>中<path-element>libs/player/{targetPlayerMajorVersion}.{targetPlayerMinorVersion}</path-element>和<path-element>libs</path-element>放到<external-library-path>中。
其思路是利用loader類(lèi)加載library.swf,然后利用從catalog.xml提取的類(lèi)名從loader中提取類(lèi),然后利用類(lèi)生成類(lèi)對象。
(1)加載library.swf
(2)根據類(lèi)名提取類(lèi)
private function getClassByName(className:String,loaderInfo:LoaderInfo):Class
(3)根據類(lèi)生成類(lèi)對象
private function onFxgComplete(event:Event):void
聯(lián)系客服