WEB开发网      濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堝姛缂佺娀绠栭弻宥堫檨闁告挻姘ㄩ幑銏犫槈濞嗘劕顎撻梺鍛婂姇瀵爼骞栭幇顔炬/闁告挆鍕畬闂佸疇顫夐崹鍧楀箖閳哄啠鍋撻崷顓炐㈡い銉︾箞濮婂搫效閸パ€鍋撳Δ鍛;闁规崘顕ф闂佸憡娲﹂崹鎵不濞戙垺鐓曟い鎰剁稻缁€鍐┿亜鎼达紕效婵﹨娅g划娆忊枎閹冨闂備礁鎽滄慨鐢稿礉濞嗘劒绻嗛柣銏⑶圭粈瀣亜閺嶃劏澹橀柛鐐姂濮婃椽妫冨ù銈嗙⊕閹峰懘骞撻幒宥咁棜闂備礁婀遍崕銈夈€冮崱娑樼厱闁圭儤顨嗛悡鏇㈡煛閸ャ儱濡煎ù婊勭矋閵囧嫯绠涢敐鍛睄闂佸搫澶囬埀顒€纾弳鍡涙倵閿濆骸澧伴柡鍡欏█閺屟勫濞嗘垵鍩岄梺闈涙鐢帡锝炲┑瀣亗閹艰揪绲奸悽鑽ょ磽娴h娈曢柛銊ョ仢椤繒绱掑Ο璇差€撶紓浣圭☉椤戝懎鈻撻鐐╂斀妞ゆ梹鏋婚崗顒傜磼閻樿櫕宕岄柕鍡曠椤繈骞囨担鍏夋瀸濠电姷鏁告慨顓㈠磻閹捐秮褰掓晲閸モ斂鈧﹪鏌¢埀顒佺鐎n偆鍘藉┑鈽嗗灡椤戞瑩宕电€n兘鍋撶憴鍕仩闁稿氦绮鹃悘鍐⒑缂佹◤顏勵嚕閸洖鐤柣鎰暩绾惧ジ鏌涚仦鐐殤閺佸牓鎮楃憴鍕缂侇喖绻樿棟閻庨潧鎽滃Λ顖炴煙椤栧棔绀佹禒顕€鎮楀▓鍨灈闁绘牜鍘ч悾鐑芥偂鎼存ɑ顫嶅┑鈽嗗灟鐠€锕傛倵瀹曞洨纾介柛灞剧懅閸斿秵銇勯妸銉︻棞闁伙絾绻堥獮鏍ㄦ媴濮濆本鎲伴梻浣虹帛濡啴藟閹捐姹查悗锝庡枟閻撶喐淇婇妶鍌氫壕闂佺粯顨呭Λ妤呭煝閹炬緞鏃堝川椤旇瀚奸梺鑽ゅТ濞茬娀鍩€椤掑啯鐝柣蹇婂亾闂傚倷绀侀幖顐﹀箠閹邦厽鍙忛柟缁㈠枟閸嬧晠鏌i妶搴$仜濞存粌缍婇弻鐔兼倻濡偐鐣洪梺鍝勬噺缁诲牆顫忓ú顏咁棃婵炴垶鑹鹃。鍝勨攽閳藉棗浜濋柣鐔叉櫊閵嗕礁鈻庨幒鏃傛澑闂佸搫鍟崐濠氭儊閸儲鈷戞慨鐟版搐閻忓弶绻涙担鍐插椤╃兘鏌ㄩ弴鐐测偓褰掓偂閺囥垺鐓忓┑鐐茬仢閸斻倝鏌涢埡瀣ɑ妞ゃ劊鍎甸幃娆撳级閹存繍娼氭俊銈囧Х閸嬬偤鏁冮姀銈冣偓浣糕枎閹炬潙娈愰梺鍐叉惈椤戝洭鐛姀銈嗏拻闁稿本鐟︾粊鐗堛亜椤愩埄妲搁柣锝呭槻铻i柤娴嬫櫇閻撳顪冮妶鍡橆梿闁跨喆鍎茬粋宥堛亹閹烘挾鍘甸梺缁樺灦钃遍悘蹇e幖闇夋繝濠傚暟缁夌儤鎱ㄦ繝鍛仩缂佽鲸甯掕灒闁惧繘鈧稒顢橀梻鍌欑劍鐎笛兠哄澶婄柧婵炴垶绮庢禍閬嶆⒒娴e憡鍟炴繛璇х畵瀹曞綊鏌嗗鍛幈闂佺鎻梽鍕偂濞嗘挻鐓犳繛鏉戭儐濞呭懎霉閻樺磭鐭婇柍瑙勫灴閸ㄩ箖鎮欓挊澶夊垝闂備浇顕栭崰妤呫€冮崨鏉戠叀濠㈣埖鍔曠粻鎶芥煙閹屽殶鐟滄澘娲ㄧ槐鎾诲磼濞嗘垼绐楅梺鍝ュУ閻楃娀銆侀弽顓炲窛闁圭⒈鍘介弲锝夋⒑缁嬭法绠抽柛妯犲懏顐介柣鎰節缁诲棙銇勯弽銊х煂閻㈩垱绋掔换娑㈠川椤撶喎鏋犲┑顔硷功缁垶骞忛崨瀛樺仭闂侇叏绠戝▓婵堢磽閸屾瑦绁版い鏇嗗洤纾归柛顭戝櫘閸ゆ洜绱撴担璐細缂佲檧鍋撻梻浣规偠閸庮垶宕濆鍛瀺闁搞儺鍓氶埛鎴犵磼鐎n偄顕滄繝鈧幍顔剧<閻庯綆鍋呭畷宀€鈧娲忛崹浠嬪箖娴犲宸濆┑鐘插楠炴姊洪悷鏉挎倯闁伙綆浜畷瑙勭節濮橆剛鍘愰梺鍝勬储閸ㄦ椽鎮¢妷锔藉弿婵☆垰鐏濋悡鎰版煟閹捐泛鏋涢柣鎿冨亰瀹曞爼濡烽妷銉バ戠紓鍌欑椤戝牆鐣烽悽鍨潟闁圭儤姊荤壕鍏间繆椤栨繂浜归柣锝堟缁辨挻鎷呴搹鐟扮缂備浇顕ч悧鍡涙偩瀹勯偊娼ㄩ柍褜鍓氭穱濠傤潰瀹€濠冃ㄧ紓鍌欐祰妞村摜鎹㈤崼婵愭綎缂備焦蓱婵绱掑☉姗嗗剰婵炲牊鍔欏娲箹閻愭彃顬嗛梺鍛婎殔閸熷潡鎮鹃悜绛嬫晬闁绘劘灏欐鍥⒑閻熼偊鍤熷┑顕€娼ч埢鎾淬偅閸愨斁鎷虹紓鍌欑劍钃遍柍閿嬪浮閺屽秴鐣¢幍顔尖叺閻庢鍣崑濠傜暦閹烘鍊烽悗鐢登归獮鍫ユ⒒娴g懓鈻曢柡渚囧櫍瀹曟垿骞樼紒妯煎幐闂佸憡渚楅崰姘跺箠閸涱喕绻嗛柛娆忣槸婵洭鎽堕敐澶嬪仩婵炴垶甯掓晶鏌ユ煛閸屾浜鹃梻鍌氬€烽懗鍓佸垝椤栫偛绀夐柡鍥╁€i悢鍝ョ瘈闁搞儜鍐╁劒闂備胶绮弻銊╂儍濠靛缁╅柤鎭掑劘娴滄粓鏌¢崘銊﹀妞ゃ儱顦甸弻娑㈠棘鐠囨祴鍋撳┑瀣闁割偅娲橀崐鐑芥煟閹寸偍缂氶柛姗€浜跺娲传閸曨剙鍋嶉梺鍛婃煥閺堫剟寮查崼鏇ㄦ晬闁绘劕顕崢鍗炩攽閻愬弶顥滅紒缁樺笧缁粯绻濆顓犲幐闁诲繒鍋熼弲顐f櫏闁诲氦顫夊ú锕傚磻婵犲倻鏆﹂柣鏃傗拡閺佸棝鏌嶈閸撴瑩鍩㈠澶嬫櫜闁搞儮鏅濋敍婵囩箾鏉堝墽绋荤憸鏉垮暞缁傚秹鎮欓鍌滅槇闂侀潧楠忕徊鍓ф兜閻愵兙浜滈柟瀛樼箖瀹告繄绱掗鍓у笡闁靛牞缍佸畷姗€鍩¢崘銊ョ闂備浇顕х€涒晝绮欓幒鎴犲箵閻犳亽鍔庢稉宥嗘叏濡炶浜鹃梺鍝勮閸斿矂鍩ユ径濞㈢喐寰勯惂鍝ョɑ闁靛洤瀚版俊鎼佹晲閸涱厼袝闂備浇顕栭崰妤呮偡閳哄懌鈧線寮崼婵堫槹濡炪倖鎸荤换鍕矆閸曨垱鈷掗柛灞剧懄缁佺増銇勯弴鐔哄⒌鐎规洑鍗冲浠嬵敃閵堝浂妲稿┑鐘垫暩婵挳宕愭繝姘辈闁挎洖鍊归悡娆愩亜閺嶎偄浠滃ù婊呭娣囧﹪鎳犳0婵嗘闂佸疇顫夐崹鍧楀春閸曨垰绀冮柕濞у懌鍋″┑锛勫亼閸娿倝宕㈡ィ鍐ㄧ婵☆垯璀﹂崵鏇㈡偣閸ャ劎銈存俊鎻掔墦閺屾洝绠涢弴鐑嗘綌闂佸啿鎼幊蹇涙偂韫囨搩鐔嗛悹楦挎婢ф洟鏌涢弮鈧幐鎶藉蓟濞戙垹妫樻繛鍡欏亾妤旂紓鍌欐祰妞存悂骞愭繝姘闁告侗鍨抽惌娆撳箹鐎涙ɑ灏ù婊堢畺閺屾稑鈹戦崟顐㈠Б闂佹椿鍘介幐楣冨箟閹间焦鍋嬮柛顐g箘閻熴劑姊洪崫鍕靛剮缂佽埖宀稿濠氭偄閻撳海顦悷婊冪箳閺侇喖鈽夐姀锛勫幐闂佸憡渚楅崰妤呭磹閹扮増鐓涢悘鐐额嚙婵倿鏌熼鍝勨偓婵嗙暦閹烘垟妲堟慨妤€妫旂槐锟� ---闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛濠傛健閺屻劑寮崼鐔告闂佺ǹ顑嗛幐鍓у垝椤撶偐妲堟俊顖氭惈缁犺鈹戦悙鍙夆枙濞存粍绮撻幃鈥斥槈閵忥紕鍘卞┑鐐村灥瀹曨剟鐛Ο姹囦簻闁哄倹瀵чˉ銏℃叏婵犲懏顏犻柟鐟板婵℃悂濡烽敂鎯х稈闂傚倷鑳堕幊鎾诲吹閺嶎厼绠柨鐕傛嫹
开发学院图形图像Flash Flash片头loading与MovieClipLoader 阅读

