BLOG ENTRY

ActionScript3で外部画像の読み込みと表示&サイズ指定[AS3]

flashdevelop

「as3で外部画像を読み込んで、表示サイズを指定する」というFLASH CS3を使えば2秒でできそうな処理ですが、CS3を使わずコード書いてる自分にはそういうわけにもいかず、「画像サイズを指定する」というとこでちょっとハマりました。

おんなじようにハマってしまう人もいるんじゃないかぁと思ってログっておきます。

※画像表示にはEMBEDではなくloadを使ったやり方が標準的?なんでしょうか

loadを使ったサンプルコード

loadPhoto.as

package {

    import flash.display.*;
    import flash.events.*;
    import flash.net.URLRequest;

    public class loadPhoto extends Sprite {

        public var myRequest:URLRequest;
        public var myLoader:Loader;

        public function loadPhoto() {
            myRequest = new URLRequest("./sample.jpg");
            myLoader = new Loader();
            configureListeners(myLoader.contentLoaderInfo);
            myLoader.load(myRequest);
        }

        public function configureListeners(dispatcher:IEventDispatcher):void {
            dispatcher.addEventListener(Event.COMPLETE, completeHandler);
        }

        public function completeHandler(evt:Event):void {
            myLoader.width = 240;
            myLoader.height = 320;
            addChild(myLoader);
        }
    }
}

で、例えば以下のようなコードでも画像の表示自体はできるんですが、表示サイズの指定はできないようです。

※以下のコード内で画像のサイズ指定をすると、コンパイルエラーなどはでませんが、画像が何も表示されない状態になってしまいました。

loadDefault.as

package {

    import flash.display.*;
    import flash.net.URLRequest;

    public class loadDefault extends Sprite {

        public function loadDefault() {
            var myLoader:Loader = new Loader();
            var myRequest:URLRequest = new URLRequest("./sample.jpg");
            myLoader.load(myRequest);
            addChild(myLoader);
        }
    }
}

これだとどうして画像のサイズ指定ができないかというと、ファイルの読み込みが終わらないとサイズ指定ができないからのようです。
※なので例えば以下のようにEvent.COMPLETEの処理を追記する必要があるみたいです。

var info:LoaderInfo = myLoader.contentLoaderInfo;
info.addEventListener(Event.COMPLETE, completeHandler);

function completeHandler(evt:Event):void {
    myLoader.width = 240;
    addChild(myLoader);
}

その他のイベントリスナ設定

実際はEvent.COMPLETE(読み込み完了)時以外にもいろんなイベントリスナを設定したいので、以下のような感じで書いてます。
※たとえば画像クリック時に縦と横が半分になるようにします。

loadSample.as

package {

    import flash.display.*;
    import flash.events.*;
    import flash.net.URLRequest;

    public class loadSample extends Sprite {

        public var myRequest:URLRequest;
        public var myLoader:Loader;

        public function loadSample() {
            myRequest = new URLRequest("./sample.jpg");
            myLoader = new Loader();
            configureListeners(myLoader.contentLoaderInfo);
            myLoader.load(myRequest);
            myLoader.addEventListener(MouseEvent.CLICK, clickHandler);
        }

        public function configureListeners(dispatcher:IEventDispatcher):void {
            dispatcher.addEventListener(Event.COMPLETE, completeHandler);
            dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
            dispatcher.addEventListener(Event.INIT, initHandler);
            dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            dispatcher.addEventListener(Event.OPEN, openHandler);
            dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            dispatcher.addEventListener(Event.UNLOAD, unLoadHandler);
        }

        public function completeHandler(evt:Event):void {
            myLoader.width = 240;
            myLoader.height = 320;
            addChild(myLoader);
        }

        private function httpStatusHandler(event:HTTPStatusEvent):void {
            trace("httpStatusHandler: " + event);
        }

        private function initHandler(event:Event):void {
            trace("initHandler: " + event);
        }

        private function ioErrorHandler(event:IOErrorEvent):void {
            trace("ioErrorHandler: " + event);
        }

        private function openHandler(event:Event):void {
            trace("openHandler: " + event);
        }

        private function progressHandler(event:ProgressEvent):void {
            trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
        }

        private function unLoadHandler(event:Event):void {
            trace("unLoadHandler: " + event);
        }

        private function clickHandler(event:MouseEvent):void {
            trace("clickHandler: " + event);
            myLoader.width = myLoader.width / 2;
            myLoader.height = myLoader.height / 2;
        }
    }
}

as3って、クラスのプロパティ利用時にthisを書かなくても動くのはなんか違和感。
楽だしありがたいけどw

関連記事

  1. AS3で画像を読み込み表示と埋め込み表示させる違い[AS3]
  2. DisplacementMapFilterとperlinNoiseで外部画像を変形[AS3]
  3. AS3でXMLファイルの内容を読み込んで出力する[AS3]
  4. AS3で外部JSONデータ読み込みのカスタムイベント[AS3][JSON]
  5. 外部SWFの埋め込みフォントを読み込み[AS3]
  • name:AS3で画像を読み込み表示と埋め込み表示させる違い[AS3] | Web&MUSICブログ QUALL
  • date:2009/09/03
  • [...] 以前、ActionScript3で外部画像の読み込みと表示&サイズ指定[AS3]というエントリーを書きましたが、画像をロードして表示させるのと、埋め込んで表示させるのとでSWFファイルサイズの差 [...]

  • type:ピンバック [ ]

    WRITE COMMENT


    (required)


    (required)


    (required)

    MENU