0


1

私はたくさんの画像(約100枚)をメモリにロードしようとしているので、いつでも表示することができます。 もともと私は単純にそれらを埋め込んでいましたが、もちろんその結果swfファイルは私が望んでいたよりも大きくなりました。 だから今、私はそれがバックグラウンドでそれらをロードするように変更しようとしています。

おそらくこれにはたくさんの問題があります。 現在のところ、 'TypeError:エラー#1034:型強制に失敗しました: "foo.jpg"をClassに変換できません。

私はしばらくの間グーグルしてきました、外部の画像をロードすることが一般的なことであると仮定して。 それが私がLoaderとURLRequestのコードを手に入れたところですが、明らかに何かが足りないのです。 多分それは私の間抜けなループ論理によるものです。

これがこれまでのクラスです

パブリッククラスCardImages2 {public static var fooImage1:Class; public static var fooImage2:Class; public static var fooImage3:Class; public static var fooImage4:クラス。

private static var curImgClass:クラス。

public static function load():void {//カードとそのURLのマップvar dict:Dictionary = new Dictionary; dict [fooImage1] = "fooImage1.jpg"; dict [fooImage2] = "fooImage2.jpg"; dict [fooImage3] = "fooImage3.jpg"; dict [fooImage4] = "fooImage4.jpg";

var url:文字列。 var loader:Loader = new Loader(); var urlReq:URLRequest;

それぞれ(var key:dictのクラス){url = String(dict [key]); curImgClass = key; loader.contentLoaderInfo.addEventListener(Event.COMPLETE、loadListener); urlReq = new URLRequest(encodeURI(url)); loader.load(urlReq); }}

プライベート静的関数loadListener(e:Event):void {curImgClass.source = Class(e.currentTarget.content);} }}

2 Answer


1


達成しようとしている内容によっては、ここでいくつかのことが起こる可能性があります。

後で使用するためにビットマップデータをロードしてそこからClassオブジェクトを作成することは可能ですが、一度ロードした後はビットマップデータの複数のインスタンスを作成したくないので、ビットマップデータをロードしてビットマップを保存するのが一般的です。 、多くの理由で、メモリオーバーヘッドが少なくありません。

BulkLoaderを使用するというAlexの提案はすばらしいものですが、問題を自分で解決するための1つの方法を説明するために、3つの画像をBitmapインスタンスとしてDictionaryオブジェクトにロードするこの例をまとめました。

プライベート変数ローダー:辞書;プライベートvar画像:辞書。

private var imageUrls:Array = ["Image1.png"、 "Image2.png"、 "Image3.png"];

プライベート関数onCreationComplete():void {loadImages();} }

プライベート関数loadImages():void {loaders = new Dictionary();} images = new Dictionary();

それぞれ(var imageUrl:imageUrlsの文字列){var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener(Event.COMPLETE、onURLLoaderComplete); urlLoader.dataFormat = URLLoaderDataFormat.BINARY; urlLoader.load(new URLRequest(imageUrl));

loaders [urlLoader] = imageUrl; }}

プライベート関数onURLLoaderComplete(event:Event):無効{var loader:Loader = new Loader();} loader.contentLoaderInfo.addEventListener(Event.COMPLETE、onLoaderComplete); loader.loadBytes(event.target.data);

loaders [loader.contentLoaderInfo] = loaders [event.target];ローダーを削除する[event.target]; }

プライベート関数onLoaderComplete(event:Event):void {images [loaders [event.target]] = event.target.content;ローダーを削除する[event.target]; }

これはかなりのコードですが、手順はかなり簡単です。

  1. Dictionaryオブジェクトを使用して、それぞれの画像をどのローダーが使用したかを記憶するために、それぞれの画像を独自のURLLoaderでロードします。

  2. 各URLLoaderが結果を返したら、Loaderを使用して結果の実際のバイトを取得します。そして

  3. ローダーロードされた結果のバイトをあなたのイメージ辞書に格納してください。

読み込みがすべて完了したら、画像のURL(またはファイル名、または好きなもの)をキーにした、使用可能なDictionaryを用意し、それぞれの個別の画像インスタンスを含めるようにします。 そこから、Classオブジェクトを作成する必要がある場合(例えば、カスタムカーソルとして使用する場合など)、それがあなたがしようとしていることであればポストバックすることができます。


0


あなたは bulk-loader試してみるべきです。 私はいくつかのプロジェクトでそれを使用しました、そしてそれはかなりうまくいきます。 それがメモリを占有する可能性がありますし、100の画像をロードしている場合は特に厄介なリークを引き起こす可能性があるので、それの後だけクリーンアップするようにしてください。