Loading 是使用者等待時唯一看到的介面,其品質直反映開發者專業度。核心 API 僅兩個:getBytesLoaded() / getBytesTotal()。本文詳解三種輪詢實作模式優劣,並指出常見陷阱。
var progress:Number = getBytesLoaded() / getBytesTotal(); // 0 ~ 1
if (progress == 1) { /* 載入完成 */ }
function loadCheck():Void {
var p:Number = getBytesLoaded() / getBytesTotal();
if (p == 1) {
clearInterval(intervalID); // 必須清除,否則整個 SWF 生命週期持續佔用 CPU
gotoAndPlay(startFrame);
}
}
var interval:Number = 30; // 毫秒
var intervalID:Number = setInterval(loadCheck, interval);
缺點:易忘 clearInterval 導致記憶體洩漏;函數作用域中訪問目標 MC 路徑麻煩(this 指向問題),代碼規範性差。
// 時間軸框架代碼(非元件上)
loader_mc.onEnterFrame = function():Void {
var targetMC:MovieClip = this._parent; // 取得主時間軸或容器
var p:Number = targetMC.getBytesLoaded() / targetMC.getBytesTotal();
// 更新進度條 UI:loader_mc.bar._xscale = p * 100; 等
if (p == 1) {
this.onEnterFrame = null; // 移除監聽,釋放資源
gotoAndPlay(startFrame);
}
};
優點:
this 直接指向掛載事件的 MC(進度條本身),訪問同層/父層元件極其方便(this._parent、this._root)。null,簡潔可靠。在時間軸建立兩幀循環(`gotoAndPlay(_currentframe-1)`)檢查進度,代碼分散、難維護,已被淘汰。