アイコン読み込み&表示3

タイムラグがどうこうの話だが、ここらへんに書いてあった。

http://clockmaker.jp/blog/2008/07/flex_image_cache/

結構衝撃だった。cacheAsBitmapとかいうのは、あくまでインスタンスの中でだけキャッシュするという話で、URLを指定すると毎回読みに行っていたのだ。
つまり、Image共通のキャッシュをつくってやればよい。Imageを継承する方法で攻めてみた。

public class ImageEx extends Image
{
	private static var _cache : Object = { };
	
	public function ImageEx() 
	{
		super();
	}
	
	public override function load(url : Object = null) : void
	{
		var val : Object = _cache[url];
		if (val) {
			super.load(new Bitmap(val as BitmapData));
		}else {
			super.load(url);
		}
		this.addEventListener(Event.COMPLETE, onComplete);
	}
		
	private function onComplete(event : Event) : void
	{
		this.removeEventListener(Event.COMPLETE, onComplete);
		if (source is String && !_cache[source]) {
			var bd : BitmapData = new BitmapData(content.width, content.height, true);
			bd.draw(content);
			_cache[source] = bd;
		}
	}
		
	static public function get cache():Object { return _cache; }
		
	static public function set cache(value:Object):void 
	{
		_cache = value;
	}
}

これだとサイズをかえられたときはどうしようもないが、TLifeの場合はcacheをクリアしてしまえばいいんじゃないかな。あと2種類以上のキャッシュを使い分けるとかいうこともないので、staticで持っている。
COMPLETEイベントまわりは、ちょっと見て内部でオーバーライドできる関数がなかったのでしかたなくeventListenerを使った。