stageのリサイズ時に位置調整

ユーザーの中には自分でウインドウのサイズを変えたいという人が結構いると想います。職場の人にばれないようにこっそりネット見ている時とか。そんな時見えなくなってしまうと致命的な部分もあります(メニューとか)。そんな時対策に使うといいですね。

サンプル

stageがリサイズされても「Center」と書かれているインスタンスは真ん中に、「Right-Bottom」と書かれているインスタンスは常に右下にいるようにします。

以下はstageのリサイズ時にインスタンス位置を調整するStageResizeクラス。

package
{
	import flash.events.Event;
	import flash.display.MovieClip;
	import flash.display.StageScaleMode;
	import flash.display.StageAlign;

	import caurina.transitions.Tweener;

	public class StageResize
	{
		var center_mc:MovieClip;
		var rb_mc:MovieClip;
		
		//インスタンスがかぶらないようにエリア設定
		var areaW:uint = 400;
		var areaH:uint = 300;

		//コンストラクタ
		function StageResize(center:MovieClip,corner:MovieClip) {
			center_mc = center;
			rb_mc = corner;
			setPosition();
			
			//ウィンドウのサイズが変更されてもサイズ固定
			center_mc.stage.scaleMode=StageScaleMode.NO_SCALE;
			//常にステージの左上に表示
			center_mc.stage.align = StageAlign.TOP_LEFT;
			//画面がリサイズされたらイベント配信
			center_mc.stage.addEventListener(Event.RESIZE, onStageResize);
		}
		//イベントを受けて位置調整実行
		function onStageResize(event:Event):void {
			setPosition();
		}
		//位置調整
		function setPosition():void {
			var w:uint = center_mc.stage.stageWidth;
			var h:uint = center_mc.stage.stageHeight;
			Tweener.addTween(center_mc, { x:w/2, y:h/2, time:1.5, transition:"easeOutQuint" } );
			Tweener.addTween(rb_mc, { x:Math.max(areaW, w - rb_mc.width/2), y:Math.max(areaH, h-rb_mc.height/2), time:1.5, transition:"easeOutQuint" } );
		}
	}
}

stageがリサイズされたことを知りたい時はEvent.RESIZEイベントをstageに対してリスナー登録しておきます。リサイズが行われると、onStageResizeメソッドが実行され、setPositionメソッドで実際に位置を調整します。
setPositionメソッドではstage.stageWidth、stage.stageHeightでstageサイズを取得し直し、それを元に移動後の位置を指定しています。少し遅れて移動する機能はTweenerを使用しています。
ある一定の範囲を越えると位置調整の機能によりインスタンス同士がかぶってしまいます。これを防ぐためにareaWとareaHでこの値よりウィンドウサイズが小さくなった場合はは位置調整しないようにしています。

ドキュメントクラスに指定したMain.asには以下のように指定します。

package 
{
	import flash.display.MovieClip;
	
	public class Main extends MovieClip
	{
		public function Main()
		{
			init();
		}
		
		private function init()
		{
			var stageResizeObj:StageResize = new StageResize(center_mc, rb_mc);
		}
	}
	
}