package { import fl.transitions.Tween; import fl.transitions.easing.Strong; import fl.transitions.TweenEvent; import flash.display.Sprite; import flash.net.URLLoader; import flash.net.URLRequest; import flash.display.Loader; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFieldAutoSize; import flash.text.AntiAliasType; import flash.utils.Timer; import flash.events.TimerEvent; import flash.events.Event; import flash.events.MouseEvent; public class imageGallery extends Sprite { private var xml:XML; private var urlLoader:URLLoader; private var imagesVector:Vector. = new Vector.(); private var imagesCounter:int = 0; private var tween:Tween; private var lastTarget:*; private var tweening = false; private var infoCounter:int = 0; private var infoPanel:Sprite = new Sprite(); private var titleField:TextField = new TextField(); private var description:TextField = new TextField(); private var titleFormat:TextFormat = new TextFormat(); private var descriptionTF:TextFormat = new TextFormat(); private var timer:Timer; private var preloader:Preloader = new Preloader(); private var added:Boolean; private var titleFont:Helvetica = new Helvetica(); private var bitmapFont:Harmony = new Harmony(); public function imageGallery(xmlPath:String = "images.xml", interval:int = 2000):void { timer = new Timer(interval); titleFormat.bold = true; titleFormat.font = titleFont.fontName; titleFormat.color = 0xFFFFFF; titleFormat.size = 14; descriptionTF.font = bitmapFont.fontName; descriptionTF.color = 0xEEEEEE; descriptionTF.size = 8; titleField.defaultTextFormat = titleFormat; titleField.autoSize = TextFieldAutoSize.LEFT; titleField.embedFonts = true; titleField.antiAliasType = AntiAliasType.ADVANCED; description.defaultTextFormat = descriptionTF; description.autoSize = TextFieldAutoSize.LEFT; description.embedFonts = true; loadXML(xmlPath); } private function loadXML(file:String):void { urlLoader = new URLLoader(new URLRequest(file)); urlLoader.addEventListener(Event.COMPLETE, parseXML); } private function parseXML(e:Event):void { xml = new XML(e.target.data); loadImages(); } private function loadImages():void { for (var i:int = 0; i < xml.children().length(); i++) { var loader:Loader = new Loader(); loader.load(new URLRequest(xml.children()[i].@src)); imagesVector.push(loader); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, sortImages); } } private function sortImages(e:Event):void { imagesCounter++; for (var i:int = 0; i < imagesVector.length; i++) { imagesVector.reverse(); addChild(imagesVector[i]); } if (imagesCounter == imagesVector.length) { createInfoPanel(); timer.addEventListener(TimerEvent.TIMER, autoChange); timer.start(); addPreloader(); addActions(); } } private function addActions():void { for (var i:int = 0; i < imagesVector.length; i++) { imagesVector[i].addEventListener(MouseEvent.MOUSE_UP, changeImage); } } private function changeImage(e:MouseEvent):void { timer.stop(); if(added) { removeChild(preloader); added = false; } if (! tweening) { lastTarget = e.target; tween = new Tween(e.target,"alpha",Strong.easeOut,1,0,1,true); tween.addEventListener(TweenEvent.MOTION_FINISH, changeDepth); tweening = true; infoCounter++; if (infoCounter >= xml.children().length()) { infoCounter = 0; titleField.text = xml.children()[infoCounter]. @ title; description.text = xml.children()[infoCounter]. @ description; } else { titleField.text = xml.children()[infoCounter]. @ title; description.text = xml.children()[infoCounter]. @ description; } } } private function changeDepth(e:TweenEvent):void { setChildIndex(lastTarget, 0); lastTarget.alpha = 1; tweening = false; } private function createInfoPanel():void { infoPanel.graphics.beginFill(0x000000, 0.5); infoPanel.graphics.drawRect(0, 0, 600, 50); infoPanel.graphics.endFill(); titleField.text = xml.children()[infoCounter]. @ title; titleField.x = 5; titleField.y = 5; description.text = xml.children()[infoCounter]. @ description; description.x = 7; description.y = 22; infoPanel.y = 250; infoPanel.addChild(titleField); infoPanel.addChild(description); addChild(infoPanel); } private function autoChange(e:TimerEvent):void { infoCounter++; lastTarget = imagesVector[xml.children().length() - infoCounter]; tween = new Tween(imagesVector[xml.children().length() - infoCounter],"alpha",Strong.easeOut,1,0,1,true); tween.addEventListener(TweenEvent.MOTION_FINISH, changeDepth); tweening = true; if (infoCounter >= xml.children().length()) { infoCounter = 0; titleField.text = xml.children()[infoCounter]. @ title; description.text = xml.children()[infoCounter]. @ description; } else { titleField.text = xml.children()[infoCounter]. @ title; description.text = xml.children()[infoCounter]. @ description; } } private function addPreloader():void { added = true; preloader.scaleX = 0.08; preloader.scaleY = 0.08; preloader.x = (600 - preloader.width/2) - 12; preloader.y = (300 - preloader.height/2) - 12; addChild(preloader); } } }