原因是以往慣用的getBytesLoaded/getBytesTotal有點不夠用了
MovieClipLoader
是Flash Player7 以後才支援的指令
官方文件是說
使用這個方法 ( 而非 loadMovie() 或 MovieClip.loadMovie()) 具有以下優點:
• 剛開始載入時,MovieClipLoader.onLoadStart() 處理常式會被叫用。
• 若該片段無法載入,則 MovieClipLoader.onLoadError() 處理常式會被叫用。
• 在載入程序持續進行時,MovieClipLoader.onLoadProgress() 處理
常式會被叫用。
• 該片段之第一個影格中的動作已經執行完畢時,
MovieClipLoader.onLoadInit() 處理常式便會被叫用,
也就是說您可以開始操作載入片段了。
我想重點是較方便得到外部檔載入時,所需要的一些資訊
載一個檔試試
stop();
//空白mc
_root.createEmptyMovieClip("testMc", 1);
// 設 監聽器及 mc loader
var my_mcl = new MovieClipLoader();
myListener = new Object();
my_mcl.addListener(myListener);
//載入
my_mcl.loadClip("temp/test.swf", testMc);
比以前用loadMovie麻煩多了,要設listener又要設mc loader
所以再來研究到底能幹嘛
一些函式
stop();
//空白mc
_root.createEmptyMovieClip("testMc", 1);
// 設 監聽器
var my_mcl = new MovieClipLoader();
myListener = new Object();
myListener.onLoadStart = function(target_mc) {
trace("===================================");
trace(target_mc+"開始下載");
trace("來源URL:"+target_mc._url);
trace("===================================");
};
myListener.onLoadProgress = function(target_mc, loadedBytes, totalBytes) {
trace("**");
trace(target_mc+"下載中,目前進度:");
trace(loadedBytes+"/"+totalBytes+"(bytes)");
trace("**");
};
myListener.onLoadComplete = function(target_mc) {
trace("===================================");
trace(target_mc+"下載完成");
var loadProgress = _root.my_mcl.getProgress(target_mc);
trace("檔案大小為:"+loadProgress.bytesTotal+" bytes");
target_mc.play();
target_mc._lockroot = true;
trace("===================================");
};
my_mcl.addListener(myListener);
//載入
my_mcl.loadClip("temp/test.swf", "testMc");
這三個比較簡單
myListener.onLoadStart
會在開始載入時被呼叫
myListener.onLoadProgress
在載入過程中被呼叫,呼叫次數應該不是by frame的,可能是資料量載入一次就叫一次…(我猜的)
因為在我調整不同的fps後,被呼叫的次數都一樣,而且若是by frame似乎就沒必要用它了
myListener.onLoadComplete
載入完成時呼叫
這樣用起來,就覺得比以前一直enterframe來得方便多了
錯誤偵測
同樣上述的script,插入下列這個函式,再把下載位置隨便改一下,如xxx.swf 改成xxx.swg
故意讓他載不到東西
myListener.onLoadError = function(target_mc, errorCode) {
trace("####");
trace(target_mc+"載入有問題哦!");
trace("問題原因是:"+errorCode);
trace("####");
};
最後會應該會得到
####
_level0.testMc載入有問題哦!
問題原因是:URLNotFound
####
這就是用來偵測載入錯誤的狀況。
而errorCode會得到兩種結果:
1.URLNotFound
這種會發生在 MovieClipLoader.onLoadStart() 及 MovieClipLoader.onLoadComplete()都沒被呼叫的時候,
也就是這個url根本沒有東西可下
2.LoadNeverCompleted
這種會發生在MovieClipLoader.onLoadStart() 有被呼叫,但 MovieClipLoader.onLoadComplete()沒有被呼叫時,
我想就是網址是有東西的,但由於某種因素讓下載無法完成時吧
第一格as完成
以往當要載入swf時,且若被載入的swf?有as的話,常常會發生剛載完時,被載入的as無效的狀況
原因可能是檔案是載完了沒錯,但?面的as卻還沒執行到
現在有這個函式就一切ok了
myListener.onLoadInit = function(target_mc) {
trace("====");
trace(target_mc+"第一格action已執行完成");
trace("limitL:"+target_mc.limitL);
trace("====");
};
這函式是,當被載入的swf,且第一格as已執行完畢時才呼叫的
因為要有as才有用,所以我改成載入這個檔
my_mcl.loadClip
("guestbook.swf", "testMc2");
這個檔第一格有下
limitL=-20
再來在myListener.onLoadComplete = function(target_mc) {
?也加一行trace("limitL:"+target_mc.limitL);
比較結果就會發現
onLoadComplete會抓不到limitL,而onLoadInit抓得到
移除
my_mcl.unloadClip(target)//移除mc
my_mcl.removeListener()//移除監聽
就這樣吧,很簡單
無聊的小嘗試
是滿無聊的啦,不過也是mc loader 另一個好處
同一個mc loader ,可以同時下載多個mc
例如我一次下兩個
//載入
my_mcl.loadClip("temp/test.swf", testMc);
my_mcl.loadClip("guestbook.swf", testMc2);
之前的所有函式會各別被呼叫
各自會顯示各自的下載狀況,是滿方便的
沒有留言:
張貼留言