一、加载库中声音 导入声音到库---右键---链接---勾选“为ActionScript导出”---类(即名称):cyzy 点选第一帧,打开动作面板,写代码: var sy:cyzy = new cyzy() //声明一个声音 sy.play() //播放一个声音 测试:OK。 二、加载本地声音 导入声音到库,文件名:cyzy.mp3 在场景第一层第一帧写代码: var dizhi:URLRequest=new URLRequest("cyzy.mp3") var sywj:Sound=new Sound() sywj.load(dizhi) sywj.play() 测试:OK。 三、加载远程声音 把“加载本地声音”中的本地地址换成网络地址即可。 在场景第一层第一帧写代码: var dizhi:URLRequest= newURLRequest("http://www1./uploadfile/2009-4/20094118445463509.mp3") var sywj:Sound=new Sound() sywj.load(dizhi) sywj.play() 测试:OK。 四、声音事件 打开动作---左栏---打开flash.media包---打开Sound---事件:共7个,常用的有4个,下面一一介绍。 (一)、开始事件 所有事件都是一类即一个包(事件包):flash.event---打开他---Event---属性---双击open---得到Event.OPEN. 在“四、加载远程声音”代码之后写: sywj.addEventListener(Event.OPEN,kshs); //kshs:开始函数 function kshs(event:Event) { trace("开始加载了"); } 测试:当歌曲开始播放时,在输出面板中出现“开始加载了”字样。 (二)、加载中事件 声音从加载到加载完成,中间有一段时间,这段时间就触发了加载中事件。代码: sywj.addEventListener(ProgressEvent.PROGRESS,jzzhs); //jzzhs:加载中函数 function jzzhs(event:ProgressEvent) { trace("正在加载中"); } 测试:输出面板显示:开始加载,正在加载中(不停循环)。 注意:侦听器括号内参数获取方法:点flash event---点ProgressEvent...... (三)、完成事件 加载完成了,我希望电脑通知我,这是就触发了完成事件。 sywj.addEventListener(Event.COMPLETE,wchs) function wchs(event:Event) { trace("加载完成了"); } (四)、出错事件 如果程序出错,我希望电脑告诉我,这就触发了出错事件。 sywj.addEventListener(IOErrorEvent.IO_ERROR,cchs) function cchs(event:IOErrorEvent) { trace("出错了"); } 将mp3改为mp4,然后测试: 输出面板显示:打开 URL 'http://www./xszy/bjfc/200306wwj/music/myq.mp4' 时出错 出错了 这个很管用,我们在编程序或用别人程序时,那个地方出错,电脑会告诉你的。 //----声音事件完整代码---- 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("出错了"); } 五、加载进度 1、加载文本 前面讲的输出面板显示的文字,在发布以后是不显示的。加载了多少,希望我们的用户能知道。如果要看到,就要把他显示出来: 我们用前面“三、远程加载声音”之后的代码。 新建一层,起名:加载文本,放as层下。动态文本,实例名称:jd_txt ,然后在上节“(二)、加载中事件”中把trace("正在加载中"); 改写为: jd_txt.text="正在加载中"; 测试:正在加载中 文字出现。(输出面板此时只有:开始加载了、加载完成了。) 2、求加载百分比 加载百分比=(已加载字节数/总字节数)x100% 把上面jd_txt.text="正在加载中"; 改写为: jd_txt.text="已加载了:"+ event.bytesLoaded/event.bytesTotal; 测试:已加载了:1 。 但变化过程中有很多小数,由于变化快,看不清楚,我们乘上100: jd_txt.text="已加载了:"+(event.bytesLoaded/event.bytesTotal")*100; 测试:已加载了:100 ok 我们发现,刚才计算时有些小数,我们不希望他产生小数。这时可以在百分比前加个四舍五入的代码(round方法): jd_txt.text="已加载了:"+Math.round((event.bytesLoaded/event.bytesTotal)*100); 是小数还是整数,可以用trace(Math.round((event.bytesLoaded/event.bytesTotal)*100)); 注释掉这个// jd_txt.text="已加载了:"+(event.bytesLoaded/event.bytesTotal")*100;然后测试: 输出面板全是整数。再把代码中的“Math.round”去掉测试:输出面板全是小数。 还少了个百分号,加上去: jd_txt.text="已加载了:"+Math.round((event.bytesLoaded/event.bytesTotal)*100) +"%"; 3、进度条 百分比好啦,再给个进度条。 插入---新建---影片剪辑---矩形工具画一长条,左对齐、顶对齐---在100帧出插入关键帧。点第一帧,将长条宽度调为1,在1~100之间形状补间。一开始这个条是在停止状态的,所以,新建层2,在第一帧打开动作面板写代码:stop(); 返回场景,新建一层,起名:进度条。按ctrl+L把库打开,将影片剪辑拖入该层第一帧,实例名称:jdt_mc 准备工作作好了,现在写代码: jdt_mc.gotoAndStop(); 停止在哪一帧呢?加载的那一帧,即上面的Math.round((event.bytesLoaded/event.bytesTotal)*100),于是,代码可以写成这样: jdt_mc.gotoAndStop(Math.round((event.bytesLoaded/event.bytesTotal)*100)); 测试:ok 象上面那样写太麻烦,于是我们声明一个加载进度(jzjd): var jzjd:Number=Math.round((event.bytesLoaded/event.bytesTotal)*100); 于是,动态文本和进度条代码改写为; jd_txt.text="已加载了:"+jzjd+"%"; jdt_mc.gotoAndStop(jzjd); 刚开始时进度条有一细线能看见,我们希望开始时即初始化看不见进度条,而加载时能看见,加载完成后又消失。那么就要在前面先初始化一下: jdt_mc.visible=false; 再在开始加载函数内写:jdt_mc.visible=true; 再在加载完成函数内写:jdt_mc.visible=false; 测试:OK。别忘了保存. // -------- 从“三、加载远程声音”到“五、加载进度”完整代码:-------- //声明 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("出错了"); } 六、设置缓冲 所谓缓冲,就是先加载一段时间,然后再进行播放。缓冲一般设置10~20秒。我们先声明一个流(liu): var liu:SoundLoaderContext=new SoundLoaderContext(10000,true); //加载10秒后开始播放 括号内参数为时间和安全策略即(时间,安全策略)。我们设置时间为10秒(1秒=1000毫秒),安全策略为true。 把声音的流(liu)要写到加载代码中才能起作用。即在“三、加载远程声音”中的sywj.load(dizhi)中加进流“liu”: sywj.load(dizhi,liu); 测试:加载10秒后开始播放。 七、声音控制 新建一层,起名控制。拖入3个按钮:播放、暂停、停止,实例名称分别为:bf_btn、zt_btn、tz_btn 保存。 选中AS层第一帧,打开动作面板,先声明声音控制: var sykz:SoundChannel=new SoundChannel(); //sykz:声音控制 声明了以后还需要赋值,即在“三、加载远程声音”中把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(); } 暂停: 暂停和停止的区别:停止是将播放头停到开始的位置,下次播放声音将从头开始;暂停是将播放头暂停在声音所播放的地方,下次播放将从暂停处接着播放。这就需要有一个方法来记录他当时的位置,我们声明一个变量来记录他:var ztwz:Number; //ztwz:暂停位置。 var ztwz:Number; //声明暂停位置变量 zt_btn.addEventListener(MouseEvent.CLICK,zths); //侦听暂停 function zths(event:MouseEvent) { ztwz=sykz.position; //停止在当前位置 sykz.stop(); } 然后在停止函数中写上:ztwz=0; 否则,暂停和停止是一样的。 为了从当前位置播放,在播放函数中要填ztwz这个参数。即: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; //暂停在当前位置 sykz.stop(); } 八、播放条 插入---新建---影片剪辑---起名滑道---矩形工具拉一矩形即长条(0 0),即左对齐、顶对齐。 插入---新建---影片剪辑---起名滑道底部---矩形工具拉一矩形即长条(0 0)。 插入---新建---影片剪辑---起名滑块---矩形工具拉一小矩形(0 0)。 返回场景,新建一层,起名播放条。将以上三个影片剪辑拖入放好(由下至上为:滑道底部、滑道、滑块),滑道、滑块实例名称分别为:hd_mc、hk_mc.并将播放、暂停、停止三个按钮拖入滑道底部上。 在动作面板最下写代码: //--------------控制条—滑块-------------- hk_mc.addEventListener(MouseEvent.MOUSE_DOWN,hkax); //hkax:滑块按下 function hkax(event:MouseEvent) { hk_mc.startDrag(); } 测试:滑块可以拖动,而且不离开鼠标。我们要把他限制在滑道内,且松开鼠标,滑块停止拖动。再写代码: hk_mc.addEventListener(MouseEvent.MOUSE_UP,hksk); //hksk:滑块松开 function hksk(event:MouseEvent) { hk_mc.stopDrag(); } 我们还要解决鼠标形状问题,即鼠标放在滑块上时,手形鼠标出现: //------------初始化---------------- hk_mc.buttonMode=true;//将鼠标变为手指头形状 下面解决滑块拖动的范围问题: 在上面开始拖动的函数中声明左、上、右、下、方框: 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); 测试:鼠标离开滑块后,滑块还可以动。这是少了一个事件,即当离开滑块的事件: stage.addEventListener(MouseEvent.MOUSE_UP,hklk);//滑块离开 function hklk(event:MouseEvent) { hk_mc.stopDrag(); } //意思为当在舞台上拖动时,不可以拖动。 (28讲)当音乐播放时,滑块也跟着走动。代码怎么写呢? 我们要先声明两个变量,一个记录音乐的总长度,另一个记录音乐的百分比。在-控制条—滑块---这一块写: var zcd; //总长度 var bfb; //百分比 这两个变量要实时记录,所以要用舞台进行监听,写: stage.addEventListener(Event.ENTER_FRAME,cfzx); //cfzx:重复执行 function cfzx(event:Event) { trace(123); } 测试:输出面板123重复显示,也就是说他一直在监听着。 获取声音总长度方法:flashmedia---Sound---属性---length(这是当前声音的长度,以毫秒计算),在上面函数内写: zcd=sywj.length/( sywj.bytesLoaded/ sywj.bytesTotal); bfb=sykz.position/zcd; //百分比=当前长度/总长度 hk_mc.x=bfb*(hd_mc.width -hk_mc.width)+hd_mc.x; //如果不加滑道x(hd_mc.x),滑块就会跑到x=0的位置,而不是滑道的左端。 测试:滑块刚开始时跳移了一下。 要解决滑块刚开始时跳移问题,首先要知道原因。原因是刚开始时总长度(zcd)和百分比(bfb)是没有的。(29讲)是不是这个原因呢?在百分比一行下加个 trace(zcd); 测试一下:输出面板出现NaN。NaN:表示为非数值。这就要加个条件语句: 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; } } //如果总长度zcd为真即为数值时,就播放hk_mc.x=bfb*(hd_mc.width -hk_mc.width)+hd_mc.x; //如果总长度zcd为假即为非数值时,就播放hk_mc.x=hd_mc.x; 测试:滑块可以随着音乐的播放而移动,但我们用鼠标拖动却不可以。要解决这个问题。 (30讲)在重复执行代码中,滑块是按他的条件语句运行的,我们就要再加个条件语句,即当我们按下鼠标时,滑块要停止自动移动。我们先声明一个判断(pd): var pd:Boolean=false; 然后在hkax函数中写:pd=true; 在hksk函数中写:pd=false; 在hklk函数中写:pd=false; 在cfzx函数中写: 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; } } } //当判断pd为假时(初始值为假)就按正常播放。即播放if (zcd) { hk_mc.x=bfb*(hd_mc.width -hk_mc.width)+hd_mc.x; } else { hk_mc.x=hd_mc.x; };当判断pd为真时,就执行滑块按下函数。因为在滑块按下函数中我们设置判断为真(pd=true;)。 测试:滑块可以拖动,但松开后又弹回去了。 (31讲)解决滑块松开后又弹回去,也就是在if(pd){}大括号里要计算出播放条位置,并且在按下鼠标时要停止音乐。在hkax函数中写:sykz.stop();在再if (pd) {}中写: ztwz=zcd*hk_mc.x/(hd_mc.width -hk_mc.width); 这个暂停位置是怎么来的呢?可以这样理解: 当前播放头位置 滑块的当前位置 ——————— : ——————— 音乐总长度 滑道的长度 从该公式可以求出任意一个值。上面的ztwz就是“当前播放头位置=总长度*滑块的当前位置/滑道的长度”。就是这么来的。 在hksk函数内加写:sykz=sywj.play(ztwz); 加了他后在hklk里有重复(播放的)声音,而去掉他,在场景松开后又不播放。咋办?我们知道在if(pd){}中滑块x是变化的,应该减去滑道(hd)的x,即: if(pd){ ztwz=zcd*(hk_mc.x-hd_mc.x)/(hd_mc.width -hk_mc.width); }else{ if....... } (32讲)当在场景中hklk拖动后既要播放,还要没有重音,那么在播放之前先停掉所有声音,就没有重音了。即在hklk函数中播放之前加个停止代码(sykz.stop();): function hklk(event:MouseEvent) { pd=false; hk_mc.stopDrag(); sykz.stop(); sykz=sywj.play(ztwz); } 测试:以上问题解决了,但三个按钮再次使用不起作用,还是有重音,我们在播放按钮函数中加个(sykz.stop();): function bfhs(event:MouseEvent) { sykz.stop(); sykz=sywj.play(ztwz); } 测试:ok. (33~36讲)当我们点击滑道某一位置,滑块会跳到某一位置。这个功能怎么实现呢? 在最下面写代码: //---------控制条_滑道------- hd_mc.buttonMode=true;//将鼠标变为手指头形状 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判断语句使滑块在滑道内移动 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); } //-------------从“三、加载远程声音”到“八、播放条”完整代码:-------------------------- //---------声明---------------- 九、(播放条)多首歌曲 (37讲)添加按钮:添加上一首、下一首按钮,实例名称分别为:ss_btn、xs_btn 将滑道底部新建一层,以便调整长短,好把所有按钮放在滑道底部上。//ss:上首、xs:下首 (38讲)声明数组和索引: //---------声明---------------- var gqsz:Array=new Array(); //gqsz:歌曲数组 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",] 这样太长,还是用上面的好。 gqsy=0; dizhi.url=gqsz[gqsy]; //dizhi:音乐地址 (40~46讲)给上一首、下一首按钮写代码: //多首歌曲 ss_btn.addEventListener(MouseEvent.CLICK,sshs);//上首按钮单击事件 sshs:上首函数 xs_btn.addEventListener(MouseEvent.CLICK,xshs); //下首按钮单击事件xshs:下首函数 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(); //初始播放 } 十、循环播放 (47讲)比如有10首歌曲,当第1首播放完,播放第2首,以此类推。当第10首播放完,播放第一首。这就叫循环播放。 先作一个循环按钮,但最好不用用按钮,用影片剪辑:插入---新建---影片剪辑---起名循环---确定。在第一帧画按钮,共3帧:弹起、经过、按下。再新建一层,起名as:stop; (48讲)将制作好的按钮(即影片剪辑)拖入场景,放合适位,实例名称:xh_mc 要循环,就有监控,紧跟着就有片断,片断就有条件。(49~53讲)下面写代码: //-----循环播放控制---------------------- xh_mc.buttonMode=true;//将鼠标变为手指头形状 addEventListener(Event.ENTER_FRAME,xhhs);//侦听事件 xh_mc.addEventListener(MouseEvent.CLICK,xhhs); //当鼠标按下循环按钮时侦听 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); //开始监听 } } 十一、单曲循环 (54讲)制作单曲循环按钮。制作方法同“制作循环按钮”。 (55讲)写单曲循环代码: //---------单曲循环-------- addEventListener(Event.ENTER_FRAME,dqhs); //dqhs:单曲函数 function dqhs(event) { if (int(bfb*100)==99) { sykz.stop(); ztwz=0; cbf(); } } 测试:第一首歌曲播放完后会自动单曲循环,这是因为没有给单曲循环按钮添加事件,所以这个单曲循环是不受控制的。下面看如何控制。 (56讲)按钮控制单曲循环: 先将前面单曲侦听事件改写为: //---------单曲循环--------- dq_mc.addEventListener(MouseEvent.CLICK,dqdjhs); //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); } } 十二、完善 (57讲)有几个问题。先解决第1个。 ① 加载问题。这首歌加载了5%,我想听其他的,但他还在继续加载。这就是动态文本显示处的问题了。在加载中函数(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即可。 测试:加载了若干,点下一首,又从头加载歌曲。Ok. 但偶尔出现“加载了NaN%”。我们依然改写jzzhs,在其中加个判断语句: 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); //当加载数值为0时,进度条停在第1帧 } } ②(58讲)第2个问题是在舞台上单击鼠标也起作用。对舞台起作用的有两个监听,在“控制条_滑块”这一块中有: stage.addEventListener(MouseEvent.MOUSE_UP,hklk);//意思为当在舞台上松开鼠标则起作用 怎么改?我们先让他不出现,即剪切掉。让他在单击了按钮之后起作用,所以把他放在hkax函数中: function hkax(event:MouseEvent) { pd=true; } 松开鼠标要删除他: function hksk(event:MouseEvent) { pd=false; } 在外部释放以后也让他删除: pd=false; function wchs(event:Event) { //trace("加载完成了"); } ④(60讲)第4个问题是当播放头不在100%的时候,拖动滑块后滑块有弹回当前位置。 把jzzhs函数function jzzhs(event:ProgressEvent) { var jzjd:Number=Math.round((sywj.bytesLoaded/event.bytesTotal)*100); ..... } 中var jzjd:Number拷贝到最前作成全局变量即:var jzjd:Number; 而在函数中用jzjd代替var jzjd:Number即: jzjd=Math.round((sywj.bytesLoaded/event.bytesTotal)*100); 在滑块按下hkax函数中加if(jzjd==100){}: function hkax(event:MouseEvent) { if(jzjd==100){ pd=true; } } 测试:未加载到100%,还可以拖动。原因是还有一个滑道没设置。所以要在滑道按下hdax函数中增加判断语句: 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(); } } 十三、完整代码: //---------声明---------------- var gqsz:Array=new Array();//歌曲数组 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;//加载进度 //------------初始化------------------ //也可以这样 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);//出错侦听 } jdt_mc.visible=false; //初始化进度条不可见 //-----------加载过程------------------ 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("出错了"); } //---------声音控制------------ 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; //暂停位置为当前位置 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);//滑块拖动范围 var zcd;//总播放 var bfb;//百分比 var pd=false;//判断 hk_mc.buttonMode=true;//将鼠标变为手指头形状 hk_mc.addEventListener(MouseEvent.MOUSE_DOWN,hkax);//当鼠标按下滑块时侦听 hk_mc.addEventListener(MouseEvent.MOUSE_UP,hksk);//当鼠标松开滑块时侦听 stage.addEventListener(Event.ENTER_FRAME,cfzx);//对舞台侦听(cfzx:重复执行) 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:重复执行; 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;//将鼠标变为手指头形状 hd_mc.addEventListener(MouseEvent.MOUSE_DOWN,hdax);//当鼠标按下滑道时侦听 hd_mc.addEventListener(MouseEvent.MOUSE_UP,hdsk);//当鼠标松开滑道时侦听 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);//当鼠标按下上首(ss)按钮时侦听 xs_btn.addEventListener(MouseEvent.CLICK,xshs);//当鼠标按下下首(xs)按钮时侦听 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(); } //-----循环播放控制---------------------- xh_mc.buttonMode=true;//将鼠标变为手指头形状 addEventListener(Event.ENTER_FRAME,xhhs);//侦听 xh_mc.addEventListener(MouseEvent.CLICK,xhhs);//当鼠标按下循环按钮时侦听 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); } } //---------单曲循环--------- dq_mc.addEventListener(MouseEvent.CLICK,dqdjhs);//单曲点击函数(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); //开始侦听 } } |
|
来自: 宜宾翠屏区 > 《ActionScprit3.0》