Flash片头loading与MovieClipLoader

 2007-10-11 19:17:10 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亜顒㈡い鎰Г閹便劌顫滈崱妤€骞婄紓鍌氬€瑰銊╁箟缁嬫鍚嬮柛顐線缂冩洟姊婚崒娆戭槮婵犫偓闁秵鎯為幖娣妼缁愭鏌″搴′簽濞戞挸绉甸妵鍕冀椤愵澀娌梺缁樻尪閸庣敻寮婚敐澶婂嵆闁绘劖绁撮崑鎾诲捶椤撴稑浜炬慨妯煎亾鐎氾拷闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑娑⑺囬悽绋挎瀬闁瑰墽绮崑鎰版煙缂佹ê绗ч柍褜鍓﹂崣鍐潖閸濆嫅褔宕惰娴犲ジ姊虹拠鑼闁煎綊绠栭幃楣冩倻閽樺鎽曢梺闈涱檧婵″洭宕㈤悽鍛娾拺閻熸瑥瀚烽崯蹇涙煕閻樺磭澧甸柕鍡楀€圭缓浠嬪川婵犲嫬骞堥梺纭呭閹活亞妲愰弴鐔哄ⅰ闂傚倷绶氬ḿ褍煤閵堝洠鍋撳顐㈠祮闁绘侗鍣i獮鎺懳旈埀顒傜不閿濆棛绡€闂傚牊绋戦弳娆徝瑰⿰鍫㈢暫闁哄矉缍佹慨鈧柍鎯版硾濠€杈ㄧ珶閺囩喓绡€婵﹩鍘鹃崢鐢告⒑缂佹ê濮﹂柛鎾村哺閹ɑ娼忛妸銈囩畾闂佸湱绮敮鐐存櫠濞戞氨纾肩紓浣贯缚濞插鈧娲栧畷顒冪亙闂佸憡鍔曢崯鐘诲礈濠靛牊宕叉繛鎴炨缚閺嗗棗鈹戦悩杈厡闁轰焦鐗滅槐鎾存媴娴犲鎽甸梺鍦嚀濞层倝鎮鹃悜钘夌闁规惌鍘介崓鐢告⒑閻熸澘鎮侀柣鎺炵畵閹骞栨担鍏夋嫽婵炶揪绲块崕銈夊吹閳ь剟姊洪幖鐐测偓鏍偋閻樿崵宓侀煫鍥ㄧ⊕閺呮悂鏌ㄩ悤鍌涘濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻戦妵鍕箻閸楃偟浠肩紓浣哄閸ㄥ爼寮诲☉銏犵疀闂傚牊绋掗悘鍫ユ倵閻熺増鍟炵紒璇插暣婵$敻宕熼姘鳖啋闁诲酣娼ч幗婊堟偩婵傚憡鈷戠痪顓炴媼濞兼劖绻涢懠顒€鏋庢い顐㈢箳缁辨帒螣閼测晜鍤岄梻渚€鈧偛鑻晶顔肩暆閿濆牆鍔垫い锔界叀閹繝濡舵径瀣帾闂佸壊鍋呯换鍐磻椤忓懐绠剧€瑰壊鍠曠花濠氬箚閻斿吋鈷戦悗鍦У閵嗗啴鏌ら崘鑼煟鐎规洘绻堥弫鍐焵椤掑嫧鈧棃宕橀鍢壯囨煕閳╁喚娈橀柣鐔稿姍濮婃椽鎮℃惔鈩冩瘣闂佺粯鐗曢妶绋跨暦閻戞ḿ绡€闁搞儜鍐ㄧギ闂備線娼ф蹇曟閺囥垹鍌ㄦい蹇撶墛閳锋垿鏌熼懖鈺佷粶闁告梹顨婇弻锟犲川椤旈敮濮囩紓浣稿€圭敮鐔妓囩€靛摜纾奸弶鍫涘妼缁楁碍绻涢悡搴g闁糕斁鍓濋幏鍛存煥鐎e灚缍楅梻鍌氬€峰ù鍥ь浖閵娾晜鍊块柨鏇炲€哥粻鏌ユ煕閵夘喖澧柡瀣╃窔閺岀喖宕滆鐢盯鏌¢崨顔藉€愰柡灞诲姂閹倝宕掑☉姗嗕紦闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亜顒㈡い鎰Г閹便劌顫滈崱妤€骞婄紓鍌氬€瑰銊╁箟缁嬫鍚嬮柛顐線缂冩洟姊婚崒娆戭槮婵犫偓闁秵鎯為幖娣妼缁愭鏌″搴′簽濞戞挸绉甸妵鍕冀椤愵澀娌梺缁樻尪閸庣敻寮婚敐澶婂嵆闁绘劖绁撮崑鎾诲捶椤撴稑浜炬慨妯煎亾鐎氾拷  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛銈呭閺屻倝宕妷锔芥瘎婵炲濮靛銊ф閹捐纾兼繛鍡樺笒閸橈紕绱撴笟鍥ф珮闁搞劌鐖兼俊鎾礃椤旂厧绐涢梺鍝勵槹閸ㄥ綊宕㈠ú顏呭€垫鐐茬仢閸旀碍銇勯敂璇茬仸鐎规洩绻濋獮搴ㄦ嚍閵壯冨妇闂傚⿴鍋勫ú锕€煤閺嶃劎澧¢梻鍌欐祰椤曆呪偓鍨浮瀹曟粓鎮㈡總澶嬬稁闂佹儳绻愬﹢杈╁閸忛棿绻嗘い鏍ㄧ閹牊銇勯銏㈢劯婵﹥妞藉畷鐑筋敇濞戞瑥鐝遍梻浣呵归鍛涘┑瀣畾闁逞屽墯閵囧嫯绠涢幘瀵搞偐濠碘槅鍨扮€氭澘顫忓ú顏勪紶闁告洦鍓氶幏鍗炩攽閻愭彃绾у畝锝呮健楠炴垿濮€閻橆偅鏂€婵犵數濮寸€氼噣寮堕幖浣光拺闁告繂瀚婵嗏攽椤旀儳鍘撮柟顔诲嵆婵$兘鍩¢崒妤佸濠电偠鎻徊浠嬪箹椤愩倖鏆滈悹杞拌閻斿棝鏌i悢宄扮盎闁衡偓閼姐倗纾奸柛灞炬皑瀛濆Δ妤婁簷閸楀啿鐣烽悡搴僵闁挎繂鎳嶆竟鏇㈡⒑閸濆嫬鏆欓柣妤€妫涚划鍫ュ礃閳瑰じ绨婚棅顐㈡搐濞寸兘藝閿曗偓闇夋繝濠傜墢閻f椽鏌$仦璇插闁宠鍨垮畷鍗炩槈閹典礁浜炬俊銈傚亾妞ゎ叀鍎婚¨渚€鏌涢悩宕囧⒌婵犫偓娓氣偓濮婅櫣绱掑Ο鏇熷灴閹兘濡疯閸嬫挸顫濋悡搴㈢亾缂備緡鍠氱划顖炲Χ閿濆绀冮柍鍝勫暙楠炲牊淇婇悙顏勨偓鏍礉閹达箑纾归柡鍥ュ灩閸戠娀骞栧ǎ顒€濡介柣鎾跺枛閻擃偊宕惰閸庡繘鏌涢弮鈧划鎾诲蓟閺囥垹鐐婄憸宥夘敂椤撶姭鍋撳▓鍨灍婵炲吋鐟ㄩ悘鎺楁⒑閸涘﹦绠撻悗姘煎墲椤ゅ倹绻濈喊澶岀?闁稿鍨垮畷鎰板箣閿曗偓閸ㄥ倹绻涘顔荤凹闁稿绻濋弻宥夊传閸曨剙娅g紓浣哄У閻楃娀寮诲澶婄厸濞达絽鎲″▓鏌ユ⒑缁嬫寧鎹i柛鐘崇墵瀵寮撮姀鐘靛€為悷婊冪Ф閼鸿鲸绻濆顓犲幍闂佸憡鍨崐鏍偓姘炬嫹
