分享

as3 声音的控制

 宜宾翠屏区 2019-02-25

一、加载库中声音

导入声音到库---右键---链接---勾选“为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);

}

//-------------从“三、加载远程声音”到“八、播放条”完整代码:--------------------------

//---------声明----------------
var dizhi:URLRequest=new URLRequest("http://www./xszy/bjfc/200306wwj/music/myq.mp3");
var shengyin:Sound=new Sound();
var liu:SoundLoaderContext=new SoundLoaderContext(10000,true);
var sykz:SoundChannel=new SoundChannel();
var ztwz:Number;
//------------初始化------------------
hk_mc.buttonMode=true;//将鼠标变为手指头形状
jdt_mc.visible=false;
shengyin.load(dizhi,liu);
sykz=shengyin.play();
//-----------加载过程------------------
shengyin.addEventListener(Event.OPEN,kshs);
shengyin.addEventListener(ProgressEvent.PROGRESS,jzzhs);
shengyin.addEventListener(Event.COMPLETE,wchs);
shengyin.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+"%";
//trace(Math.round((event.bytesLoaded/event.bytesTotal)*100));
//trace(((event.bytesLoaded/event.bytesTotal)*100));
jdt_mc.gotoAndStop(jzjd);
}
function wchs(event:Event) {
//trace("加载完成了");
jdt_mc.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=shengyin.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.addEventListener(MouseEvent.MOUSE_DOWN,hkax);
hk_mc.addEventListener(MouseEvent.MOUSE_UP,hksk);
stage.addEventListener(MouseEvent.MOUSE_UP,hklk);
stage.addEventListener(Event.ENTER_FRAME,cfzx);
function hkax(event:MouseEvent) {
pd=true;
hk_mc.startDrag(false,fk);
sykz.stop();
}
function hksk(event:MouseEvent) {
pd=false;
hk_mc.stopDrag();
sykz=shengyin.play(ztwz);
}
function hklk(event:MouseEvent) {
pd=false;
hk_mc.stopDrag();
sykz.stop();
sykz=shengyin.play(ztwz);
}
function cfzx(event:Event) {
//trace(123);
zcd=shengyin.length/(shengyin.bytesLoaded/shengyin.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) {
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);
}
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) {
stage.addEventListener(MouseEvent.MOUSE_UP,hklk);

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=shengyin.play(ztwz);

}

在外部释放以后也让他删除:
function hklk(event:MouseEvent) {
stage.removeEventListener(MouseEvent.MOUSE_UP,hklk);

pd=false;
hk_mc.stopDrag();
sykz.stop();
sykz=shengyin.play(ztwz);
}
③(59讲)第3个问题是加载进度条有时候正加载就消失了。在wchs中加个卸载:

function wchs(event:Event) {
sywj.removeEventListener(Event.COMPLETE,wchs);

//trace("加载完成了");
jdt_mc.visible=false;

}

④(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) {
stage.addEventListener(MouseEvent.MOUSE_UP,hklk);

if(jzjd==100){

pd=true;
hk_mc.startDrag(false,fk);

}
sykz.stop();

}

测试:未加载到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); //开始侦听

}

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多