Apparentemente le immagini, i files swf e i documenti "embedded" il progetto provocano un rallentamento della fase di compilazione di Flex Builder. Quindi le operazioni di "refresh" o "launch" richiedono diversi minuti prima di esssere conclusi.
In altri termini se il tuo progretto contiene molti <mx:Button icon=”@Embed(…)” /> allora aspettati di avere una fase di compilazione lenta.
Una semplice soluzione è quella di spostare tutte le chiamate "embed" dentro uno style scheet e compilare il tutto come un modulo. Procedi come i passi seguenti per creare un modulo style sheet:
- crea un nuovo modulo (file->new->flex->MXML module);
- aggiungi dento questo modulo i riferimenti dello style sheet.
<?xml version="1.0" encoding="utf-8"?> <mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="0" height="0" creationComplete="trace(‘iconsloaded’)"> <mx:Style source="style.css" /> </mx:Module>
-
rimuovi tutti gli attributi embed nel tuo progetto;
- carica nella pagina iniziale il modulo style sheet appena creato.
protected var styleLoader:ModuleLoader; protected function init() : void{ styleLoader = new ModuleLoader(); styleLoader.addEventListener(ModuleEvent.READY, onModuleLoad ); styleLoader.addEventListener(ModuleEvent.ERROR, onModuleError ); styleLoader.url = "IconsModule.swf"; styleLoader.loadModule(); } protected function onModuleLoad( e:ModuleEvent ) : void{ maximize(); var mainApp:MainApplication = new MainApplication(); mainApp.percentHeight = 100; mainApp.percentWidth = 100; addChild(mainApp); } protected function onModuleError(e : ModuleEvent ) : void{ Alert.show("Could not load module IconsModule.swf","Error",Alert.OK ); }
Dal codice è facile intuire che inizializzo la main application dopo che il modulo è stato caricato.
Con questi accorgimenti il compilatore non deve caricare all’interno del file swf finale tutte le immagini (o file generici embed), ma le immagini saranno caricate in run-time, di conseguenza il processo di compilazione avrà meno lavoro da svolgere.
Una seconda opzione è consigliata quando non è possibile mettere tutte le immagini in un file di style sheet. In questo caso:
- crea una interfaccia che elenca tutte le immagini "embed"
public interface MyGraphicsModule{ // Bindable tags are there purely to suppress warnings, // these properties never change after startup. [Bindable(event="moduleChanged")] function get addIcon() : Class;... }
- Fai una classe che implementa questa interfaccia ed estende ModuleBase.
public class MyGraphics extends ModuleBase implements MyGraphicsModule{ [Embed(source="/art/toolbars/add.png")] protected var _addIcon:Class;public function get addIcon() : Class { return _addIcon; } ... }
Una cosa importante è quella di non importare questa classe nell’applicazione, perché l’obbiettivo è quello di tenere le cose separate.
- Crea un modulo manger
public class MyModules{ [Bindable] public static var graphics:MyGraphicsModule; }
- Addiziona nelle proprietà del progetto il modulo MyGraphics, Project->Properties->Flex Modules settings.
- Carica il modulo nello start up
public function loadModules() : void{ graphicsModuleLoader = new ModuleLoader(); graphicsModuleLoader.addEventListener(ModuleEvent.READY, onModuleLoaded ); graphicsModuleLoader.addEventListener(ModuleEvent.ERROR, onModuleLoadFailure ); graphicsModuleLoader.url = "MyGraphics.swf"; graphicsModuleLoader.loadModule(); } protected function onModuleLoaded( event:ModuleEvent ) : void{ if( event.target == graphicsModuleLoader ){ var o:Object = event.module.factory.create(); MyModules.graphics = event.module.factory.create() as MyGraphicsModule; } }
- Nel punto dove si trova l’immagine scrivi al posto del codice
[Embed(source="/art/icons/addIcon.png")] public var addIcon:Class;
il codice:
public var addIcon:Class = MyModules.graphics.addIcon;
Ultimi Commenti