萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 軟體知識 >  >> 影像處理 >> Flash 教學

Flash Loading 動畫製作核心原理與三種實作模式

Flash Loading 製作核心:getBytesLoaded/getBytesTotal + 間隔輪詢三模式深度解析

Loading 是使用者等待時唯一看到的介面,其品質直反映開發者專業度。核心 API 僅兩個:getBytesLoaded() / getBytesTotal()。本文詳解三種輪詢實作模式優劣,並指出常見陷阱。

核心概念:進度計算

var progress:Number = getBytesLoaded() / getBytesTotal(); // 0 ~ 1
if (progress == 1) { /* 載入完成 */ }

模式一:setInterval 定時器輪詢(不推薦新手)

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 指向問題),代碼規範性差。

模式二:onEnterFrame 幀事件輪詢(最推薦,直觀高效)

// 時間軸框架代碼(非元件上)
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)`)檢查進度,代碼分散、難維護,已被淘汰。

進階主題預告

  • MovieClipLoader 類別:非同步載入外部 SWF/JPG/MP3 的標準類,支援進度事件、完整錯誤處理、載入完成回呼,適合載入外部資源場景。
  • V2 組件載入問題:元件框架本身體積大、初始化複雜,Loading 邏輯需延遲至元件實例化後,否則進度條會卡在 0%。

最佳實踐建議

  1. 每個專案**客製化 Loading**,體現品牌風格,而非套用現成元件。
  2. 代碼集中在**主時間軸框架層**,避免散落在元件內部。
  3. 進度條 UI 設計:寬度縮放(`_xscale`)、遮罩寬度、文字百分比、創意圖形變形等皆可。
  4. 完成後務必清理監聽器(`onEnterFrame = null` 或 `clearInterval`)。
copyright © 萬盛學電腦網 all rights reserved