5

現在、次の関数を使用して画像を読み込んでいますが、同じ関数を使用して次の画像を配置する前に使用する予定の、読み込まれた画像の幅を見つける方法がわかりませんでした。

qは、異なる画像をロードするために使用される変数(数値)であることに注意してください。

=Xロードされた画像の幅を取得するのに助けが必要です...

function LoadImage(q)
{
    var imageLoader:Loader = new Loader();
    var image:URLRequest = new URLRequest("GalleryImages/Album1/"+q+".jpg");
    imageLoader.load(image);
    addChild (imageLoader);
    imageLoader.x = 0 + CurrentXLength;
    imageLoader.y = 0;
    imageLoader.name = "image"+q;
    trace(imageLoader.x)
}
4

4 に答える 4

12

実際にロードされるまで、ビットマップの幅を知ることはできません:

function LoadImage(q)
{
    var imageLoader:Loader = new Loader();
    var image:URLRequest = new URLRequest("GalleryImages/Album1/"+q+".jpg");
    imageLoader.contentLoader.addEventListener(Event.COMPLETE, ImageLoaded);
    imageLoader.load(image);
    addChild (imageLoader);
    ...


private function ImageLoaded(e:Event):void
{
    var imageLoader:Loader = Loader(e.target.loader);
    var bm:Bitmap = Bitmap(imageLoader.content);
    var CurrentXLength = bm.width;
    ....

または、このリンクが役立つ場合がありますか? 自分では試していません...

于 2008-12-23T16:24:07.260 に答える
2

ローダーオブジェクトのdewidthプロパティを要求しました。

var loader:Loader;

function loadImage(dir:String):void {
    loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, placeImage);
    var urlReq:URLRequest = new URLRequest(direccion);
    loader.load(urlReq);
}

function placeImage(o:Event):void {
    loader.x = (1360 - loader.width)/2;
    loader.y = (768 - loader.height)/2;
    addChild(loader);
}

ここで、1360と768はキャンバスの寸法です...

于 2011-12-20T10:02:27.290 に答える
1

幅にアクセスするには、Event.COMPLETE を処理するために割り当てられた関数内で行う必要があります。

「ロードしたいアイテムを含む配列が必要になるでしょう。動的でスケーラブルになるように、おそらくこのデータを XML でロードする必要があります。xml データがロードされたら、好きな方法で配列に割り当てる必要があります。基本的に配列である XML オブジェクトを使用するだけでなく、この状況で配列を使用する必要がある理由は、次のオブジェクト X の位置を最後のオブジェクト X に基づいて設定できるように、オブジェクトの幅を知る必要があるためです。位置とその幅。

XML では、for ループを使用して "x" 回繰り返すのが一般的です。この場合、これは望ましくありません。ロードされたアセットの「WIDTH」プロパティを取得するには、ローダーが Event.COMPLETE を起動したときに起動するように割り当てられた関数内からアクセスする必要があります。画像が完了すると、配列からアイテムが削除され、lastX と lastWidth に関する変数が設定され、配列内の次のアイテムが取得され、最初からやり直されます。最終的に配列は空になり、プロセスは完了します。

- 注: XML の読み込みをスキップし、自分で配列にデータを挿入するだけです。

package
{
    import flash.display.Sprite;
    import flash.display.Loader;
    import flash.net.URLRequest;

    public class DocumentClass extends Sprite
    {
        private var _array:Array;
        private var _lastX:Number;
        private var _lastWidth:Number;

        public function DocumentClass():void
        {
            _array = new Array();
            //Add Items to an array however you wish.  I did it
            //this way to make it easier to read on this site.

            _array.push({name: "image1", path: "path/to/image1"});
            _array.push({name: "image2", path: "path/to/image2"});
            _array.push({name: "image3", path: "path/to/image3"});

            loadImage();
        }
        private function loadImage():void
        {
            if(_array.length > 0)
            {
                var loader:Loader = new Loader();
                addChild(loader);

                var request:URLRequest = new URLRequest(_array[0].path); //Loads first item in the array each time.
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
                loader.x = _lastX + _lastWidth;
                laoder.load(request);

                _lastX = loader.x; //We set after so we are ready for the next.

                _array.shift(); //Remove the first item from the array.
            }
        }
        function onImageLoaded(e:Event):void
        {
            _lastWidth = e.target.width;
            loadImage(); //Attempt to load another image if the array isn't empty.
        }
    }
}

コードはテストされていませんが、コンセプトは有効なようです。

于 2008-12-23T16:00:14.657 に答える
0

ええ、私はスコットの答えを使用しましたが、「imageLoader.contentLoader」は LoadImage() 関数で「imageLoader.contentLoaderInfo」でなければならないことに注意してください。私のために幅の問題を解決しました-ありがとうmang

于 2009-08-28T02:57:13.963 に答える