核心提示:很早之前我曾经说过“没有loading的Flash,不是完整的flash”,Flash片头loading与MovieClipLoader,我想那个句话可能偏激了,因为有时候一些不到10k的flash,我们再也不用为了loading而去制作麻烦的循环了,MovieClipLoader帮我们完成了所有工作!附:完整代码如下

很早之前我曾经说过“没有loading的Flash,不是完整的flash”。我想那个句话可能偏激了。因为有时候一些不到10k的flash,确实不需要做什么loading。但我始终认为,做一个优秀的loading是衡量一个flasher水准、甚至态度的,因为loading是唯一一个你不会多看而所有用户、客户会看的东西,所以你对loading的重视程度,甚至可以反衬你这个flasher的职业道德。
  转载请保留原文地址:http://www.awflasher.com/blog/?id=444

Flash的loading的技术讨论共分为三部分:

1、基础
  2、MovieClipLoader相关讨论(较深入)
  3、V2组件相关问题

前面我们介绍了基础部分,今天我们对MovieClipLoader做Flash loading做一些深入的相关讨论。

读取外埠数据参与Flash应用程序部署是一件非常重要和常见的工作,尤其是我们常常需要检测这些数据加载的进度。MovieClipLoader(下称MCL)类就可以帮我们大大简化这项麻烦工作。此外,它使得我们能获取更多的需要,并减少代码量。我们可以用一个单独的MovieClip类来载入一个,或者多个外埠资源到指定的MC或者层级,或者我们可以为每一个加载工作制定不同的MCL实例。

