AS3 使用Loader 加载问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AS3 使用Loader 加载问题相关的知识,希望对你有一定的参考价值。

代码如下:
xml=new XML(loaderUrl.data);
for(var i:int=0; i<xml.img.length();i++)

loader.load(new URLRequest(xml.img[i].@src));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onImage);

使用FOR循环加载,然后使用onImage 函数把 加载的图片信息存入一个数组中。问题是
:我希望他能加载一张图片,就执行一次 onImage ,把它加载到数组中,但是现在的循环是,直到循环了 4次<xml.img.length( )的长度为4> 才开始执行 onImage ,也就导致我只把使用Loader类加载的最后一张图片放入数组中了。
求解决,我想让加载一张图片就执行一次onImage。

var needAry:Array=new Array;
function getLoad():void

xml=new XML(loaderUrl.data);
for(var i:int=0;i<xml.img.length();i++)

needAry.push(xml.img[i].@src));


function beginLoad():void

if(needAry.length)

var nowLoadStr:String=needAry.shift();
var loader=new Loader(new URLRequest(nowLoadStr));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onlmage);
loader.load();


function onlmage(e:Event):void

beginLoad();
参考技术A 加载时是有过程的,你要记录谁加载的谁,然后一一对应处理存储。不能用一个loader去加载,除非你上一个确定加载完了才开始加载下一个图片。你想想人家刚刚打算加载第一个但是你又让它加载第二个了,这样它只有放弃第一个了噻。 参考技术B loader也要在for循环里new,否则你这个就只执行一个。

AS3 Loader 不断重新加载相同的 swf

【中文标题】AS3 Loader 不断重新加载相同的 swf【英文标题】:AS3 Loader keeps reloading same swf over and over 【发布时间】:2011-06-30 00:54:35 【问题描述】:

我在 SWF 的主时间轴上制作了一个 Flash 动画,其中包含几个图层、一些功能和一些关键帧标签。例如,我有一个穿过屏幕的星星的影片剪辑,然后触发主时间线的 dispatchEvent 转到帧标签“下一个”。

以下是主时间轴上使用的动作脚本示例:

Stars.addEventListener("fadeInTitle",_fadeInTitle);

function _fadeInTitle(e:Event):void 
    Title.gotoAndPlay("fadeIn");
    Stars.removeEventListener("fadeInTitle",_fadeInTitle);


stop();

仅 SWF 就可以完美运行。当我尝试将此 SWF 加载到另一个 SWF 时,问题就来了。 发生的情况是加载器不断地重新加载 SWF,重叠它们,并且加载的 SWF 的主时间线上的动作脚本被忽略,时间线连续播放。这是我用来加载 SWF 的代码:

import flash.net.URLRequest;
import flash.display.Loader;
import flash.events.Event;
import flash.events.ProgressEvent;

function startLoad()
    var mLoader:Loader = new Loader();
    var mRequest:URLRequest = new URLRequest("Fly.swf");
    mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
    mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
    mLoader.load(mRequest);


function onCompleteHandler(loadEvent:Event)
    addChild(loadEvent.target.content);


function onProgressHandler(mProgress:ProgressEvent)
    var percent:Number = mProgress.bytesLoaded/mProgress.bytesTotal;


startLoad();

那里没有什么特别的。只是一个简单的加载器。

我找到了一种解决方法,将整个动画放在一个主影片剪辑中,然后将该影片剪辑放在主时间轴上(一个关键帧,一层,无动作脚本),然后加载它。这样它工作得很好,但感觉更像是一个补丁而不是一个解决方案。我真的很想知道为什么当您尝试加载使用具有多个图层、关键帧和动作脚本的主时间轴的外部 SWF 时会出现问题。

任何帮助/提示将不胜感激。 非常感谢阅读。

【问题讨论】:

您是否尝试在 startLoad() 中设置断点以确保它只被调用一次? 【参考方案1】:

首先从函数中取出加载器实例化,没有必要。其次,在 onComplete 函数中杀死你的听众。第三,如果此加载程序代码在加载程序外壳的时间线上,请确保不超过一帧,或者如果存在(不确定为什么会有)在包含加载程序代码的帧上放置一个停止点。或者更好的是,使用 Document 类来包含您的加载器代码,而不是将其放在时间轴上。我最好的猜测是你以某种方式再次调用 startLoad() 。此外,请确保您已安装 Flash 调试播放器,以便在浏览器中查看此内容时获得正确的错误报告。

var mLoader:Loader = new Loader();
var mRequest:URLRequest = new URLRequest("Fly.swf");
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
mLoader.load(mRequest);


function onCompleteHandler(loadEvent:Event)

    mLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onCompleteHandler);
    mLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgressHandler);
    addChild(loadEvent.target.content);


function onProgressHandler(mProgress:ProgressEvent)

    var percent:Number = mProgress.bytesLoaded/mProgress.bytesTotal;

【讨论】:

感谢您的回答,您的观点是正确的,我修改了加载器,但这不是问题。我意外地找到了解决方案。我想对加载的 fla 文件进行一些测试,所以我只是将它保存在另一个名称下,重新导出了 swf 并在我的加载器中调用了那个新的 swf。代码或任何东西都没有改变,它工作得很好。我怀疑旧的 fla 文件有某种损坏或一些随机内存错误。 这很奇怪,但并不奇怪。大多数情况下,Flash 表现良好,但当它不表现时,有时会变得非常莫名其妙。感谢您的复选标记。赞赏。 :)

以上是关于AS3 使用Loader 加载问题的主要内容,如果未能解决你的问题,请参考以下文章

ActionScript 3 带有圆形预加载器微调器的AS3 Image Loader

AS3:加载外部txt文件

AS3 MovieClip 无法持续​​播放

如何使用 AS3 从 Web 服务器加载二进制数据?

flash as3.0获取外部视频总的时间长度 和视频已播放的时间长度

ActionScript 3 AS3:Flickr Loader