一、加載庫(kù)中聲音 導(dǎo)入聲音到庫(kù)---右鍵---鏈接---勾選“為ActionScript導(dǎo)出”---類(即名稱):cyzy 點(diǎn)選第一幀,打開動(dòng)作面板,寫代碼: var sy:cyzy = new cyzy() //聲明一個(gè)聲音 sy.play() //播放一個(gè)聲音 測(cè)試:OK。 二、加載本地聲音 導(dǎo)入聲音到庫(kù),文件名:cyzy.mp3 在場(chǎng)景第一層第一幀寫代碼: var dizhi:URLRequest=new URLRequest("cyzy.mp3") var sywj:Sound=new Sound() sywj.load(dizhi) sywj.play() 測(cè)試:OK。 三、加載遠(yuǎn)程聲音 把“加載本地聲音”中的本地地址換成網(wǎng)絡(luò)地址即可。 在場(chǎng)景第一層第一幀寫代碼: var dizhi:URLRequest= newURLRequest("http://www1./uploadfile/2009-4/20094118445463509.mp3") var sywj:Sound=new Sound() sywj.load(dizhi) sywj.play() 測(cè)試:OK。 四、聲音事件 打開動(dòng)作---左欄---打開flash.media包---打開Sound---事件:共7個(gè),常用的有4個(gè),下面一一介紹。 (一)、開始事件 所有事件都是一類即一個(gè)包(事件包):flash.event---打開他---Event---屬性---雙擊open---得到Event.OPEN. 在“四、加載遠(yuǎn)程聲音”代碼之后寫: sywj.addEventListener(Event.OPEN,kshs); //kshs:開始函數(shù) function kshs(event:Event) { trace("開始加載了"); } 測(cè)試:當(dāng)歌曲開始播放時(shí),在輸出面板中出現(xiàn)“開始加載了”字樣。 (二)、加載中事件 聲音從加載到加載完成,中間有一段時(shí)間,這段時(shí)間就觸發(fā)了加載中事件。代碼: sywj.addEventListener(ProgressEvent.PROGRESS,jzzhs); //jzzhs:加載中函數(shù) function jzzhs(event:ProgressEvent) { trace("正在加載中"); } 測(cè)試:輸出面板顯示:開始加載,正在加載中(不停循環(huán))。 注意:偵聽器括號(hào)內(nèi)參數(shù)獲取方法:點(diǎn)flash event---點(diǎn)ProgressEvent...... (三)、完成事件 加載完成了,我希望電腦通知我,這是就觸發(fā)了完成事件。 sywj.addEventListener(Event.COMPLETE,wchs) function wchs(event:Event) { trace("加載完成了"); } (四)、出錯(cuò)事件 如果程序出錯(cuò),我希望電腦告訴我,這就觸發(fā)了出錯(cuò)事件。 sywj.addEventListener(IOErrorEvent.IO_ERROR,cchs) function cchs(event:IOErrorEvent) { trace("出錯(cuò)了"); } 將mp3改為mp4,然后測(cè)試: 輸出面板顯示:打開 URL 'http://www./xszy/bjfc/200306wwj/music/myq.mp4' 時(shí)出錯(cuò) 出錯(cuò)了 這個(gè)很管用,我們?cè)诰幊绦蚧蛴脛e人程序時(shí),那個(gè)地方出錯(cuò),電腦會(huì)告訴你的。 //----聲音事件完整代碼---- sywj.addEventListener(Event.OPEN,kshs); sywj.addEventListener(ProgressEvent.PROGRESS,jzzhs); sywj.addEventListener(Event.COMPLETE,wchs) sywj.addEventListener(IOErrorEvent.IO_ERROR,cchs) function kshs(event:Event) { trace("開始加載了"); } function jzzhs(event:ProgressEvent) { trace("正在加載中"); } function wchs(event:Event) { trace("加載完成了"); } function cchs(event:IOErrorEvent) { trace("出錯(cuò)了"); } 五、加載進(jìn)度 1、加載文本 前面講的輸出面板顯示的文字,在發(fā)布以后是不顯示的。加載了多少,希望我們的用戶能知道。如果要看到,就要把他顯示出來: 我們用前面“三、遠(yuǎn)程加載聲音”之后的代碼。 新建一層,起名:加載文本,放as層下。動(dòng)態(tài)文本,實(shí)例名稱:jd_txt ,然后在上節(jié)“(二)、加載中事件”中把trace("正在加載中"); 改寫為: jd_txt.text="正在加載中"; 測(cè)試:正在加載中 文字出現(xiàn)。(輸出面板此時(shí)只有:開始加載了、加載完成了。) 2、求加載百分比 加載百分比=(已加載字節(jié)數(shù)/總字節(jié)數(shù))x100% 把上面jd_txt.text="正在加載中"; 改寫為: jd_txt.text="已加載了:"+ event.bytesLoaded/event.bytesTotal; 測(cè)試:已加載了:1 。 但變化過程中有很多小數(shù),由于變化快,看不清楚,我們乘上100: jd_txt.text="已加載了:"+(event.bytesLoaded/event.bytesTotal")*100; 測(cè)試:已加載了:100 ok 我們發(fā)現(xiàn),剛才計(jì)算時(shí)有些小數(shù),我們不希望他產(chǎn)生小數(shù)。這時(shí)可以在百分比前加個(gè)四舍五入的代碼(round方法): jd_txt.text="已加載了:"+Math.round((event.bytesLoaded/event.bytesTotal)*100); 是小數(shù)還是整數(shù),可以用trace(Math.round((event.bytesLoaded/event.bytesTotal)*100)); 注釋掉這個(gè)// jd_txt.text="已加載了:"+(event.bytesLoaded/event.bytesTotal")*100;然后測(cè)試: 輸出面板全是整數(shù)。再把代碼中的“Math.round”去掉測(cè)試:輸出面板全是小數(shù)。 還少了個(gè)百分號(hào),加上去: jd_txt.text="已加載了:"+Math.round((event.bytesLoaded/event.bytesTotal)*100) +"%"; 3、進(jìn)度條 百分比好啦,再給個(gè)進(jìn)度條。 插入---新建---影片剪輯---矩形工具畫一長(zhǎng)條,左對(duì)齊、頂對(duì)齊---在100幀出插入關(guān)鍵幀。點(diǎn)第一幀,將長(zhǎng)條寬度調(diào)為1,在1~100之間形狀補(bǔ)間。一開始這個(gè)條是在停止?fàn)顟B(tài)的,所以,新建層2,在第一幀打開動(dòng)作面板寫代碼:stop(); 返回場(chǎng)景,新建一層,起名:進(jìn)度條。按ctrl+L把庫(kù)打開,將影片剪輯拖入該層第一幀,實(shí)例名稱:jdt_mc 準(zhǔn)備工作作好了,現(xiàn)在寫代碼: jdt_mc.gotoAndStop(); 停止在哪一幀呢?加載的那一幀,即上面的Math.round((event.bytesLoaded/event.bytesTotal)*100),于是,代碼可以寫成這樣: jdt_mc.gotoAndStop(Math.round((event.bytesLoaded/event.bytesTotal)*100)); 測(cè)試:ok 象上面那樣寫太麻煩,于是我們聲明一個(gè)加載進(jìn)度(jzjd): var jzjd:Number=Math.round((event.bytesLoaded/event.bytesTotal)*100); 于是,動(dòng)態(tài)文本和進(jìn)度條代碼改寫為; jd_txt.text="已加載了:"+jzjd+"%"; jdt_mc.gotoAndStop(jzjd); 剛開始時(shí)進(jìn)度條有一細(xì)線能看見,我們希望開始時(shí)即初始化看不見進(jìn)度條,而加載時(shí)能看見,加載完成后又消失。那么就要在前面先初始化一下: jdt_mc.visible=false; 再在開始加載函數(shù)內(nèi)寫:jdt_mc.visible=true; 再在加載完成函數(shù)內(nèi)寫:jdt_mc.visible=false; 測(cè)試:OK。別忘了保存. // -------- 從“三、加載遠(yuǎn)程聲音”到“五、加載進(jìn)度”完整代碼:-------- //聲明 var dizhi:URLRequest= new URLRequest("http://www./xszy/bjfc/200306wwj/music/myq.mp3"); var sywj:Sound=new Sound(); //初始化 jdt_mc.visible=false; sywj.load(dizhi,liu); sywj.play(); //加載過程 sywj.addEventListener(Event.OPEN,kshs); sywj.addEventListener(ProgressEvent.PROGRESS,jzzhs); sywj.addEventListener(Event.COMPLETE,wchs); sywj.addEventListener(IOErrorEvent.IO_ERROR,cchs); function kshs(event:Event) { //trace("開始加載了"); jdt_mc.visible=true; } function jzzhs(event:ProgressEvent) { var jzjd:Number=Math.round((event.bytesLoaded/event.bytesTotal)*100); jd_txt.text="已加載了:"+jzjd+"%"; jdt_mc.gotoAndStop(jzjd); } function wchs(event:Event) { //trace("加載完成了"); jdt_mc.visible=false; } function cchs(event:IOErrorEvent) { trace("出錯(cuò)了"); } 六、設(shè)置緩沖 所謂緩沖,就是先加載一段時(shí)間,然后再進(jìn)行播放。緩沖一般設(shè)置10~20秒。我們先聲明一個(gè)流(liu): var liu:SoundLoaderContext=new SoundLoaderContext(10000,true); //加載10秒后開始播放 括號(hào)內(nèi)參數(shù)為時(shí)間和安全策略即(時(shí)間,安全策略)。我們?cè)O(shè)置時(shí)間為10秒(1秒=1000毫秒),安全策略為true。 把聲音的流(liu)要寫到加載代碼中才能起作用。即在“三、加載遠(yuǎn)程聲音”中的sywj.load(dizhi)中加進(jìn)流“l(fā)iu”: sywj.load(dizhi,liu); 測(cè)試:加載10秒后開始播放。 七、聲音控制 新建一層,起名控制。拖入3個(gè)按鈕:播放、暫停、停止,實(shí)例名稱分別為:bf_btn、zt_btn、tz_btn 保存。 選中AS層第一幀,打開動(dòng)作面板,先聲明聲音控制: var sykz:SoundChannel=new SoundChannel(); //sykz:聲音控制 聲明了以后還需要賦值,即在“三、加載遠(yuǎn)程聲音”中把sywj.play();改寫為: sykz=sywj.play(); 怎么控制?寫代碼: 停止: tz_btn.addEventListener(MouseEvent.CLICK,tzhs); //偵聽停止 function tzhs(event:MouseEvent) { sykz.stop(); } 播放: bf_btn.addEventListener(MouseEvent.CLICK,bfhs); //偵聽播放 function bfhs(event:MouseEvent) { sykz= sywj.play(); } 暫停: 暫停和停止的區(qū)別:停止是將播放頭停到開始的位置,下次播放聲音將從頭開始;暫停是將播放頭暫停在聲音所播放的地方,下次播放將從暫停處接著播放。這就需要有一個(gè)方法來記錄他當(dāng)時(shí)的位置,我們聲明一個(gè)變量來記錄他:var ztwz:Number; //ztwz:暫停位置。 var ztwz:Number; //聲明暫停位置變量 zt_btn.addEventListener(MouseEvent.CLICK,zths); //偵聽暫停 function zths(event:MouseEvent) { ztwz=sykz.position; //停止在當(dāng)前位置 sykz.stop(); } 然后在停止函數(shù)中寫上:ztwz=0; 否則,暫停和停止是一樣的。 為了從當(dāng)前位置播放,在播放函數(shù)中要填ztwz這個(gè)參數(shù)。即:sykz= sywj.play(ztwz); 聲音控制全部代碼: var sykz:SoundChannel=new SoundChannel(); //聲明聲音控制變量(sykz) var ztwz:Number; //聲明暫停位置變量 sykz= sywj.play(); tz_btn.addEventListener(MouseEvent.CLICK,tzhs); //偵聽停止 bf_btn.addEventListener(MouseEvent.CLICK,bfhs); //偵聽播放 zt_btn.addEventListener(MouseEvent.CLICK,zths); //偵聽暫停 function tzhs(event:MouseEvent) { ztwz=0; //播放頭處于0的位置 sykz.stop(); } function bfhs(event:MouseEvent) { sykz.stop(); //先停止所有聲音再播放,否則有重音或有很多聲音。 sykz= sywj.play(ztwz); //從暫停處開始播放 } function zths(event:MouseEvent) { ztwz=sykz.position; //暫停在當(dāng)前位置 sykz.stop(); } 八、播放條 插入---新建---影片剪輯---起名滑道---矩形工具拉一矩形即長(zhǎng)條(0 0),即左對(duì)齊、頂對(duì)齊。 插入---新建---影片剪輯---起名滑道底部---矩形工具拉一矩形即長(zhǎng)條(0 0)。 插入---新建---影片剪輯---起名滑塊---矩形工具拉一小矩形(0 0)。 返回場(chǎng)景,新建一層,起名播放條。將以上三個(gè)影片剪輯拖入放好(由下至上為:滑道底部、滑道、滑塊),滑道、滑塊實(shí)例名稱分別為:hd_mc、hk_mc.并將播放、暫停、停止三個(gè)按鈕拖入滑道底部上。 在動(dòng)作面板最下寫代碼: //--------------控制條—滑塊-------------- hk_mc.addEventListener(MouseEvent.MOUSE_DOWN,hkax); //hkax:滑塊按下 function hkax(event:MouseEvent) { hk_mc.startDrag(); } 測(cè)試:滑塊可以拖動(dòng),而且不離開鼠標(biāo)。我們要把他限制在滑道內(nèi),且松開鼠標(biāo),滑塊停止拖動(dòng)。再寫代碼: hk_mc.addEventListener(MouseEvent.MOUSE_UP,hksk); //hksk:滑塊松開 function hksk(event:MouseEvent) { hk_mc.stopDrag(); } 我們還要解決鼠標(biāo)形狀問題,即鼠標(biāo)放在滑塊上時(shí),手形鼠標(biāo)出現(xiàn): //------------初始化---------------- hk_mc.buttonMode=true;//將鼠標(biāo)變?yōu)槭种割^形狀 下面解決滑塊拖動(dòng)的范圍問題: 在上面開始拖動(dòng)的函數(shù)中聲明左、上、右、下、方框: var shang=hk_mc.y; var zuo=hd_mc.x; var xia=0; var you=hd_mc.width-hk_mc.width;//減去滑塊寬,滑塊只能移動(dòng)到滑道的右邊緣。 var fk:Rectangle=new Rectangle(zuo,shang,you,xia); 測(cè)試:鼠標(biāo)離開滑塊后,滑塊還可以動(dòng)。這是少了一個(gè)事件,即當(dāng)離開滑塊的事件: stage.addEventListener(MouseEvent.MOUSE_UP,hklk);//滑塊離開 function hklk(event:MouseEvent) { hk_mc.stopDrag(); } //意思為當(dāng)在舞臺(tái)上拖動(dòng)時(shí),不可以拖動(dòng)。 (28講)當(dāng)音樂播放時(shí),滑塊也跟著走動(dòng)。代碼怎么寫呢? 我們要先聲明兩個(gè)變量,一個(gè)記錄音樂的總長(zhǎng)度,另一個(gè)記錄音樂的百分比。在-控制條—滑塊---這一塊寫: var zcd; //總長(zhǎng)度 var bfb; //百分比 這兩個(gè)變量要實(shí)時(shí)記錄,所以要用舞臺(tái)進(jìn)行監(jiān)聽,寫: stage.addEventListener(Event.ENTER_FRAME,cfzx); //cfzx:重復(fù)執(zhí)行 function cfzx(event:Event) { trace(123); } 測(cè)試:輸出面板123重復(fù)顯示,也就是說他一直在監(jiān)聽著。 獲取聲音總長(zhǎng)度方法:flashmedia---Sound---屬性---length(這是當(dāng)前聲音的長(zhǎng)度,以毫秒計(jì)算),在上面函數(shù)內(nèi)寫: zcd=sywj.length/( sywj.bytesLoaded/ sywj.bytesTotal); bfb=sykz.position/zcd; //百分比=當(dāng)前長(zhǎng)度/總長(zhǎng)度 hk_mc.x=bfb*(hd_mc.width -hk_mc.width)+hd_mc.x; //如果不加滑道x(hd_mc.x),滑塊就會(huì)跑到x=0的位置,而不是滑道的左端。 測(cè)試:滑塊剛開始時(shí)跳移了一下。 要解決滑塊剛開始時(shí)跳移問題,首先要知道原因。原因是剛開始時(shí)總長(zhǎng)度(zcd)和百分比(bfb)是沒有的。(29講)是不是這個(gè)原因呢?在百分比一行下加個(gè) trace(zcd); 測(cè)試一下:輸出面板出現(xiàn)NaN。NaN:表示為非數(shù)值。這就要加個(gè)條件語(yǔ)句: function cfzx(event:Event) { //trace(123); zcd=sywj.length/( sywj.bytesLoaded/ sywj.bytesTotal); bfb=sykz.position/zcd; if (zcd) { hk_mc.x=bfb*(hd_mc.width -hk_mc.width)+hd_mc.x; } else { hk_mc.x=hd_mc.x; } } //如果總長(zhǎng)度zcd為真即為數(shù)值時(shí),就播放hk_mc.x=bfb*(hd_mc.width -hk_mc.width)+hd_mc.x; //如果總長(zhǎng)度zcd為假即為非數(shù)值時(shí),就播放hk_mc.x=hd_mc.x; 測(cè)試:滑塊可以隨著音樂的播放而移動(dòng),但我們用鼠標(biāo)拖動(dòng)卻不可以。要解決這個(gè)問題。 (30講)在重復(fù)執(zhí)行代碼中,滑塊是按他的條件語(yǔ)句運(yùn)行的,我們就要再加個(gè)條件語(yǔ)句,即當(dāng)我們按下鼠標(biāo)時(shí),滑塊要停止自動(dòng)移動(dòng)。我們先聲明一個(gè)判斷(pd): var pd:Boolean=false; 然后在hkax函數(shù)中寫:pd=true; 在hksk函數(shù)中寫:pd=false; 在hklk函數(shù)中寫:pd=false; 在cfzx函數(shù)中寫: function cfzx(event:Event) { //trace(123); zcd=sywj.length/( sywj.bytesLoaded/ sywj.bytesTotal); bfb=sykz.position/zcd; if (pd) { } else { if (zcd) { hk_mc.x=bfb*(hd_mc.width -hk_mc.width)+hd_mc.x; } else { hk_mc.x=hd_mc.x; } } } //當(dāng)判斷pd為假時(shí)(初始值為假)就按正常播放。即播放if (zcd) { hk_mc.x=bfb*(hd_mc.width -hk_mc.width)+hd_mc.x; } else { hk_mc.x=hd_mc.x; };當(dāng)判斷pd為真時(shí),就執(zhí)行滑塊按下函數(shù)。因?yàn)樵诨瑝K按下函數(shù)中我們?cè)O(shè)置判斷為真(pd=true;)。 測(cè)試:滑塊可以拖動(dòng),但松開后又彈回去了。 (31講)解決滑塊松開后又彈回去,也就是在if(pd){}大括號(hào)里要計(jì)算出播放條位置,并且在按下鼠標(biāo)時(shí)要停止音樂。在hkax函數(shù)中寫:sykz.stop();在再if (pd) {}中寫: ztwz=zcd*hk_mc.x/(hd_mc.width -hk_mc.width); 這個(gè)暫停位置是怎么來的呢?可以這樣理解: 當(dāng)前播放頭位置 滑塊的當(dāng)前位置 ——————— : ——————— 音樂總長(zhǎng)度 滑道的長(zhǎng)度 從該公式可以求出任意一個(gè)值。上面的ztwz就是“當(dāng)前播放頭位置=總長(zhǎng)度*滑塊的當(dāng)前位置/滑道的長(zhǎng)度”。就是這么來的。 在hksk函數(shù)內(nèi)加寫:sykz=sywj.play(ztwz); 加了他后在hklk里有重復(fù)(播放的)聲音,而去掉他,在場(chǎng)景松開后又不播放。咋辦?我們知道在if(pd){}中滑塊x是變化的,應(yīng)該減去滑道(hd)的x,即: if(pd){ ztwz=zcd*(hk_mc.x-hd_mc.x)/(hd_mc.width -hk_mc.width); }else{ if....... } (32講)當(dāng)在場(chǎng)景中hklk拖動(dòng)后既要播放,還要沒有重音,那么在播放之前先停掉所有聲音,就沒有重音了。即在hklk函數(shù)中播放之前加個(gè)停止代碼(sykz.stop();): function hklk(event:MouseEvent) { pd=false; hk_mc.stopDrag(); sykz.stop(); sykz=sywj.play(ztwz); } 測(cè)試:以上問題解決了,但三個(gè)按鈕再次使用不起作用,還是有重音,我們?cè)诓シ虐粹o函數(shù)中加個(gè)(sykz.stop();): function bfhs(event:MouseEvent) { sykz.stop(); sykz=sywj.play(ztwz); } 測(cè)試:ok. (33~36講)當(dāng)我們點(diǎn)擊滑道某一位置,滑塊會(huì)跳到某一位置。這個(gè)功能怎么實(shí)現(xiàn)呢? 在最下面寫代碼: //---------控制條_滑道------- hd_mc.buttonMode=true;//將鼠標(biāo)變?yōu)槭种割^形狀 hd_mc.addEventListener(MouseEvent.MOUSE_DOWN,hdax); //hdax:滑道按下 hd_mc.addEventListener(MouseEvent.MOUSE_UP,hdsk); //hdsk:滑道松開 function hdax(event:MouseEvent) { pd=true; sykz.stop(); if (mouseX<(hd_mc.width -hk_mc.width)+hd_mc.x) { hk_mc.x=mouseX; } else { hk_mc.x=(hd_mc.width -hk_mc.width)+hd_mc.x; } //if判斷語(yǔ)句使滑塊在滑道內(nèi)移動(dòng) ztwz=zcd*(hk_mc.x-hd_mc.x)/(hd_mc.width -hk_mc.width); } function hdsk(event) { pd=false; sykz.stop(); sykz=shengyin.play(ztwz); } //-------------從“三、加載遠(yuǎn)程聲音”到“八、播放條”完整代碼:-------------------------- //---------聲明---------------- 九、(播放條)多首歌曲 (37講)添加按鈕:添加上一首、下一首按鈕,實(shí)例名稱分別為:ss_btn、xs_btn 將滑道底部新建一層,以便調(diào)整長(zhǎng)短,好把所有按鈕放在滑道底部上。//ss:上首、xs:下首 (38講)聲明數(shù)組和索引: //---------聲明---------------- var gqsz:Array=new Array(); //gqsz:歌曲數(shù)組 var gqsy:int=new int(); //gqsy:歌曲索引 (39講)初始化: //------------初始化------------------ gqsz[0]="http://www1./uploadfile/2009-4/20094118445463509.mp3"; gqsz[1]="HTTP://blog.linziedu.net/user1/1346/upload/20077124479.mp3"; gqsz[2]="http://news./site1/20100612/005056c000080d7d663224.mp3"; gqsz[3]="http://storage./items/5739916E4F91E638!1000?filename=%E6%AF%9B%E9%98%BF%E6%95%8F%E6%AD%8C%E6%9B%B218%E9%A6%96.mp3"; gqsz[4]="http://www./xszy/bjfc/200306wwj/music/myq.mp3"; gqsz[5]="http://winner./music/mp3/qingzanggaoyuan.mp3"; gqsz[6]="http://58.213.127.41/web/201013154293470/upload/20103685712670.mp3"; //也可以這樣寫: gqsz=["http://www./xszy/bjfc/200306wwj/music/myq.mp3","http://www./xszy/bjfc/200306wwj/music/myq.mp3",] 這樣太長(zhǎng),還是用上面的好。 gqsy=0; dizhi.url=gqsz[gqsy]; //dizhi:音樂地址 (40~46講)給上一首、下一首按鈕寫代碼: //多首歌曲 ss_btn.addEventListener(MouseEvent.CLICK,sshs);//上首按鈕單擊事件 sshs:上首函數(shù) xs_btn.addEventListener(MouseEvent.CLICK,xshs); //下首按鈕單擊事件xshs:下首函數(shù) function sshs(event) { sykz.stop(); //停止所有聲音后再轉(zhuǎn)到上一首,可消除重音 /*if(gqsy>0){ gqsy--; }else{ gqsy=gqsz.length-1; } */ //另一種寫法: gqsy=(gqsy>0)?gqsy-1:gqsy=gqsz.length-1; //trace(gqsy); cbf(); //初始播放 } function xshs(event) { sykz.stop(); //停止所有聲音后再轉(zhuǎn)到下一首,可消除重音 /*if(gqsy<gqsz.length-1){ gqsy++; }else{ gqsy=0; } */ //另一種寫法: gqsy=(gqsy<gqsz.length-1)?gqsy+1:0; trace(gqsy); cbf(); //初始播放 } 十、循環(huán)播放 (47講)比如有10首歌曲,當(dāng)?shù)?首播放完,播放第2首,以此類推。當(dāng)?shù)?0首播放完,播放第一首。這就叫循環(huán)播放。 先作一個(gè)循環(huán)按鈕,但最好不用用按鈕,用影片剪輯:插入---新建---影片剪輯---起名循環(huán)---確定。在第一幀畫按鈕,共3幀:彈起、經(jīng)過、按下。再新建一層,起名as:stop; (48講)將制作好的按鈕(即影片剪輯)拖入場(chǎng)景,放合適位,實(shí)例名稱:xh_mc 要循環(huán),就有監(jiān)控,緊跟著就有片斷,片斷就有條件。(49~53講)下面寫代碼: //-----循環(huán)播放控制---------------------- xh_mc.buttonMode=true;//將鼠標(biāo)變?yōu)槭种割^形狀 addEventListener(Event.ENTER_FRAME,xhhs);//偵聽事件 xh_mc.addEventListener(MouseEvent.CLICK,xhhs); //當(dāng)鼠標(biāo)按下循環(huán)按鈕時(shí)偵聽 function xhhs(event) { if (int(bfb*100)==99) { sykz.stop(); gqsy=(gqsy<gqsz.length-1)?gqsy+1:0; cbf(); } //trace(int(bfb*100)); } function djhs(event) { if (xh_mc.currentFrame==3) { removeEventListener(Event.ENTER_FRAME,xhhs); //卸載監(jiān)聽 xh_mc.gotoAndStop(1); } else { xh_mc.gotoAndStop(3); addEventListener(Event.ENTER_FRAME,xhhs); //開始監(jiān)聽 } } 十一、單曲循環(huán) (54講)制作單曲循環(huán)按鈕。制作方法同“制作循環(huán)按鈕”。 (55講)寫單曲循環(huán)代碼: //---------單曲循環(huán)-------- addEventListener(Event.ENTER_FRAME,dqhs); //dqhs:單曲函數(shù) function dqhs(event) { if (int(bfb*100)==99) { sykz.stop(); ztwz=0; cbf(); } } 測(cè)試:第一首歌曲播放完后會(huì)自動(dòng)單曲循環(huán),這是因?yàn)闆]有給單曲循環(huán)按鈕添加事件,所以這個(gè)單曲循環(huán)是不受控制的。下面看如何控制。 (56講)按鈕控制單曲循環(huán): 先將前面單曲偵聽事件改寫為: //---------單曲循環(huán)--------- dq_mc.addEventListener(MouseEvent.CLICK,dqdjhs); //dqdjhs:單曲點(diǎn)擊函數(shù) function dqhs(event) { if (int(bfb*100)==99) { sykz.stop(); gqsy=0; cbf(); } } 然后再接著寫按鈕控制代碼: function dqdjhs(event) { if (dq_mc.currentFrame==2) { removeEventListener(Event.ENTER_FRAME,dqhs); dq_mc.gotoAndStop(1); } else { dq_mc.gotoAndStop(2); addEventListener(Event.ENTER_FRAME,dqhs); } } 十二、完善 (57講)有幾個(gè)問題。先解決第1個(gè)。 ① 加載問題。這首歌加載了5%,我想聽其他的,但他還在繼續(xù)加載。這就是動(dòng)態(tài)文本顯示處的問題了。在加載中函數(shù)(jzzhs): function jzzhs(event:ProgressEvent) { var jzjd:Number=Math.round((event.bytesLoaded/event.bytesTotal)*100); jd_txt.text="已加載了:"+jzjd+"%"; jdt_mc.gotoAndStop(jzjd); } 中把 var jzjd:Number=Math.round((event.bytesLoaded/event.bytesTotal)*100);中的evene改寫為sywj即可。 測(cè)試:加載了若干,點(diǎn)下一首,又從頭加載歌曲。Ok. 但偶爾出現(xiàn)“加載了NaN%”。我們依然改寫jzzhs,在其中加個(gè)判斷語(yǔ)句: function jzzhs(event:ProgressEvent) { var jzjd:Number=Math.round((sywj.bytesLoaded/event.bytesTotal)*100); if (jzjd) { jd_txt.text="已加載了:"+jzjd+"%"; jdt_mc.gotoAndStop(jzjd); } else { jd_txt.text="已加載了:"+0+"%"; jdt_mc.gotoAndStop(1); //當(dāng)加載數(shù)值為0時(shí),進(jìn)度條停在第1幀 } } ②(58講)第2個(gè)問題是在舞臺(tái)上單擊鼠標(biāo)也起作用。對(duì)舞臺(tái)起作用的有兩個(gè)監(jiān)聽,在“控制條_滑塊”這一塊中有: stage.addEventListener(MouseEvent.MOUSE_UP,hklk);//意思為當(dāng)在舞臺(tái)上松開鼠標(biāo)則起作用 怎么改?我們先讓他不出現(xiàn),即剪切掉。讓他在單擊了按鈕之后起作用,所以把他放在hkax函數(shù)中: function hkax(event:MouseEvent) { pd=true; } 松開鼠標(biāo)要?jiǎng)h除他: function hksk(event:MouseEvent) { pd=false; } 在外部釋放以后也讓他刪除: pd=false; function wchs(event:Event) { //trace("加載完成了"); } ④(60講)第4個(gè)問題是當(dāng)播放頭不在100%的時(shí)候,拖動(dòng)滑塊后滑塊有彈回當(dāng)前位置。 把jzzhs函數(shù)function jzzhs(event:ProgressEvent) { var jzjd:Number=Math.round((sywj.bytesLoaded/event.bytesTotal)*100); ..... } 中var jzjd:Number拷貝到最前作成全局變量即:var jzjd:Number; 而在函數(shù)中用jzjd代替var jzjd:Number即: jzjd=Math.round((sywj.bytesLoaded/event.bytesTotal)*100); 在滑塊按下hkax函數(shù)中加if(jzjd==100){}: function hkax(event:MouseEvent) { if(jzjd==100){ pd=true; } } 測(cè)試:未加載到100%,還可以拖動(dòng)。原因是還有一個(gè)滑道沒設(shè)置。所以要在滑道按下hdax函數(shù)中增加判斷語(yǔ)句: function hdax(event:MouseEvent) { if (jzjd==100) { pd=true; sykz.stop(); if (mouseX<(hd_mc.width -hk_mc.width)+hd_mc.x) { hk_mc.x=mouseX; } else { hk_mc.x=(hd_mc.width -hk_mc.width)+hd_mc.x; } ztwz=zcd*(hk_mc.x-hd_mc.x)/(hd_mc.width -hk_mc.width); } else { ztwz=sykz.position; //播放頭停在當(dāng)前位置 sykz.stop(); } } 十三、完整代碼: //---------聲明---------------- var gqsz:Array=new Array();//歌曲數(shù)組 var gqsy:int=new int();//歌曲索引 var dizhi:URLRequest= new URLRequest("http://www./xszy/bjfc/200306wwj/music/myq.mp3");//歌曲地址 var sywj:Sound; //聲音文件 var liu:SoundLoaderContext=new SoundLoaderContext(10000,true);//聲明流,緩沖用 var sykz:SoundChannel=new SoundChannel();//聲音控制 var ztwz:Number;//暫停位置 var jzjd:Number;//加載進(jìn)度 //------------初始化------------------ //也可以這樣 gqsz=["http://www./xszy/bjfc/200306wwj/music/myq.mp3","http://www./xszy/bjfc/200306wwj/music/myq.mp3",] gqsz[0]="http://www1./uploadfile/2009-4/20094118445463509.mp3"; gqsz[1]="HTTP://blog.linziedu.net/user1/1346/upload/20077124479.mp3"; gqsz[2]="http://news./site1/20100612/005056c000080d7d663224.mp3"; gqsz[3]="http://storage./items/5739916E4F91E638!1000?filename=%E6%AF%9B%E9%98%BF%E6%95%8F%E6%AD%8C%E6%9B%B218%E9%A6%96.mp3"; gqsz[4]="http://www./xszy/bjfc/200306wwj/music/myq.mp3"; gqsz[5]="http://winner./music/mp3/qingzanggaoyuan.mp3"; gqsz[6]="http://58.213.127.41/web/201013154293470/upload/20103685712670.mp3"; gqsy=0; cbf(); //初始播放 function cbf() { sywj=new Sound(); dizhi.url=gqsz[gqsy]; sywj.load(dizhi,liu); sykz=sywj.play(); sywj.addEventListener(Event.OPEN,kshs);//開始加載偵聽 sywj.addEventListener(ProgressEvent.PROGRESS,jzzhs);//正在加載偵聽 sywj.addEventListener(Event.COMPLETE,wchs);//完成加載偵聽 sywj.addEventListener(IOErrorEvent.IO_ERROR,cchs);//出錯(cuò)偵聽 } jdt_mc.visible=false; //初始化進(jìn)度條不可見 //-----------加載過程------------------ function kshs(event:Event) { //trace("開始加載了"); jdt_mc.visible=true; } function jzzhs(event:ProgressEvent) { jzjd=Math.round((sywj.bytesLoaded/sywj.bytesTotal)*100); if (jzjd) { jd_txt.text="加載了:"+jzjd+"%"; jdt_mc.gotoAndStop(jzjd); } else { jd_txt.text="加載了:"+0+"%"; jdt_mc.gotoAndStop(1); } } function wchs(event:Event) { sywj.removeEventListener(Event.COMPLETE,wchs); //trace("加載完成了"); jdt_mc.visible=false; //jd_txt.visible=false;//該句為老虎所加 } function cchs(event:IOErrorEvent) { trace("出錯(cuò)了"); } //---------聲音控制------------ tz_btn.addEventListener(MouseEvent.CLICK,tzhs);//停止按鈕偵聽 bf_btn.addEventListener(MouseEvent.CLICK,bfhs);//播放按鈕偵聽 zt_btn.addEventListener(MouseEvent.CLICK,zths);//暫停按鈕偵聽 function tzhs(event:MouseEvent) { ztwz=0; sykz.stop(); } function bfhs(event:MouseEvent) { sykz.stop(); sykz=sywj.play(ztwz); //從暫停位置開始播放 } function zths(event:MouseEvent) { ztwz=sykz.position; //暫停位置為當(dāng)前位置 sykz.stop(); } //-----控制條_滑塊------------------ var shang=hk_mc.y;//上 var zuo=hd_mc.x;//左 var xia=0;//下 var you=hd_mc.width-hk_mc.width;//右 var fk:Rectangle=new Rectangle(zuo,shang,you,xia);//滑塊拖動(dòng)范圍 var zcd;//總播放 var bfb;//百分比 var pd=false;//判斷 hk_mc.buttonMode=true;//將鼠標(biāo)變?yōu)槭种割^形狀 hk_mc.addEventListener(MouseEvent.MOUSE_DOWN,hkax);//當(dāng)鼠標(biāo)按下滑塊時(shí)偵聽 hk_mc.addEventListener(MouseEvent.MOUSE_UP,hksk);//當(dāng)鼠標(biāo)松開滑塊時(shí)偵聽 stage.addEventListener(Event.ENTER_FRAME,cfzx);//對(duì)舞臺(tái)偵聽(cfzx:重復(fù)執(zhí)行) function hkax(event:MouseEvent) { stage.addEventListener(MouseEvent.MOUSE_UP,hklk); if (jzjd==100) { pd=true; hk_mc.startDrag(false,fk); } sykz.stop(); } function hksk(event:MouseEvent) { stage.removeEventListener(MouseEvent.MOUSE_UP,hklk); pd=false; hk_mc.stopDrag(); sykz=sywj.play(ztwz); } function hklk(event:MouseEvent) { stage.removeEventListener(MouseEvent.MOUSE_UP,hklk); pd=false; hk_mc.stopDrag(); sykz.stop(); sykz=sywj.play(ztwz); } function cfzx(event:Event) { //cfzx:重復(fù)執(zhí)行; zcd=sywj.length/(sywj.bytesLoaded/sywj.bytesTotal); bfb=sykz.position/zcd; if (pd) { ztwz=zcd*(hk_mc.x-hd_mc.x)/(hd_mc.width -hk_mc.width); } else { if (zcd) { hk_mc.x=bfb*(hd_mc.width -hk_mc.width)+hd_mc.x; } else { hk_mc.x=hd_mc.x; } } } //---------控制條_滑道------- hd_mc.buttonMode=true;//將鼠標(biāo)變?yōu)槭种割^形狀 hd_mc.addEventListener(MouseEvent.MOUSE_DOWN,hdax);//當(dāng)鼠標(biāo)按下滑道時(shí)偵聽 hd_mc.addEventListener(MouseEvent.MOUSE_UP,hdsk);//當(dāng)鼠標(biāo)松開滑道時(shí)偵聽 function hdax(event:MouseEvent) { if (jzjd==100) { pd=true; sykz.stop(); if (mouseX<(hd_mc.width -hk_mc.width)+hd_mc.x) { hk_mc.x=mouseX; } else { hk_mc.x=(hd_mc.width -hk_mc.width)+hd_mc.x; } ztwz=zcd*(hk_mc.x-hd_mc.x)/(hd_mc.width -hk_mc.width); } else { ztwz=sykz.position; sykz.stop(); } } function hdsk(event) { pd=false; sykz.stop(); sykz=sywj.play(ztwz); } //-------多首歌曲-------- ss_btn.addEventListener(MouseEvent.CLICK,sshs);//當(dāng)鼠標(biāo)按下上首(ss)按鈕時(shí)偵聽 xs_btn.addEventListener(MouseEvent.CLICK,xshs);//當(dāng)鼠標(biāo)按下下首(xs)按鈕時(shí)偵聽 function sshs(event) { sykz.stop(); /*if(gqsy>0){ gqsy--; }else{ gqsy=gqsz.length-1; } */ //另一種寫法: gqsy=(gqsy>0)?gqsy-1:gqsy=gqsz.length-1; //trace(gqsy); cbf(); } function xshs(event) { sykz.stop(); /*if(gqsy<gqsz.length-1){ gqsy++; }else{ gqsy=0; } */ //另一種寫法: gqsy=(gqsy<gqsz.length-1)?gqsy+1:0; trace(gqsy); cbf(); } //-----循環(huán)播放控制---------------------- xh_mc.buttonMode=true;//將鼠標(biāo)變?yōu)槭种割^形狀 addEventListener(Event.ENTER_FRAME,xhhs);//偵聽 xh_mc.addEventListener(MouseEvent.CLICK,xhhs);//當(dāng)鼠標(biāo)按下循環(huán)按鈕時(shí)偵聽 function xhhs(event) { if (int(bfb*100)==99) { sykz.stop(); gqsy=(gqsy<gqsz.length-1)?gqsy+1:0; cbf(); } //trace(int(bfb*100)); } function djhs(event) { if (xh_mc.currentFrame==3) { removeEventListener(Event.ENTER_FRAME,xhhs); xh_mc.gotoAndStop(1); } else { xh_mc.gotoAndStop(3); addEventListener(Event.ENTER_FRAME,xhhs); } } //---------單曲循環(huán)--------- dq_mc.addEventListener(MouseEvent.CLICK,dqdjhs);//單曲點(diǎn)擊函數(shù)(dqdjhs) function dqhs(event) { if (int(bfb*100)==99) { sykz.stop(); gqsy=0; cbf(); } } function dqdjhs(event) { if (dq_mc.currentFrame==2) { removeEventListener(Event.ENTER_FRAME,dqhs); //卸載偵聽 dq_mc.gotoAndStop(1); } else { dq_mc.gotoAndStop(2); addEventListener(Event.ENTER_FRAME,dqhs); //開始偵聽 } } |
|