我决定分两部分来完成这篇教程。首先,我们将介绍MCL的基本用法;然后我们将介绍如何使用一个单独的MCL实例来读取外埠资源到不同的MC,并且,我们将加入侦听器对象来参与工作。当然,不通过侦听器也可以完成任务,我们暂时不介绍侦听器,因为这样你会更加容易理解MCL。

那么,我们首先来大体了解一下MCL有哪些回调函数,后面也会有详细介绍(aw附:回调函数我个人理解就是某一个类组、参数事先确定,拥有指定功效的方法)这里可以了解一下什么叫做回调函数):

MovieClipLoader对象的回调函数:

事件回调函数(严格要求数据类型的时候,它们并不是方法,后祥):
* MovieClipLoader.onLoadStart() - 当加载开始的时候触发
* MovieClipLoader.onLoadPRogress() - 在读取进行中触发
* MovieClipLoader.onLoadInit() - 读取资源载入后的第一帧执行完成后触发
* MovieClipLoader.onLoadComplete() - 当读取的外埠资源已经完全下载到本地时触发。
* MovieClipLoader.onLoadError() - 当加载外埠资源出错时触发。
* MovieClipLoader.unloadClip() - 将加载的外埠资源移除或终止一个加载工作。

方法回调函数:

* MovieClipLoader.getProgress(target:Object):Object - 读取外埠资源的进展,参数为MC对象(aw附:其实MC这种数据类型也就是一种对象)。返回一个对象,该对象包含两种事先预定好的属性(后祥)

