アイコン読み込み&表示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を使った。