勤奋的蜗牛 发表于 2019-8-18 16:06:25

请教同时加载多张图片

用一个Loader加载多张图片,一张一张排队加载速度太慢了,我的程序是在本地运行的,所以我想for多个Loader同时加载,但这样加载完成后顺序全乱了,图片加载完成后怎么知道是那个Loader加载进来的?或者有什么更好的方法吗?

var imgLoader1:Loader = new Loader();
var imgLoader2:Loader = new Loader();
var imgLoader3:Loader = new Loader();

imgLoader1.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
imgLoader2.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
imgLoader3.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);

function completeHandler(event:Event):void {
        var img:Bitmap = new Bitmap(event.target.content.bitmapData,"auto",true);
        //这里怎么知道图片是那个Loader加载进来的?
}

wgq341 发表于 2019-8-18 16:06:26

加栽完成后顺序不乱,建议一张一张加载。

var url:Array = new Array("pic_1.jpg,pic_2.jpg,pic_3.jpg");
var loader:DisplayLoader = new DisplayLoader(url);
loader.addEventListener(Event.COMPLETE,completeHandler);
loader.addEventListener(ProgressEvent.PROGRESS,progressHandler);
function progressHandler(event:Event):void
{
   trace(event.target.percent + "%");

}

function completeHandler(event:Event):void
{
//加载完成***********
addChild(loader);
}



package
{
        import flash.display.Sprite;
        import flash.display.Loader;
        import flash.net.URLRequest;
        import flash.events.Event;
        import flash.events.ProgressEvent;
        import flash.events.IOErrorEvent;

        public class DisplayLoader extends Sprite
        {
                private var loader:Loader;
                private var list:*;
                private var index:int = 0;
                private var total:int;
               
                /*
                * DisplayLoader
                * @param    url   外部显示对象地址(可以是XMLList、XML、Array、String)
                */
                public function DisplayLoader(url:*):void
                {
                        this.list = url;
                        if (list is XMLList||list is XML)
                        {
                                total = list.length();
                                load(list);
                        }
                        if (list is Array)
                        {
                                total = list.length;
                                load(list);
                        }
                        if (list is String)
                        {
                                load(list);
                        }

                }


                public function load(url:String):void
                {
                        loader = new Loader;
                        loader.load(new URLRequest(url));
                        loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,progressHandler);
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
                       
                }

                private function progressHandler(event:ProgressEvent):void
                {
                        this.dispatchEvent(new Event(ProgressEvent.PROGRESS));
                }

               

                private function completeHandler(event:Event):void
                {
                        loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,completeHandler);
                        addChild(loader);
                        if (list is XMLList||list is XML||list is Array)
                        {
                                next();
                        }
                        else
                        {
                                this.dispatchEvent(new Event(Event.COMPLETE));
                        }
                  //这里可以为每张图片命名储存查找
                }


                private function next():void
                {
                        if (index<total-1)
                        {
                                index++;
                                load(list);
                        }
                        else
                        {
                                this.dispatchEvent(new Event(Event.COMPLETE));
                        }

                }

                /*加载进度*/
                public function get percent():Number
                {
                        return Math.round(loader.contentLoaderInfo.bytesLoaded/loader.contentLoaderInfo.bytesTotal*100);
                }


        }
}

kasher 发表于 2019-8-18 18:16:21

命名,关联

勤奋的蜗牛 发表于 2019-8-18 19:28:55

kasher 发表于 2019-8-18 18:16
命名,关联

情况是这样,例如有20张图片,pic_1.jpg、pic_2.jpg、pic_3.jpg........
一个Loader排队加载,加载完成顺序是这样的:pic_1.jpg、pic_2.jpg、pic_3.jpg........
for多个Loader同时加载,加载完成顺序是这样的:pic_18.jpg、pic_5.jpg、pic_8.jpg........
反正顺序就是乱的,根本不知道那张是pic_1那张是pic_20

怎么才能获取加载进来的图片编号?

勤奋的蜗牛 发表于 2019-8-18 21:36:34

wgq341 发表于 2019-8-18 20:20
加栽完成后顺序不乱,建议一张一张加载。

var url:Array = new Array("p ...

谢谢,不是我想要的效果,这个本质还是一张一张加载,最后一起显示,速度和多个Loader同时加载没有可比性,真的搞不懂本地加载图片竟然如此慢,就好像加载网络图片一样,就这点AS2就比AS3灵活太多。

wgq341 发表于 2019-8-18 22:02:54

上面的代码只是建议用一张一张加载。
同时加载N张图片,(图片大小不一,所以顺序肯定是乱的);
每个加栽完成后重新命名,imgLoader1为1,imgLoader2为2;
如果需要显示排序,可以设置坐标、也可以用深度控制,当然还有其他好方法;


勤奋的蜗牛 发表于 2019-8-18 22:19:57

wgq341 发表于 2019-8-18 22:02
上面的代码只是建议用一张一张加载。
同时加载N张图片,(图片大小不一,所以顺序肯定是乱的);
每个加栽 ...

我试了,其实还是排队加载。
你可以for多个loader同时加载和单个loader排队加载看看速度,速度起码相差10倍。
for (var i=0; i<n; i++) {
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
        loader.load(new URLRequest(urlArr));
}

勤奋的蜗牛 发表于 2019-8-18 22:57:51

哈哈,解决了,其实变通下就好,开始加载前先把所有loader保存到数组,这样加载完后想干什么就干什么。
还是要感谢下 @wgq341

kasher 发表于 2019-11-27 19:37:03

本帖最后由 kasher 于 2019-11-27 19:46 编辑

学习了#:)#:)

NameAfterLf 发表于 2019-11-29 10:03:19

其实可以FOR循环,然后根据循环的图片赋予ID和name属性。然后添加进数组或者容器。需要那个就调用哪个就好了。
页: [1] 2
查看完整版本: 请教同时加载多张图片

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)