要想好好理解这些回调函数,我们动手试验一下是最好的方法。当然MCL是Flash7之后才有的,所以别忘了发布的时候发布成为7+的版本号。如果直接用FlashPlayer来调试可能会遇到一些问题,我们推荐在浏览器中进行调试(个人意见:对于外埠资源难以获得情况,比如教育网获取公网资源,最好不要在IDE中调试)

在我们的例子中,我们将用一个MCL对象来读取不同的图片,并将它们置入不同的空MC中。本例中要用到的swf文件和图像源文件将在Actionscript.org找到(个人建议:其实看完这篇文章要不要源文件没有必要了)

1、建立一个新的Flash文档,并在第1帧输入以下脚本:
   _root.traceBox.vScrollPolicy ="on";
function myTrace(msg)
{
 _root.traceBox.text += msg + newline;
 _root.traceBox.vPosition = _root.traceBox.maxVPosition;
}


  我们这里是在建立一种跟踪调试机制,调试的(变量)将输出到文本框组件中。这里的方法"myTrace"是预先定义好的一个函数,它帮助我们顺利完成对某些信息的监控;其中第二句的作用是使文本框随时输出最新监控值。

2、现在从组建库托拽一个TextArea组件进入场景,并给以合适的大小,以及一个实例名称traceBox(对应上面的脚本)

