フルFlashサイトを作成する時にstageのリサイズ・イベントを監視し、windowの幅、高さに合わせてゴニョゴニョする時はstageでEvent.RESIZEを監視しなくてはいけません。
毎回同じような関数を書いていたので後々でも使えそうなクラスを書いてみることにしました。
書いたクラスは2つ。
■Spriteを継承したResizeManager
。
Singletonで作っています。
■Eventを継承したResizeEvent
。
ResizeEvent
package com.inazumatv.events { import flash.events.Event; public class ResizeEvent extends Event { //--------------------------------------- // CLASS CONSTANTS //--------------------------------------- public static const STAGE_RESIZE:String = "stage_resize"; //--------------------------------------- // PRIVATE VARIABLES //--------------------------------------- private var _width:Number; private var _height:Number; //--------------------------------------- // CONSTRUCTOR //--------------------------------------- public function ResizeEvent(type:String, width:Number, height:Number, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); _width = width; _height = height; } //--------------------------------------- // GETTER / SETTERS //--------------------------------------- public function get width():Number { return _width; } public function get height():Number { return _height; } //--------------------------------------- // PUBLIC METHODS //--------------------------------------- public override function clone():Event { return new ResizeEvent(type, width, height, bubbles, cancelable); } public override function toString():String { return "ResizeEvent{width:" + width + ", height:" + height + "}"; } } } |
ResizeManager
package com.inazumatv.events { import flash.display.DisplayObjectContainer; import flash.display.Sprite; import flash.events.Event; public class ResizeManager extends Sprite { private static var _instance:ResizeManager; private static var allowInstantiation:Boolean; private static var _container:DisplayObjectContainer; //--------------------------------------- // CONSTRUCTOR //--------------------------------------- public function ResizeManager() { if (!allowInstantiation) { throw new Error("Error: new演算子では無くResizeManager.getManager(container:DisplayObjectContainer) を使ってインスタンスを取得して下さい."); } } //--------------------------------------- // PUBLIC METHODS //--------------------------------------- public static function getManager(container:DisplayObjectContainer=null):ResizeManager { if (_instance == null && container == null) { throw new Error("Error: 引数にDisplayObjectContainerが必要です."); } else if (container is DisplayObjectContainer && container.stage == null) { throw new Error("Error: 引数に有効なDisplayObjectContainerが必要です."); } else if (_instance == null) { allowInstantiation = true; _instance = new ResizeManager(); _container = container; container.stage.addEventListener(Event.RESIZE, onEventCall); } return _instance; } public static function stop():void { if (allowInstantiation) _container.stage.removeEventListener(Event.RESIZE, onEventCall); } public static function resume():void { if (allowInstantiation) _container.stage.addEventListener(Event.RESIZE, onEventCall); } //--------------------------------------- // PRIVATE METHODS //--------------------------------------- private static function onEventCall(event:Event):void { var w:Number = _container.stage.stageWidth; var h:Number = _container.stage.stageHeight; _instance.dispatchEvent(new ResizeEvent(ResizeEvent.STAGE_RESIZE, w, h)); } } } |
使い方はこんな感じ。
フレームスクリプトです。
import com.inazumatv.events.ResizeManager; import com.inazumatv.events.ResizeEvent; var manager:ResizeManager = ResizeManager.getManager(this); manager.addEventListener(ResizeEvent.STAGE_RESIZE, resizeHandler); function resizeHandler (e:ResizeEvent) { trace("resizeHandler", e.width, e.height); } |
1回ResizeManager.getManager
する時DisplayObjectContainer
が引数として渡されれば2回目のインスタンスを作る時からは必要なくなります。
var manager2:ResizeManager = ResizeManager.getManager(); manager2.addEventListener(ResizeEvent.STAGE_RESIZE, resizeHandler2); function resizeHandler2 (e:ResizeEvent) { trace("resizeHandler2", e.width, e.height); } |
ResizeManager.getManager
の引数DisplayObjectContainer
は表示オブジェクトとしてaddChild
されている必要があります。
初めてインスタンスを作る時に以下のようにするとエラーになります。
var manager:ResizeManager = ResizeManager.getManager(new Sprite()); |
Event.RESIZE
通知を一時的に無効にすることも可能です。
// 無効 ResizeManager.stop(); // 再開 ResizeManager.resume(); |
Singletonクラス作成はgskinner先生のgBlog: AS3: Singletonsを参考にさせていただきました。
update 2010-06-17
public static function stop
, public static function resume
に if
を追加しました。