package { import flash.display.DisplayObject; import flash.display.Stage; import flash.display.StageScaleMode; import flash.display.StageAlign; import flash.events.Event; import flash.utils.Dictionary; public class StageAlignTool{ //nine slices for pinning objects public static const TL:uint = 1; public static const TC:uint = 2; public static const TR:uint = 3; public static const ML:uint = 4; public static const MC:uint = 5; public static const MR:uint = 6; public static const BL:uint = 7; public static const BC:uint = 8; public static const BR:uint = 9; private static var _stage:Stage private static var _stageW:uint; private static var _stageH:uint; private static var _minW:uint private static var _minH:uint private static var _registeredObjects:Dictionary; //function StageAlignTool(){} //inital call, sets stage and minimum stage size public static function init($stage:Stage, $minW:uint = 1024, $minH:uint = 768):void{ _stage = $stage; _stageW = _stage.stageWidth; _stageH = _stage.stageHeight; _minW = $minW; _minH = $minH; _stage.scaleMode = StageScaleMode.NO_SCALE; _stage.align = StageAlign.TOP_LEFT; _registeredObjects = new Dictionary(); _stage.addEventListener(Event.RESIZE, onStageResize); } //if you need to stop positioning objects for some reason public static function kill():void{ _stage.removeEventListener(Event.RESIZE, onStageResize); } //used to add a display object to the list of objects that will be laid out //if stayRelative == true the object will retain it's original offset from the stage (when registered); //if stayRelative == false the object will pin to whichever corner is set by $loc public static function registerLocation($disp:DisplayObject, $loc:uint, $stayRelative:Boolean = false):void{ if (_stage){ _registeredObjects[$disp] = {location:$loc, stayRelative:$stayRelative, ogX:$disp.x, ogY:$disp.y}; onStageResize(null); }else{ trace("stage not set"); } } //meat private static function onStageResize(e:Event = null):void{ //trace(e); var sw:uint = (_stage.stageWidth >= _minW) ? _stage.stageWidth : _minW; var sh:uint = (_stage.stageHeight >= _minH) ? _stage.stageHeight : _minH; //if (sw >= _minW && sh >= _minH){ for (var $disp in _registeredObjects){ trace($disp.name, _registeredObjects[$disp].location, _registeredObjects[$disp].stayRelative); switch (_registeredObjects[$disp].location){ case TL: if (_registeredObjects[$disp].stayRelative){ //x doesn't change //y doesn't change }else{ $disp.x = $disp.y = 0; } break; case TC: if (_registeredObjects[$disp].stayRelative){ $disp.x = (sw/2) - (_stageW / 2) + _registeredObjects[$disp].ogX; //y doesn't change }else{ $disp.x = (sw / 2) - ($disp.width / 2); $disp.y = 0; } break; case TR: if (_registeredObjects[$disp].stayRelative){ $disp.x = sw - _stageW + _registeredObjects[$disp].ogX; //y doesn't change }else{ $disp.x = (sw - $disp.width); $disp.y = 0; } break; case ML: if (_registeredObjects[$disp].stayRelative){ //x doesn't change $disp.y = (sh/2) - (_stageH / 2) + _registeredObjects[$disp].ogY; }else{ $disp.x = 0; $disp.y = (sh / 2) - ($disp.height / 2); } break; case MC: if (_registeredObjects[$disp].stayRelative){ $disp.x = (sw/2) - (_stageW / 2) + _registeredObjects[$disp].ogX; $disp.y = (sh/2) - (_stageH / 2) + _registeredObjects[$disp].ogY; }else{ $disp.x = (sw / 2) - ($disp.width / 2); $disp.y = (sh / 2) - ($disp.height / 2); } break; case MR: if (_registeredObjects[$disp].stayRelative){ $disp.x = sw - _stageW + _registeredObjects[$disp].ogX; $disp.y = (sh/2) - (_stageH / 2) + _registeredObjects[$disp].ogY; }else{ $disp.x = (sw - $disp.width); $disp.y = (sh / 2) - ($disp.height / 2); } break; case BL: if (_registeredObjects[$disp].stayRelative){ //x doesn't change $disp.y = sh - _stageH + _registeredObjects[$disp].ogY; }else{ $disp.x = 0; $disp.y = (sh - $disp.height); } break; case BC: if (_registeredObjects[$disp].stayRelative){ $disp.x = (sw/2) - (_stageW / 2) + _registeredObjects[$disp].ogX; $disp.y = sh - _stageH + _registeredObjects[$disp].ogY; }else{ $disp.x = (sw / 2) - ($disp.width / 2); $disp.y = (sh - $disp.height); } break; case BR: if (_registeredObjects[$disp].stayRelative){ $disp.x = sw - _stageW + _registeredObjects[$disp].ogX; $disp.y = sh - _stageH + _registeredObjects[$disp].ogY; }else{ $disp.x = (sw - $disp.width); $disp.y = (sh - $disp.height); } break; }//switch }//for //}//if min width }//onStageResize }//class }//package