3、接下来,我们要建立一个新的MC元件。并在场景上部署3个实例,为它们分别命名为myMC1,myMC2,myMC3。我们将把图片或者swf影片装载进入它们,并且,在它们下载到本地后按照需求调整它们的尺寸。其实,对图片人为地改变尺寸会造成许多不好的后果,比如锯齿的产生,但是为了让大家了解onLoadInit事件的使用,我们将会这么做。

4、然后,我们建立一个MCL对象,在第一帧输入以下脚本:
   var myMCL = new MovieClipLoader();//create an instance of MovieClipLoader


  aw附:这里我想罗索以下,关于Object的翻译。因为上述代码的注释中,老外用的是instance这个词,直译的话,Object是“对象”;Instance代表“实例”。前者更注重于其数据类型,而后者则更注重于其客观存在性。

5. 现在我们就可以部署脚本了,在第一帧:

myMCL.onLoadStart = function (targetMC)
{
 var loadProgress = myMCL.getProgress(targetMC);
 myTrace ("The movieclip " + targetMC + " has started loading");
 myTrace("Bytes loaded at start=" + loadProgress.bytesLoaded);
 myTrace("Total bytes loaded at start=" + loadProgress.bytesTotal);
}


  这个函数的第一行中申明了一个(对象类型的)变量,显然,这个变量的值由myMCL对象的getProgress方法获得.刚才已经介绍了getProgress方法,这里可以看到,返回的loadProgress.bytesLoaded就是loadProgress对象的bytesLoaded属性.
  这里我再啰嗦一句:为什么返回一个对象,而不返回具体的值。这是有原因的。函数返回值的功能使得程序设计更加完美,然而很多情况下,我们要返回的并非一个值,我们可能返回两个或者更多的值,甚至它们的数据类型都不相同。这样,只有通过对象的形式来返回了。这是解决问题最简单最高效的方法。下面三句myTrace就呼应了之前我们定义的监控函数,这样就能看到我们关注的变量了。

6、我们已经为onLoadStart事件部署了相应的工作,接下来我们要为上述其他事件部署工作了。紧接着是onLoadProgress,它接受三个参数:targetMC, loadedBytes, totalBytes。分别代表目标容器MC实例;已经读取的体积、总体积。

myMCL.onLoadProgress = function (targetMC, loadedBytes, totalBytes) {
 myTrace ("movie clip: " + targetMC);
 myTrace("Bytes loaded at progress callback=" + loadedBytes);
 myTrace("Bytes total at progress callback=" + totalBytes);
}


  7、我们的onLoadComplete方法仅接受一个参数,它就是容器MC实例。像onLoadStart一样,我们用getProgress方法来返回读取情况。

