載入控制常常是各大Flash討論版中名列前矛的老掉牙問題串,可見如何做好載入控制是一個很重要的課題,FL1.1 載入外部檔案的限制是一個frame只能執行一次載入,而 FL2.X 則是一個frame只處理5次載入事件,FL1.1 載入研究在很久以前就已經分享過了,所以這次與大家分享是幾種FL2.X處理載入控制的方法:
Load Manager有個很重要的特點:唯一性,當多個載入的SWF中如果也有load行為時,Load Manager只能存在一個。
為了達到Load Manager的唯一性,這邊使用程式 Design Pattern 中蠻常用的 Singleton Pattern來實作,講到這邊大概已經有人快崩潰了,連Design Pattern的字眼都出現了,感覺越扯越專業捏?不過別緊張,搞不懂原理的人就直接將.as拿去修改使用就好,Erin一直認為,如果你對它有興趣,就會願意花很多時間去理解它,強求是沒有用的。回到正題,Singleton 顧名思義就是"獨生子",它的原理就是讓 Class只有一個實體,不管誰來跟它要東西,它也只提供一個窗口。好嚕!Erin 的懶人程式講解就到這邊,有興趣的請直接點選上面的聯結去理解它個夠!
[LoadManager.as version 1 教學檔下載]
LoadManager.as:
在一開始的屬性宣告就建立一個實體
提供窗口讓外部取得實體,這樣的方式就可以確保所有人使用LoadManager時,用到的都是同一個實體。處理載入事件的是最簡單的 onEnterFrame,目的是讓loading工作簡單化,手機AP開發重點之一:簡單卡好
用法:
接下來測試看看
LoadManager01_1.swf:
LoadManager01.swf:
output message:
你會發現它共分了三個frames將所有的東西載入!^^
on target 實際測試:(Nokia 7610)
很不幸的,當大量的載入在同一時間執行,即使已經使用單一窗口進行載入工作,還是會有漏圖的情況產生,尤其外部檔案大口吃掉記憶體時情況更為嚴重,所以在Flash lite AP的設計上,最好規避同一時間進行太多的載入工作,或者請愛用一個frame只做一次載入,這樣漏圖的情況會降到最低...修改很簡單,僅將 LoadManager.as中的doLoad迴圈部份mark起來就好...=)
也許還有其他更棒的方法,如果新發現的話再與大家分享...=)
為了達到Load Manager的唯一性,這邊使用程式 Design Pattern 中蠻常用的 Singleton Pattern來實作,講到這邊大概已經有人快崩潰了,連Design Pattern的字眼都出現了,感覺越扯越專業捏?不過別緊張,搞不懂原理的人就直接將.as拿去修改使用就好,Erin一直認為,如果你對它有興趣,就會願意花很多時間去理解它,強求是沒有用的。回到正題,Singleton 顧名思義就是"獨生子",它的原理就是讓 Class只有一個實體,不管誰來跟它要東西,它也只提供一個窗口。好嚕!Erin 的懶人程式講解就到這邊,有興趣的請直接點選上面的聯結去理解它個夠!
[LoadManager.as version 1 教學檔下載]
LoadManager.as:
在一開始的屬性宣告就建立一個實體
private static var _manager:LoadManager = new LoadManager();
提供窗口讓外部取得實體,這樣的方式就可以確保所有人使用LoadManager時,用到的都是同一個實體。處理載入事件的是最簡單的 onEnterFrame,目的是讓loading工作簡單化,手機AP開發重點之一:簡單卡好
static function getInstance():LoadManager {
return _manager;
}
用法:
var loader = LoadManager.getInstance();
loader.loadClip(fileURL, targetMovieClip);
接下來測試看看
LoadManager01_1.swf:
var loader = LoadManager.getInstance();
for (var i = 0; i<7; i++) {
var mc = this.createEmptyMovieClip("m"+i, i+1);
loader.loadClip("2.swf", mc);
mc._x += i*20;
}
LoadManager01.swf:
var loader = LoadManager.getInstance();
var haha = this.createEmptyMovieClip("mc", 0);
haha._y = 100;
loader.loadClip("LoadManager01_1.swf", haha);
//載入LoadManager01_1.swf來共用LoadManager
for (var i = 0; i<7; i++) {
var mc = this.createEmptyMovieClip("m"+i, i+1);
loader.loadClip("1.swf", mc);
mc._x += i*20;
}
output message:
*** Load manager: start ***
Load manager: load LoadManager01_1.swf to _level0.mc
Load manager: load 1.swf to _level0.m0
Load manager: load 1.swf to _level0.m1
Load manager: load 1.swf to _level0.m2
Load manager: load 1.swf to _level0.m3
Load manager: load 1.swf to _level0.m4
Load manager: load 1.swf to _level0.m5
Load manager: load 1.swf to _level0.m6
Load manager: load 2.swf to _level0.mc.m0
Load manager: load 2.swf to _level0.mc.m1
Load manager: load 2.swf to _level0.mc.m2
Load manager: load 2.swf to _level0.mc.m3
Load manager: load 2.swf to _level0.mc.m4
Load manager: load 2.swf to _level0.mc.m5
Load manager: load 2.swf to _level0.mc.m6
*** Load manager: closed ***
你會發現它共分了三個frames將所有的東西載入!^^
on target 實際測試:(Nokia 7610)
很不幸的,當大量的載入在同一時間執行,即使已經使用單一窗口進行載入工作,還是會有漏圖的情況產生,尤其外部檔案大口吃掉記憶體時情況更為嚴重,所以在Flash lite AP的設計上,最好規避同一時間進行太多的載入工作,或者請愛用一個frame只做一次載入,這樣漏圖的情況會降到最低...修改很簡單,僅將 LoadManager.as中的doLoad迴圈部份mark起來就好...=)
private function doLoad() {
//while (_count++<5) {
if (_loadList.length>0) {
var now:Array = _loadList[0];
now[1].loadMovie(now[0]);
trace("Load manager: load "+now[0]+" to "+now[1]);
_loadList.shift();
} else {
trace("*** Load manager: closed ***");
_isLoading = false;
delete _eventHandler.onEnterFrame;
_eventHandler.removeMovieClip();
//break;
}
//}
//_count = 0;
}
也許還有其他更棒的方法,如果新發現的話再與大家分享...=)
Comments
Post a Comment