2009年03月11日

【心得】Flash loading的作法與實務

  Loading在Flash裡十分常用,隨著檔案大小的增加,使用者等待的時間越久,loading畫面就更加馬虎不得,有些開發者會隨意塞個簡單的文字告知正在載入中,有些則經過精心設計,例如Pretty Loaded這個網站所收集的各式載入畫面,同樣是loading,後者顯然更能引人入勝。自己看輸出的swf檔總是很順暢,殊不知flash的一大考驗在於網路頻寬、延遲與效能,包括loading、載入其它flash、圖像、影音的處理,不能讓觀眾老是處於等待中,而且還能感覺到等待的價值,loading才能算成功。在AS3裡要做preload需要一些步驟:

  首先有一個重要概念是:第一個影格的所有物件要先被下載,然後才會開始執行影格中的程式碼和播放。也就是如果第一個影格放了很多物件,那麼使用者看到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分割載入…等好習慣,縮小檔案大小,才是減少使用者等待的治本之道。


Posted by esabear at 樂多Roodo! │12:08 │回應(14)引用(0)Flash筆記
樂多分類:網路/3C 共同主題:Flash筆記 工具:編輯本文
標籤:心得,flash
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/8474471
回應文章
我看到您的作品真的好棒>///<
冒昧的想請教您,^^
如何做flash公告欄呢?
找了很多教學,還是不懂ㄒ^ㄒ
冒昧打擾您,真的很抱歉>
Posted by at 2009年03月13日 23:08

不太確定你的問題點...所以大致回答一下
如果你是要問介面設計 那得靠美工 恐怕我也幫不了
如果是想從資料庫讀取公告 可以找一下AMFPHP的相關教學
AMFPHP可以處理PHP和Flash之間的資料傳輸 還滿好用的
Posted by 熊 at 2009年03月14日 21:52
謝謝您的回答>///<
喵貼了範例URL網址給您↓
(此迴響的連結網址在Posted by "喵"裡)
Posted by at 2009年03月14日 23:48

不好意思, 我想做一個正在跑步的loading,
已經在網路上找了許多教學,
但大部分都是顯示數字和跑長條的,
如果說我想做的loading是一個人在跑,
跑的長度會跟百分比的長度一樣,
等讀到100%之後,那個跑度的人就會做一些姿勢,然後再進入網頁畫面

不知道版大能不能給我一點指引方向...
我想把這個構想做出來>_
Posted by shushu at 2009年04月30日 08:37

To shushu :
可以做一個MovieClip(影片片段)以下稱MC1,第一格先stop();然後裡面放一個反覆跑步的人物動畫MovieClip,在loading時移動MC1,以長條的起點、全長以及百分比換算出x座標,MC1的第2格後放人物其它姿勢的動畫,等100%時播放MC1到第2格,用setTimeout或Timer等方式,延遲到姿勢播放完畢後,主場景再play到下一格。有一個偷吃步的方式是:可能等到95%時就播放,不過缺點是難以控制精確的時間。
Posted by 熊 at 2009年05月1日 00:48

真是感謝你的回答,但沒想到這...這麼複雜...
先一步一步的問好了>_<
我還是不太懂setTimeout或Timer的意思,
剛查了字典只找到getTimer,好像是回傳檔案經過的秒數?...
關於等姿勢播放完再到下一格的設定方式可以再講清楚一點嗎?
剛學AS所以很多不懂,造成你的麻煩真是不好意思...
Posted by shushu at 2009年05月3日 23:17

//↓程式碼 ------------------------
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格是其它姿勢
只能幫到這樣了, 再不行得先打好基礎囉
Posted by 熊 at 2009年05月4日 20:15

謝謝你特地把程式碼放上來,
我會用盡全身的力量把上面的程式碼搞懂的,
不過在這之前我想請教一下,
以上的程式碼是不是只能用Flash player9發布?
因為裡頭我有套Flash player6的程式...(頭痛XD)

等我把這個艱難的任務完成之後,
再來好好的感謝你的大恩大德!!
Posted by shushu at 2009年05月5日 11:34

嗯..flash player 6 表示程式碼一定是AS1或2
所以要嘛找AS1/2版本的loading作法
要嘛就是把原本的程式改寫成AS3...
二者無法相容並存
Posted by 熊 at 2009年05月5日 20:09

請問Pretty Loaded
可以下載他們的範例媽??
謝謝
Posted by shinyan at 2009年05月17日 17:38

To shinyan:
原始檔沒辦法下載喔, 因為上傳者也只需傳swf檔
而且loader也不是用了什麼技術, 而是創意表現
所以網站上只有提供螢幕保護程式的下載
想下載各別檔案要用Firefox的Live HTTP header外掛之類的才能抓
Posted by 熊 at 2009年05月18日 00:42
寫得很好耶!!
這blog內容好豐富
作者超強的

謝謝分享,順便也解決了我遇到的問題

感謝感謝~:p
Posted by pshe at 2009年06月9日 09:35

不客氣~教學相長嘛~
Posted by 熊 at 2009年06月13日 15:07
原來如此~難怪會ff上會停掉~> <
換了enterframe的寫法後正常了~
Posted by at 2009年06月17日 11:37