2012-07-13 135 views
2

我目前面臨的AS3一個小問題,使用的setInterval。我想要實現的是在for循環中淡入淡出圖像。問題是循環沒有等待setInterval函數完成。在for循環

for(var i in imageClips){ 
    setInterval(function(){ 
     fade(imageClips[i]); 
    }, 6000);   
} 

一旦setInterval函數被調用,循環剛剛開始,行爲就清楚了。我現在的問題是,有沒有辦法讓循環等待setInterval函數中發生的事情呢?

由於提前, 托馬斯

回答

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); 

如果您想再次執行淡入淡出功能。

編輯:包裹着的功能片段。

+0

小康使用',而不是'Timer' setInterval'。 – joncys 2012-07-13 12:26:41

+0

非常感謝!這對我來說非常合適。 – thpl 2012-07-13 12:30:12

+0

Altough這個解決方案工作得很好,我不能想出一個辦法來重複衰落無限次。我試圖用我移動的元素推動數組,但這不起作用。一次迭代可以正常工作,但在此之後圖像開始消失得太快。你能再次幫助我嗎?謝謝:) – thpl 2012-07-13 12:44:48

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 }); 
} 
0

你可以使用,而不是等待動畫結束事件。

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(); 

這種方式,您可以更改持續時間在每個動畫(例如一個影片剪輯的最後一幀)結束分派完成事件您的動畫無需同步任何超時。