Lássuk, hogy mit fogunk elkészíteni:

Két fő részből fog állni a munkánk. Először is el kell készítenünk Flash-ben az előtöltőnket, statikus adatokkal, majd Flash Builder-ben (vagy a korábbi Flex verziókban) összekapcsolni azt az alkalmazásunkkal.

Flash

Hozzunk létre egy MovieClip-et, amiben összeállítjuk az előtöltőnket.
A képen látható módon adjunk  nevet az MC-nek és jelöljük be az “Export for ActionScript”-et a Linkage részben, hogy tudjunk a “Class” mezőbe írni. Amit ide írunk, azzal a névvel fogunk hivatkozni a Flex alkalmazásunkban erre az MC-re.

A létrejött MC-ben állítsuk össze a preloaderünket.

Előtöltő összeállítása

Dinamikus szövegmezőket használjunk és ágyazzuk be azokat a betűket (Properties paletta/Character embedding), amiket felhasználunk az adott mezőben.  A “100%” feliratú szövegmezőben fogom megjeleníteni a betöltöttséget, százalék formátumban, ezért ott a következőképpen néz ki a beágyazás:

Karakterek beágyazása

Ezt a szövegmezőt lássuk el instance névvel is (Properties/Instance), hogy a Flex alkalmazásunkból hivatkozni tudjunk majd rá.

Instance név megadása a "100%" feliratú szövegmezőhöz

A két szövegmező alatt láthattunk 2 különböző színű téglalapot. A belső téglalap az előtöltő csík, tehát erre tudnunk kell majd később hivatkozni, hogy állítani tudjuk a szélességét, a betöltöttségtől függően.

Rajzoljunk a “Rectangle tool” segítségével egy téglalapot, jelöljük ki, majd a megjelenő menüben válasszuk a “Convert to Symbol”-t.

Alakzat->MovieClip

Ha ezzel megvagyunk, adjunk instance nevet az alakzatból átalakult MC-nek, hogy hivatkozni tudjunk később rá és készen is vagyunk az előtöltőnkkel.

Instance név megadása az előtőltö csíknak
A következő dolgunk az, hogy SWC komponensként kimentsük az MC-t, amiben az előtöltőnket összeállítottuk, hogy azt betöltve a Flex alkalmazásunkba felhasználhassuk (Libraryban jobb klikk a customPreloaderMC-re, majd “Export SWC file…”)

Export SWC file

Flex

Hozzunk létre egy új Flex projectet (File/New/Flex Project) és a Lybrary Path-hoz adjuk hozzá az előbb kimentett SWC file-t (már meglévő project esetén jobb klikk a project nevére, Properties, Flex Build Path).

SWC hozzáadása a projecthez

Következő lépésben hozzunk létre egy ActionScript osztalyt (src mappan jobb klikk->new->ActionScript Class), CustomPreloaderAS néven, amit a DownloadProgressBar osztályból örököltetünk (Superclass mezőbe: mx.preloaders.DownloadProgressBar). Ebben az osztályban vezéreljük majd az előtöltőnket.
A teljes kód:

/**
 * @author vizoli (Viski Zoltan)
 */

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.ProgressEvent;
	import mx.events.FlexEvent;
	import mx.preloaders.DownloadProgressBar;

	public class CustomPreloaderAS extends DownloadProgressBar {
		private var customPreloaderWidth:uint = 229;
		private var customPreloaderHeight:uint = 73;
		private var customPreloader:customPreloaderCLASS;

		public function CustomPreloaderAS() {
			customPreloader = new customPreloaderCLASS();
			addEventListener(Event.ADDED_TO_STAGE, onAdded);
			addChild(customPreloader);
		}

		public override function set preloader(preloader:Sprite):void {
			preloader.addEventListener(ProgressEvent.PROGRESS, onProgress);
			preloader.addEventListener(FlexEvent.INIT_COMPLETE, onInitComplete);
		}

		private function onAdded(event:Event):void {
			customPreloader.stop();
			customPreloader.x = ((stage.stageWidth/2) - (customPreloaderWidth/2));
			customPreloader.y = ((stage.stageHeight/2) - (customPreloaderHeight/2));
		}

		private function onInitComplete(event:Event):void {
			dispatchEvent( new Event(Event.COMPLETE));
		}

		private function onProgress(event:ProgressEvent):void {
			customPreloader.percent_txt.text = Math.ceil(event.bytesLoaded/event.bytesTotal*100) + "%";
			customPreloader.progressBarMC.scaleX = (event.bytesLoaded/event.bytesTotal);
		}
	}
}

