2009年03月11日
【心得】Flash loading的作法與實務
首先有一個重要概念是:第一個影格的所有物件要先被下載,然後才會開始執行影格中的程式碼和播放。也就是如果第一個影格放了很多物件,那麼使用者看到flash的空白期一樣會拖長,久久才會出現loading畫面,所以第一個影格儘可能放上單一的圖案,或簡單的向量圖形。另外,如果元件庫(Library)有設定連結(Linkage),也儘量不要勾選輸出在第1影格,否則的話也會造成第一影格大小的變化,自訂的類別當然也是儘量避免在第一影格宣告,然後可以在發佈選項(Publish Settings)裡的Flash標籤裡的設定(Settings),把輸出類別在第...影格改成2。
然後就是在第一個影格中加上程式碼,基本上就是先stop,等載入完畢後再繼續播放,第一種寫法是比較正規且一般的作法:
stop();
this.root.loaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
this.root.loaderInfo.addEventListener(Event.COMPLETE, completeHandler);
// 處理載入進度
function progressHandler (e:ProgressEvent):void {
var percent:Number = e.bytesLoaded / e.bytesTotal;
trace (percent);
// 以下二行是可能的顯示狀況
//mc_loading.gotoAndStop(Math.floor(percent * 100));
//txt_loading.text = String(Math.floor(percent * 100))+"%";
}
// 結束載入
function completeHandler (e:Event):void {
this.root.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
this.root.loaderInfo.removeEventListener(Event.COMPLETE, completeHandler);
play();
}
mc_loading是一個一百格的動畫,依照載入進度去播放,txt_loading則是一個文字欄位,實際的變化要看設計者的創意了。
但奇怪的是,第一種作法在瀏覽器Firefox將flash包在頁框內時(?),有些情況下會導致Event.COMPLETE無法引發,任憑使用者如何搔頭摸耳也不為所動,真正造成的原因還不清楚,這時可以用第二種作法,改用一定會觸發的Event.ENTER_FRAME事件來檢查載入狀況:
stop ();
addEventListener (Event.ENTER_FRAME, enterFrameHandler);
function enterFrameHandler (e):void {
var percent:Number = root.loaderInfo.bytesLoaded / root.loaderInfo.bytesTotal;
trace (percent);
//mc_loading.gotoAndStop(Math.floor(percent * 100));
//txt_loading.text = String(Math.floor(percent * 100))+"%";
if (percent >= 1) {
removeEventListener (Event.ENTER_FRAME, enterFrameHandler);
play();
}
}
完成後在Flash中按下ctrl + Enter測試影片,畫面出現後再按一次ctrl + Enter就可以模擬成慢速網路的狀態([檢視]-[下載設定]裡可以改變網路環境),確定載入畫面是否正常執行;按下[檢視]-[頻寬設定]則可以看每一個影格的載入狀況;若在Flash的發佈設定中勾選[產生檔案大小報表],每次測試影片後就會產生一個文字檔,可以得到更詳細的資訊,包括每個影格所要載入的位元組、每個元件和圖檔的輸出大小,以及靜態文字、嵌入字體所佔的空間,這些都可以幫助檔案減肥。養成壓縮圖片、音效,重覆利用元件、用向量圖來製作簡單的圖形、適當的swf分割載入…等好習慣,縮小檔案大小,才是減少使用者等待的治本之道。
引用URL
不太確定你的問題點...所以大致回答一下
如果你是要問介面設計 那得靠美工 恐怕我也幫不了
如果是想從資料庫讀取公告 可以找一下AMFPHP的相關教學
AMFPHP可以處理PHP和Flash之間的資料傳輸 還滿好用的
不好意思, 我想做一個正在跑步的loading,
已經在網路上找了許多教學,
但大部分都是顯示數字和跑長條的,
如果說我想做的loading是一個人在跑,
跑的長度會跟百分比的長度一樣,
等讀到100%之後,那個跑度的人就會做一些姿勢,然後再進入網頁畫面
不知道版大能不能給我一點指引方向...
我想把這個構想做出來>_
To shushu :
可以做一個MovieClip(影片片段)以下稱MC1,第一格先stop();然後裡面放一個反覆跑步的人物動畫MovieClip,在loading時移動MC1,以長條的起點、全長以及百分比換算出x座標,MC1的第2格後放人物其它姿勢的動畫,等100%時播放MC1到第2格,用setTimeout或Timer等方式,延遲到姿勢播放完畢後,主場景再play到下一格。有一個偷吃步的方式是:可能等到95%時就播放,不過缺點是難以控制精確的時間。
真是感謝你的回答,但沒想到這...這麼複雜...
先一步一步的問好了>_<
我還是不太懂setTimeout或Timer的意思,
剛查了字典只找到getTimer,好像是回傳檔案經過的秒數?...
關於等姿勢播放完再到下一格的設定方式可以再講清楚一點嗎?
剛學AS所以很多不懂,造成你的麻煩真是不好意思...

//↓程式碼 ------------------------
stop();
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
man_mc.gotoAndStop (1);
function enterFrameHandler(e):void {
var percent:Number = this.root.loaderInfo.bytesLoaded / this.root.loaderInfo.bytesTotal;
line_mc.scaleX = percent;
man_mc.x = line_mc.x + line_mc.width;
if (percent >= 1) {
removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
man_mc.gotoAndStop (2);
setTimeout (play_next, 1000); // 1000毫秒=1秒
}
}
function play_next ():void {
play ();
}
//↑程式碼 ------------------------
line_mc 是一個一條橫線的MovieClip
man_mc 是一個二格的MovieClip 第1格是跑的動作 第2格是其它姿勢
只能幫到這樣了, 再不行得先打好基礎囉
謝謝你特地把程式碼放上來,
我會用盡全身的力量把上面的程式碼搞懂的,
不過在這之前我想請教一下,
以上的程式碼是不是只能用Flash player9發布?
因為裡頭我有套Flash player6的程式...(頭痛XD)
等我把這個艱難的任務完成之後,
再來好好的感謝你的大恩大德!!

嗯..flash player 6 表示程式碼一定是AS1或2
所以要嘛找AS1/2版本的loading作法
要嘛就是把原本的程式改寫成AS3...
二者無法相容並存

請問Pretty Loaded
可以下載他們的範例媽??
謝謝
To shinyan:
原始檔沒辦法下載喔, 因為上傳者也只需傳swf檔
而且loader也不是用了什麼技術, 而是創意表現
所以網站上只有提供螢幕保護程式的下載
想下載各別檔案要用Firefox的Live HTTP header外掛之類的才能抓
不客氣~教學相長嘛~