[Flex]全画面・最小化などのnativeWindowメソッド処理後にリサイズしたいとき

Flash/AS3 Tips, Tips| | 2012.09.11

少なくともFlex SDK 4.5.1では、
WindowApplication内に「動的配置したModuleで」リサイズイベントと同時に再配置したりするようなとき、nativeWIndow.maximize()、nativeWindow.restore()では「画面のサイズが変わる直前の」数値を取ってきてしまうようです。

なので、全画面からrestore()したら、全画面のときの数値でリサイズされる。

これを回避するのにベタかつスマートではないけど下記のような方法で対応。

import flash.events.NativeWindowDisplayStateEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;

//Timerで100ミリ秒後に1回イベント起こす
private var resizeTimer:Timer=new Timer(100,1);

protected function inith():void
{
	//NativeWindowDisplayStateEventでnativeWindow状態変化を監視
	this.addEventListener(NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGE,resizeFire);

	//TimerEventのcompleteを監視
	resizeTimer.addEventListener(TimerEvent.TIMER_COMPLETE,resizeComplete);
}

private function resizeFire(event:NativeWindowDisplayStateEvent):void
{
	//リセットしてからスタート(Timerカウントを0→1(終了)とするため)
	resizeTimer.reset();
	resizeTimer.start();
}

private function resizeComplete(event:TimerEvent):void
{
	//対象のModuleをリサイズ
	targetContent.dispatchEvent(new Event(Event.RESIZE));	
}

ちゃんとやるならinvalidateProperties()とか使うもんだけどね。