我目前在AS3面临一个小问题。我想要实现的是在for循环中淡化图像。问题是循环没有等待setInterval函数完成。
for(var i in imageClips){
setInterval(function(){
fade(imageClips[i]);
}, 6000);
}
一旦调用了setInterval函数,该行为就很明显了。我现在的问题是,有没有办法让循环等待完成setInterval函数中发生的事情?
提前致谢, 托马斯
答案 0 :(得分:1)
setInterval
不会延迟循环执行。你可以这样做:
function fadeImages(imageClips) {
// Create a clone
var imageStack:Array = imageClips.concat();
// Create the callback that will fade all images
var doFade:Function = function() {
if (imageStack.length > 0) {
fade(imageStack.shift());
setInterval(doFade, 6000);
}
}
// Start fading images
doFade();
}
// Fade specified images
fadeImages(imageClips);
如果你想再次进行淡入淡出,请再次使用该功能。
修改:使用函数包装代码段。
答案 1 :(得分:1)
如果您使用Greensocks'TweenMax之类的图书馆来补充你的生活,那么你的生活会变得更轻松。它几乎是Flash中程序化动画的标准,并提供了惊人数量的功能,包括在补间上设置延迟的功能。
使用TweenMax,您的代码看起来像这样:
var delay:int = 6; // delay between fades in seconds
var duration:int = 1; // duration of fade in seconds
for (var i in imageClips)
{
TweenMax.to(imageClips[i], duration, { alpha: 0, delay: i * delay });
}
答案 2 :(得分:0)
您可以使用事件而不是等待动画结束。在每个动画结束时发送一个完整的事件(例如,在MovieClip的最后一帧):
dispatchEvent(new Event(Event.COMPLETE));
然后为每个动画添加侦听器:
var index:int = -1;
function fadeNext(event:Event = null):void {
index += 1;
if (index < imageClips.length) fade(imageClips[index]);
}
for (var i in imageClips) {
imageClips[i].addEventListener(Event.COMPLETE, fadeNext, false, 0, true);
}
fadeNext();
这样您就可以更改动画的持续时间,而无需同步任何超时。