myMCL.onLoadComplete = function (targetMC)
{
 var loadProgress = myMCL.getProgress(targetMC);
 myTrace (targetMC + " has finished loading.");
 myTrace("Bytes loaded at end=" + loadProgress.bytesLoaded);
 myTrace("Bytes total at end=" + loadProgress.bytesTotal);
}


  8、onLoadInit方法将在所有加载的内容被下载到本地容器MC中之后才开始执行。这将使得你能更好的控制加载进来的内容的属性。我选择的图片非常大,这样我们可以把读取过程看得更加清晰,而我也要对已经加载的图片尺寸进行修整,让它能全部显示出来。

myMCL.onLoadInit = function (targetMC)
{
 myTrace ("Movie clip:" + targetMC + " is now initialized");
 targetMC._width = 170;
 targetMC._height = 170;
}


  9、还有一个回调方法onLoadError。如果有错误发生,它将会被触发。作为一个优秀的程序员,部署完善的应用程序的时候,对错误发生的避免措施是必不可少的!

myMCL.onLoadError = function (targetMC, errorCode)
{
 myTrace ("ERRORCODE:" + errorCode);
 myTrace (targetMC + "Failed to load its content");
}


  10、我们终于将最复杂的工作部署好了。接下来我们只用使用loadClip方法读入我们需要的内容就行了。loadClip方法的两个参数分别是外埠资源的地址和容器MC的实例。


  myMCL.loadClip("http://www.yourdomain.com/test1.swf","_root.myMC1");
myMCL.loadClip("http://www.yourdomain.com/test2.swf ", "_root.myMC2");
myMCL.loadClip("http://www.yourdomain.com/pic.jpg", "_level0.myMC3");


 

路径可以选择相对路径。注意,路径的相对性也是一个大问题,当SWF在非本路径的HTML中被引用的时候,遵从HTML所在的路径!这一点是很多Flash教程都忽视的。所以,有时候绝对路径也有绝对路径的好处。

所有的调试工作最好在浏览器中,而非IDE中完成。而且脚本输出方式必须是AS2。

接下来,我将介绍实时调用MCL的情况。为了能适应更多的应用,我们经常动态地为MCL制定工作。

aw话外音:有时候,我们这样写:

1、var mcl:MovieClipLoader = new MovieClipLoader ();
  2、var mcl = new MovieClipLoader ();

发现第一种写法无法为MCL制定onLoadStart等事件方法。这是编译器根据指定变量的数据类型产生的问题。osflash的一些朋友给了一些有用的观点,我也发现这个问题正好涉及到Flash内部的事件响应机制,不妨介绍一下:

Flash的三种事件响应机制

1、简单的回调函数,最老的;
  2、侦听器,ASBroadcaster,FlashMX时代;
  3、事件侦听器,EventDispather,FlashMX2004时代

这里,MCL用的是第二种机制,而整套V2组件则使用最后一套机制。

附:MCL官方申明,注意:上述方法中,仅包含getProgress方法!


  intrinsic class MovieClipLoader
{
  function MovieClipLoader();

  function addListener(listener:Object):Boolean;
  function getProgress(target:Object):Object;
  function loadClip(url:String, target:Object):Boolean;
  function removeListener(listener:Object):Boolean;
  function unloadClip(target:Object):Boolean;
}


 
 

个人补充:1、2在不严格要求数据类型的时候可以通用。

下面开始介绍用侦听器来检测MCL事件的方法。在此之前,我们解决一个最常见的问题,我们经常会在论坛中看到有人这样提问:

引用:我动态地建立了一些MC,并逐个分配给它们一个事件句柄(标志)。然后,我将外埠资源读取到它们之中。但是这些分配好的事件句柄都不工作了!
紧接着,发问人一般会贴出一对乱七八糟的代码,并大呼救命。

那么,我们首先来分析一下这个错误发生的原因:当外埠资源被载入到一个MC中时,这个MC将会重新初始化。这意味着任何被预先制定好的代码都将付之东流。对于开发人员已经手动在舞台上安排好的MC则并没有相关的麻烦,这是因为任何直接通过onClipEvent制定到MC的代码都能幸免被重新初始化。而动态建立的MC则进行上述的“初始化”,因为我们是在运行中给它们配置的事件代码。
  我们如何避免这个问题呢?其实方法太多了,很多论坛也进行了极为详细的讨论,我就不多赘述了。
  你现在也许还记得刚才我介绍的“读取外埠数据参与Flash应用程序部署是一件非常重要和常见的工作,尤其是我们常常需要检测这些数据加载的进度”