A továbbiakban részletekre bontom a kódot és úgy magyarázom el, hogy mi mit jelent.

private var customPreloaderWidth:uint = 229;
private var customPreloaderHeight:uint = 73;
private var customPreloader:customPreloaderCLASS;

Az első két változó az előtöltő magasság és szélesség értéket tárolja, amire a pozicionálás miatt van szükség.
A harmadik sorban deklaráljuk az előtöltőnket. Típusként azt kell megadnunk, amit Linkage/Class névként adtunk az előtöltőt tároló MC-nek.

public function CustomPreloaderAS() {
	customPreloader = new customPreloaderCLASS();
	addEventListener(Event.ADDED_TO_STAGE, onAdded);
	addChild(customPreloader);
}

Az osztály konstruktora, amelyben létrehozunk egy új előtöltő objektumot, majd hozzáadjuk az addChild()-al a DisplayList-hez.
Hozzárendelünk ADDED_TO_STAGE eseményt az osztályhoz, ami akkor következik be, amikor az osztályunk felkerült a DisplayList-re. Erre azért van szükség, mert amíg ez nem következik be, addig pl. a stage.stageWidth-re nem hivatkozhatunk.

private function onAdded(event:Event):void {
	customPreloader.stop();
	customPreloader.x = ((stage.stageWidth/2) - (customPreloaderWidth/2));
	customPreloader.y = ((stage.stageHeight/2) - (customPreloaderHeight/2));
}

Ez függvény hívódik meg amikor felkerült az ADDED_TO_STAGE esemény bekövetkezésekor, amiben pozicionáljuk az előtöltőnket, a stage méretétől függően, mindig középre.

public override function set preloader(preloader:Sprite):void {
	preloader.addEventListener(ProgressEvent.PROGRESS, onProgress);
	preloader.addEventListener(FlexEvent.INIT_COMPLETE, onInitComplete);
}

Felüldefiniáljuk a DownloadProgressBar osztály preloader metódusát, azért, hogy eseményeket tudjunk rendelni preloaderhez.

private function onInitComplete(event:Event):void {
	dispatchEvent( new Event(Event.COMPLETE));
}

Ez a függvény hívódik meg, amikor az előtöltés befejeződött, tehát dobnunk kell egy COMPLETE eseményt az alkalmazásunknak, hogy ezt ő is tudja és eltüntesse preloadert.

private function onProgress(event:ProgressEvent):void {
	customPreloader.percent_txt.text = Math.ceil(event.bytesLoaded/event.bytesTotal*100) + "%";
	customPreloader.progressBarMC.scaleX = (event.bytesLoaded/event.bytesTotal);
}

Ez a függvény hívódik meg újra és újra a betöltés közben, amiben frissítjük a betöltést kijelző text mezőt és az előtöltő csík szélességét, százalékban megadva.

Most, hogy megértettük a CustomPreloaderAS osztály működését, nincs más hátra, mint hozzárendelni az alkalmazásunkhoz, preloaderként:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
				preloader="CustomPreloaderAS"
				backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#8B9181, #8B9181]"
				width="400" height="350" backgroundColor="#8B9181" >

	<mx:Image source="@Embed(source='assets/testImage.jpg')" maintainAspectRatio="false" width="100%" height="100%"/>
</mx:Application>

Remélem érthetően sikerült bemutatnom, hogy hogyan lehet saját előtöltőt használni Flexben készült munkáinkban. Amennyiben kérdésetek volna, szívesen válaszolok!

Forrás letöltése