我發現,在一個循環中創建超時通常難於管理 - 你不想不得不取消多次超時。更好的方法是讓函數執行工作,通過在完成之前設置一個超時來間接地調用它,因爲那樣你可以放入一個簡單的if測試來決定是否設置下一個超時並繼續動畫。
也許有點像這樣:
<input id="playPause" type="button" value="Play">
<script>
function initAnimation(animationMs, autoRepeat, waitForPlayButton) {
var currentFrame = 0,
$imgList = $("#gallery > img"),
paused = waitForPlayButton;
function drawNext() {
clearCanvas();
cvsCtx.drawImage($imgList[currentFrame++],0,0);
if (currentFrame >= $imgList.length) {
currentFrame = 0;
if (!autoRepeat) {
paused = true;
$("playPause").prop("value", "Play");
}
}
if (!paused)
setTimeout(drawNext, animationMs);
}
$("playPause").prop("value", waitForPlayButton ? "Play" : "Pause")
.click(function() {
this.value = (paused = !paused) ? "Play" : "Pause";
if (!paused)
drawNext();
});
if (!waitForPlayButton)
drawNext();
}
initAnimation(100, true, false);
</script>
如果autoRepeat
參數是假的動畫將運行一次,並停止,但可以通過按鈕重新啓動,否則,(顯然),它只是不斷重複。
如果waitForPlayButton
是假的動畫將立即開始,否則(顯然)按下按鈕時,它會開始。
按下按鈕將在當前幀暫停。
(未測試,因爲我沒有一堆得心應手的圖片,但我敢肯定你的想法,可以自己解決任何問題,或者讓你得到錯誤,我知道...)
當我回家時我必須測試這個,但我認爲這可能是我的問題的解決方案... – jazzytomato 2012-02-01 13:50:48
這很棒,您的代碼「開箱即用」!非常感謝你 – jazzytomato 2012-02-01 15:34:48