我们已经介绍了MCL的几个回调函数,所以这里也不再赘述了。我们现在制作这样一个效果:缩略图标式的图片浏览系统。我们将要从外部读取一些JPG图片,将它们放入我们动态部署的MC中。并且我们希望这些动态建立的MC都具有各自的onPress事件。我们通过在MC装载好外部资源之后再为之分配事件。

在我们开始之前,我还想提醒大家注意一些经常出现的疏漏:一定要在发布的时候设置成Flash7+AS2以上的版本;其次,用浏览器测试你的效果,而不是IDE;否则你将会得到奇怪的结果。

现在,我们开始编制代码,你会发现它比你想象的要简单得多。

1、新建一个Flash文档。
  2、找四张100*100像素的缩略图片。
  3、建立一个动态文本框,大概在300*300像素左右,使用12号字体,并使之现实边框,这样我们更好监测。别忘了设置它为多行的。
  4、建立一个100X100像素的矩形,转变为MC,然后将它移出场景。这时候,他已经出现在库中了。在库中,设置他的链接名为“img”,并使其“在第一帧导出”。其实这个矩形会在外部资源载入的时候被取代,现在只是为了调试方便。
  5、在刚才放置textBox文本框的层之上新建一层,这一层用于放置我们的代码,先写上:
   stop();


  6、现在我们定义一个MCL的实例,此外定义一个基本对象,作为我们的侦听器:
   myMCL = new MovieClipLoader(); //define MovieClipLoader
myListener = new Object(); //define listener


  7、接下来我们用侦听器来侦听onLoadComplete事件,该事件的作用上文已经提到了。我们现在把它交给listener对象,而不是MCL实例。当然,最终要把侦听器对象再交回MCL(以侦听其回调函数)的时候,得到的效果就是我们需要的效果了。

记住,只有当读取完毕的时候,对MC部署事件任务才是安全可靠的!所以,在onLoadComplete被触发的时候才部署这个onPress事件给MC:

myListener.onLoadComplete = function(targetMC){
 debug.text += "LOADING OF " + targetMC
 + " COMPLETE" + newline;
 targetMC.onPress = function() {
 debug.text += newline
 + "targetMC = " + targetMC._name;
 }
}


  注:上述代码中有几行被人为打断,但这并不影响效果。

你也许已经注意到了,MC的实例名称在onLoadComplete被触发的时候是作为一个参数的身份传递给onLoadComplete的,这样我们控制这个MC就非常方便了。比如这里就可以用点击MC来检测事件是否被成功部署给MC。

8、现在我们建立一个函数,它包含一个简单的循环来部署场景上的MC。并且及时地为每一个部署好的MC分配读取外埠资源的任务(loadClip方法),代码如下:

function initClips(){
 for (i=1; i<=4; i++){
 this.attachMovie("img", "img" + i, i);
 this["img"+i]._x = i*110;
 myMCL.loadClip("0" + i + ".jpg" ,
 this["img"+i]); //code wrapped
 }
}


  9、到这里基本上就完成了。现在我们剩下的工作就是注册侦听器并且按照需求调用相关函数、方法,反映到代码上就是以下两行:

myMCL.addListener(myListener);
initClips();


  注意这里的顺序,我们的侦听器对象在调用initClip()函数之前就被作用于MCL实例了。现在我们的MC的onPress事件可以顺利工作了,因为当图片被完全读入之后,事件才被分配过去。我们的代码也非常简洁。我们再也不用为了loading而去制作麻烦的循环了,MovieClipLoader帮我们完成了所有工作!

附:完整代码如下:


  stop();
myMCL = new MovieClipLoader();
myListener = new Object();
myListener.onLoadComplete = function(targetMC)
{
  targetMC.onPress = function ()
  {
   trace("pressed");
  }
}

function initClips()
{
  for (i=1;i<=4;i++)
  {
   this.attachMovie("img","img"+i,i);
   this["img"+i]._x = i*110;
   myMCL.loadClip(url,this["img"+i]);
  }
}
myMCL.addListener(myListener);
initClips();


  到此为止,你应该相信MCL确实是一个不可多得的好东西了吧?

下一节我们讨论用V2组件项目做Flash loading的问题。

Tags:Flash 片头 loading

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接