Ну, у вас вроде есть ответ в вопросе.
Я быстро взглянул на FZip документы и заметил, что событие отправляется, когда
ZIP-файл загружен.
Просто сканирование по коду, в FZipLibrary.as есть метод processNext ()
который содержит цикл while для просмотра файлов в архиве. Вы можете добавить константу FILE_PARSED в FZipEvent и отправить такое событие оттуда после завершения цикла while.
Я не могу сейчас попробовать это проверить, но вот что я имею в виду:
/*
* Copyright (C) 2006 Claus Wahlers and Max Herkender
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*/
package deng.fzip
{
import deng.fzip.FZipFile;
import flash.events.Event;
/**
* FZip dispatches FZipEvent objects when a file contained in the
* ZIP archive has finished loading and can be accessed. There is
* only one type of FZipEvent: FZipErrorEvent.FILE_LOADED.
*/
public class FZipEvent extends Event
{
/**
* The file that has finished loading.
*/
public var file:FZipFile;
/**
* Defines the value of the type property of a FZipEvent object.
*/
public static const FILE_LOADED:String = "fileLoaded";
/**
* Zip contents were parsed
*/
public static const FILE_PARSED:String = "fileParsed";
/**
* Constructor
*
* @param type The type of the event. Event listeners can
* access this information through the inherited type property.
* There is only one type of FZipEvent:
* FZipEvent.PARSE_ERROR.
*
* @param file The file that has finished loading.
*
* @param bubbles Determines whether the Event object participates
* in the bubbling stage of the event flow. Event listeners can
* access this information through the inherited bubbles property.
*
* @param cancelable Determines whether the Event object can be
* canceled. Event listeners can access this information through
* the inherited cancelable property.
*/
public function FZipEvent(type:String, file:FZipFile = null, bubbles:Boolean = false, cancelable:Boolean = false) {
this.file = file;
super(type, bubbles, cancelable);
}
/**
* Creates a copy of the FZipEvent object and sets the value
* of each property to match that of the original.
*
* @return A new FZipEvent object with property values that
* match those of the original.
*/
override public function clone():Event {
return new FZipEvent(type, file, bubbles, cancelable);
}
}
}
Это было бы просто добавлением константы для события.
<code>/*
* Copyright (C) 2006 Claus Wahlers and Max Herkender
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*/
package deng.fzip {
import flash.events.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.utils.ByteArray;
/**
* Dispatched when all pending files have been processed.
*
* @eventType flash.events.Event.COMPLETE
*/
[Event(name="complete", type="flash.events.Event")]
/**
* <p>FZipLibrary works with a FZip instance to load files as
* usable instances, like a DisplayObject or BitmapData. Each file
* from a loaded zip is processed based on their file extentions.
* More than one FZip instance can be supplied, and if it is
* currently loading files, then FZipLibrary will wait for incoming
* files before it completes.</p>
*
* <p>Flash's built-in Loader class is used to convert formats, so the
* only formats currently supported are ones that Loader supports.
* As of this writing they are SWF, JPEG, GIF, and PNG.</p>
*
* <p>The following example loads an external zip file, outputs the
* width and height of an image and then loads a sound from a SWF file.</p>
*
* <pre>
* package {
* import flash.events.*;
* import flash.display.BitmapData;
* import deng.fzip.FZip;
* import deng.fzip.FZipLibrary;
*
* public class Example {
* private var lib:FZipLibrary;
*
* public function Example(url:String) {
* lib = new FZipLibrary();
* lib.formatAsBitmapData(".gif");
* lib.formatAsBitmapData(".jpg");
* lib.formatAsBitmapData(".png");
* lib.formatAsDisplayObject(".swf");
* lib.addEventListener(Event.COMPLETE,onLoad);
*
* var zip:FZip = new FZip();
* zip.load(url);
* lib.addZip(zip);
* }
* private function onLoad(evt:Event) {
* var image:BitmapData = lib.getBitmapData("test.png");
* trace("Size: " + image.width + "x" + image.height);
*
* var importedSound:Class = lib.getDefinition("data.swf", "SoundClass") as Class;
* var snd:Sound = new importedSound() as Sound;
* }
* }
* }
*
* @see
http://livedocs.macromedia.com/flex/201/langref/flash/display/Loader.html
* /
открытый класс FZipLibrary расширяет EventDispatcher {
статическое приватное const FORMAT_BITMAPDATA: uint = (1 << 0);
статическое приватное const FORMAT_DISPLAYOBJECT: uint = (1 << 1);
приватная переменная pendingFiles: Array = [];
приватная переменная pendingZips: Array = [];
приватная переменная currentState: uint = 0;
приватная переменная currentFilename: String;
приватная переменная currentZip: FZip;
приватная переменная currentLoader: Loader;
приватная переменная bitmapDataFormat: RegExp = / [] /;
приватная переменная displayObjectFormat: RegExp = / [] /;
private var bitmapDataList: Object = {};
приватная переменная displayObjectList: Object = {};
/ **
* Конструктор
* /
публичная функция FZipLibrary () {
}
/ **
* Используйте этот метод для добавления экземпляра FZip в очередь обработки.
* Если указанный экземпляр FZip не активен (в данный момент принимает файлы)
* когда он обработан, будут обрабатываться только файлы, которые уже загружены.
*
* @param zip Экземпляр FZip для обработки
* /
публичная функция addZip (zip: FZip): void {
pendingZips.unshift (почтовый);
processNext ();
}
/ **
* Используется для указания расширения файла, которое запускает форматирование в BitmapData.
*
* @param ext Расширение файла (".jpg", ".png" и т. д.)
* /
публичная функция formatAsBitmapData (ext: String): void {
bitmapDataFormat = addExtension (bitmapDataFormat, ext);
}
/ **
* Используется для указания расширения файла, которое запускает форматирование в DisplayObject.
*
* @param ext Расширение файла (".swf", ".png" и т. д.)
* /
открытая функция formatAsDisplayObject (ext: String): void {
displayObjectFormat = addExtension (displayObjectFormat, ext);
}
/ **
* @частный
* /
приватная функция addExtension (оригинал: RegExp, ext: String): RegExp {
вернуть новый RegExp (ext.replace (/ [^ A-Za-z0-9] /, "\\ $ &") + "$ |" + original.source);
}
/ **
* Запрос файла, который был отформатирован как BitmapData.
* ReferenceError выбрасывается, если файл не существует как
* BitmapData.
*
* @param filename Имя файла экземпляра BitmapData.
* /
публичная функция getBitmapData (имя файла: String): BitmapData {
if (! bitmapDataList [имя_файла] равно BitmapData) {
выбросить новую ошибку ("Файл \" "+ имя файла +" \ "не найден как BitmapData");
}
вернуть bitmapDataList [имя файла] как BitmapData;
}
/ **
* Запрос файла, который был отформатирован как DisplayObject.
* ReferenceError выбрасывается, если файл не существует как
* DisplayObject.
*
* @param filename Имя файла экземпляра DisplayObject.
* /
публичная функция getDisplayObject (filename: String): DisplayObject {
if (! displayObjectList.hasOwnProperty (filename)) {
throw new ReferenceError ("File \" "+ filename +" \ "не был найден как DisplayObject");
}
вернуть displayObjectList [имя файла] как DisplayObject;
}
/ *** Получить определение (например, класс) из SWF-файла, который имеет
* был отформатирован как DisplayObject.
* ReferenceError выбрасывается, если файл не существует как
* DisplayObject или определение не существует.
*
* @param filename Имя файла экземпляра DisplayObject.
* /
публичная функция getDefinition (имя файла: строка, определение: строка): объект {
if (! displayObjectList.hasOwnProperty (filename)) {
throw new ReferenceError ("File \" "+ filename +" \ "не был найден как DisplayObject,");
}
var disp: DisplayObject = displayObjectList [имя файла] как DisplayObject;
пытаться {
return disp.loaderInfo.applicationDomain.getDefinition (определение);
} catch (e: ReferenceError) {
сгенерировать новый ReferenceError («Определение» + «определение +» \ «в файле \» «+ имя файла +» \ «не может быть получено:« + e.message);
}
вернуть ноль;
}
/ **
* @частный
* /
приватная функция processNext (evt: Event = null): void {
while (currentState === 0) {
if (pendingFiles.length> 0) {
var nextFile: FZipFile = pendingFiles.pop ();
if (bitmapDataFormat.test (nextFile.filename)) {
currentState | = FORMAT_BITMAPDATA;
}
if (displayObjectFormat.test (nextFile.filename)) {
currentState | = FORMAT_DISPLAYOBJECT;
}
if ((currentState & (FORMAT_BITMAPDATA | FORMAT_DISPLAYOBJECT))! == 0) {
currentFilename = nextFile.filename;
currentLoader = новый Loader ();
currentLoader.contentLoaderInfo.addEventListener (Event.COMPLETE, loaderCompleteHandler);
currentLoader.contentLoaderInfo.addEventListener (IOErrorEvent.IO_ERROR, loaderCompleteHandler);
var content: ByteArray = nextFile.content;
content.position = 0;
currentLoader.loadBytes (содержание);
перерыв;
}
} else if (currentZip == null) {
if (pendingZips.length> 0) {
currentZip = pendingZips.pop ();
var i: uint = currentZip.getFileCount ();
while (i> 0) {
pendingFiles.push (currentZip.getFileAt (- я));
}
if (currentZip.active) {
currentZip.addEventListener (Event.COMPLETE, zipCompleteHandler);
currentZip.addEventListener (FZipEvent.FILE_LOADED, fileCompleteHandler);
currentZip.addEventListener (FZipErrorEvent.PARSE_ERROR, zipCompleteHandler);
перерыв;
} еще {
currentZip = null;
}
} еще {
dispatchEvent (new Event (Event.COMPLETE));
перерыв;
}
} еще {
перерыв;
}
}
dispatchEvent (новый FZipEvent (FZipEvent.FILE_PARSED));
}
/ **
* @частный
* /
приватная функция loaderCompleteHandler (evt: Event): void {
if ((currentState & FORMAT_BITMAPDATA) === FORMAT_BITMAPDATA) {
if (currentLoader.content это Bitmap && (currentLoader.content как Bitmap) .bitmapData это BitmapData) {
var bitmapData: BitmapData = (currentLoader.content as Bitmap) .bitmapData
bitmapDataList [currentFilename] = bitmapData.clone ();
// trace (currentFilename + "-> BitmapData (" + bitmapData.width + "x" + bitmapData.height + ")");} else if (currentLoader.content равен DisplayObject) {var width: uint = uint (currentLoader.content.width);var height: uint = uint (currentLoader.content.height);if (width && height) {var bitmapData2: BitmapData = new BitmapData (width, height, true, 0x00000000);bitmapData2.draw (currentLoader);bitmapDataList [currentFilename] = bitmapData2;// trace (currentFilename + "-> BitmapData (" + bitmapData2.width + "x" + bitmapData2.height + ")");} else {trace ("File \" "+ currentFilename +" \ "не удалось преобразовать в BitmapData");}} else {trace ("File \" "+ currentFilename +" \ "не удалось преобразовать в BitmapData");}} if ((currentState & FORMAT_DISPLAYOBJECT) === FORMAT_DISPLAYOBJECT) {if (currentLoader.content равен DisplayObject) {// trace (currentFilename + "-> DisplayObject");displayObjectList [currentFilename] = currentLoader.content;} else {currentLoader.unload ();trace ("File \" "+ currentFilename +" \ "не может быть загружен как DisplayObject");}} else {currentLoader.unload ();} currentLoader = null;currentFilename = "";currentState & = ~ (FORMAT_BITMAPDATA | FORMAT_DISPLAYOBJECT);processNext ();} / ** * @private * / приватная функция fileCompleteHandler (evt: FZipEvent): void {pendingFiles.unshift (evt.file);processNext ();} / ** * @private * / приватная функция zipCompleteHandler (evt: Event): void {currentZip.removeEventListener (Event.COMPLETE, zipCompleteHandler);currentZip.removeEventListener (FZipEvent.FILE_LOADED, fileCompleteHandler);currentZip.removeEventListener (FZipErrorEvent.PARSE_ERROR, zipCompleteHandler);currentZip = null;processNext ();}}}
И это будет еще одна строка кода, добавленная для отправки события FILE_PARSED.
Грязная версия будет иметь try / catch заблокировать и попытаться получить доступ к файлу несколько раз (по таймеру или enter_frame).Когда файл, наконец, готов, остановите этот цикл проверки и продолжайте.
HTH