書き物

技術とか作った物の話とか愚痴文句感想など

「Image」クラスの「load」メソッド

昨日までImageは描画の要かも?と思っていましたが、要でした。

これで描画の自由度が増します。


それはいいとして、本題は「Image」クラスが持つ「load」メソッドです。

僕がこれまでよく聞いた「Loader」クラスとは少し使い方が違っていまして、かなり混乱しました。

ちなみに「Loader」の使い方以下のリンクをご覧下さい。

ActionScript 3.0メモ:ネットからのFlash(SWF)や画像の読み込み


違いといってもちょっとしたことなのですが、

イベントリスナーの登録をするオブジェクトが

「Loader」の場合、「Loader.contentLoaderInfo」で、

「Image」の場合は「Image」自身であることです。

(厳密には「Image」が持っているのではなく、「Image」が継承している「SWFLoader」が持っています。)

具体的なコードを示します。

ビットマップを読み込んでいます。

package
{
import ・・・
public class TestPanel extends Panel
{
// ■コンストラクタ
public function TestPanel()
{
// ロード
var loader:Image = new Image();
loader.addEventListener(Event.COMPLETE, completeHandler);
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
loader.addEventListener(Event.INIT, initHandler);
loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
loader.addEventListener(Event.OPEN, openHandler);
loader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
loader.addEventListener(Event.UNLOAD, unLoadHandler);
loader.load("test/testbmp.png");
addChild(loader);
}
// --------------------------------------------------------------------------------------
// --イベントリスナーメソッド   -----------------------------------------------------------------
// 読み込み完了イベント
private function completeHandler(event:Event):void
{
trace("読み込み完了:" + event);
}
// HTTPステータスイベント
private function httpStatusHandler(event:HTTPStatusEvent):void
{
trace("HTTPステータス:" + event);
}
// 初期化イベント
private function initHandler(event:Event):void
{
trace("初期化:" + event);
}
// エラーイベント
private function ioErrorHandler(event:IOErrorEvent):void
{
trace("エラー:" + event);
}
// オープンイベント
private function openHandler(event:Event):void
{
trace("オープン:" + event);
}
// プログレスイベント
private function progressHandler(event:ProgressEvent):void
{
trace("プログレス:" + event.bytesLoaded + "/" + event.bytesTotal);
}
// アンロードイベント
private function unLoadHandler(event:Event):void
{
trace("アンロード:" + event);
}
}
}



実のところ、今回僕が一番混乱した部分というのは、「Loader」と「Image」よりも、

「Image.content」にいつ読み込んだしたビットマップとかのオブジェクトが代入されるかでした。

今までloadなんとかみたいな操作をしたことが無かったことにより経験不足が原因です。


具体的に言うと、上のコードのコンストラクタの最後に

trace(loader.content);

と書いても実行してみるとその段階では出力は「null」になると思います。(まだロード中だから)

でも読み込み完了イベントリスナーメソッドの「completeHandler」メソッド中に同じようにtraceすると

今度は無事に読み込んだビットマップとかのオブジェクトが出力されます。(ロードが完了しているから)


つまり僕は前者のようにコンストラクタの最後で「content」にアクセスして、

「なぜnullッ!」

と苦しんでいたのでした。

皆様もお気をつけ下さいませ。