Friday, February 22, 2008

SingleListener

Добаляет Listener к объекту который срабатывает только 1 раз.


public class SingleListener {

public static function wrap(target: IEventDispatcher, eventName: String, callback: Function): void
{

var listener: Function = function (event: Event): void
{
try {

callback.call(event.currentTarget, event);
} finally {
target.removeEventListener(eventName, listener);
}

}
target.addEventListener(eventName, listener);
}

}





Пример


[Embed(source="/res/image.png")]
[Bandable]

private var _imageSource: Class;

private var _image: Image = new Image();

override protected function createChildren(): void
{

super.createChildren();
addChild(_image);
_image.source = _imageSource;
workWithImageSize(_image.width, _image.height)

}

private function workWithImageSize(width: Number, height: Number): void
{
trace(width + "x" + height);

}



Output:
0x0

Но на самом деле картинка "/res/image.png" имеет размеры 640x480. Т.е. реальные данные о размере картинки мы получим после первого изменения размеров объекта _image.

override protected function createChildren(): void
{
super.createChildren();
addChild(_image);
_image.source = _imageSource;
//use this strut

SingleListener.wrap(_image, ResizeEvent.RESIZE,
function (event: Event): void
{

workWithImageSize(_image.width, _image.height);
});
}

Output:
640x480

Если после каждого изменения source требуется обработать размеры картинки, можно поступить так.

override protected function createChildren(): void
{
super.createChildren();
addChild(_image);
_image.addEventListener("sourceChanged", doOnSourceChanged );
_image.source = _imageSource;

}

private fucntion doOnSourceChanged(event: Event): void
{
//use this strut here
SingleListener.wrap(_image, ResizeEvent.RESIZE,
function (event: Event): void
{

workWithImageSize(_image.width, _image.height);
});
}

1 comment:

Unknown said...
This comment has been removed by the author.