音乐播放器(用到了音乐相关类和xml)

//我都加了非常详细的注释
package {
import flash.display.MovieClip;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.events.MouseEvent;
import flash.net.URLRequest;
import flash.media.SoundTransform;
import flash.display.Sprite;
import flash.events.ProgressEvent;
import flash.events.Event;
import flash.net.URLLoader;
import flash.media.SoundMixer;
import flash.utils.ByteArray;
public class Music extends MovieClip {
private var sound:Sound=new Sound();
private var dangQian:Number=0;//当前的播放进度
private var channel:SoundChannel=new SoundChannel();//控制和处理声音
private var soundtransform:SoundTransform=new SoundTransform();//改变声音的大小和平移
private var yinLiang:Number=0.5;//定义一个声音的中间值
private var sprite1:Sprite=new Sprite();//画两个用作播放进度的矩形条
private var sprite2:Sprite=new Sprite();
private var sprite3:Sprite=new Sprite();//画圆用作快进的按钮;
private var url:URLRequest;
private var musicXuHao:uint=0;//定义一个变量用来表示歌曲名字在xml中的序号
private var loader:URLLoader=new URLLoader;
private var Xml:XML = new XML;
private var xunhuan:Number;
//----------------------------------------------------
private var sprite4:Sprite=new Sprite();
private var barray:ByteArray=new ByteArray();//定义字节数组,记录数据
private var n:Number=0;//记录数量
//----------------------------------------------------
public function Music() {
init();
myPlay.addEventListener(MouseEvent.CLICK,onMyPlayClickHandler);//播放按钮
myStop.addEventListener(MouseEvent.CLICK,onMyStopClickHandler);//暂停按钮
SubtractSound.addEventListener(MouseEvent.CLICK,onSubtractSoundClickHandler);//减声音的按钮事件
addSound.addEventListener(MouseEvent.CLICK,onaddSoundClickHandler);//加声音的按钮事件
sound.addEventListener(ProgressEvent.PROGRESS,onProgressEventHandler);//加载声音时调度
stage.addEventListener(Event.ENTER_FRAME,onEnterFrameHandler);
sprite3.addEventListener(MouseEvent.MOUSE_OVER,onSprite3MouseOverHandler);
sprite3.addEventListener(MouseEvent.MOUSE_OUT,onSprite3MouseOutHandler);
XiaZai.addEventListener(MouseEvent.CLICK,onXiaZaiClickHandler);//链接百度下载歌曲
}
private function init():void
{
myPlay.buttonMode=true;//指针为手型
myStop.buttonMode=true;
SubtractSound.buttonMode=true;
addSound.buttonMode=true;
XiaZai.buttonMode=true;
Previous.buttonMode=true;
Next.buttonMode=true;
name_txt.selectable=false;//歌曲名字的文本不可选
loader.load(new URLRequest("musicXml.xml"));
loader.addEventListener(Event.COMPLETE,onURLRequestHnalder);//加载xml
sprite1.graphics.beginFill(0x000000,0.5);
sprite1.graphics.drawRect(0,0,192,1);
sprite1.graphics.endFill();
sprite1.x=17;
sprite1.y=235;
sprite1.scaleX=0;//缩放为零(不可见)
stage.addChild(sprite1);
sprite2.graphics.beginFill(0x00ff00,1);
sprite2.graphics.drawRect(0,0,192,3);
sprite2.graphics.endFill();
sprite2.x=17;
sprite2.y=234;
sprite2.scaleX=0;
stage.addChild(sprite2);
sprite3.graphics.beginFill(0xffffff,1);
sprite3.graphics.drawCircle(0,0,3);
sprite3.graphics.endFill();
sprite3.x=19;
sprite3.y=235;
stage.addChild(sprite3);
soundtransform.volume=yinLiang;//用来控制声音的大小
channel.soundTransform=soundtransform;//用来改变声音大小和平移的类
}
private function onURLRequestHnalder(e:Event):void
{
Xml=new XML(loader.data);
url=new URLRequest(Xml.music[musicXuHao]);//用xml来调用歌名
sound.load(url);
name_txt.text=Xml.music[musicXuHao];//让歌曲名字的文本显示为当前播放的歌曲名
}
private function onMyPlayClickHandler(e:MouseEvent):void
{
myPlay.gotoAndStop(2);//按钮跳到第二帧
channel=sound.play(dangQian);//开始播放
myPlay.visible=false;//不可见
myStop.visible=true;
Previous.addEventListener(MouseEvent.CLICK,onPreviousClickHandler);//上一曲按钮
Next.addEventListener(MouseEvent.CLICK,onNextClickHandler);//下一曲按钮
}
private function onMyStopClickHandler(e:MouseEvent):void
{
myStop.gotoAndStop(2);
dangQian=channel.position;//当前的进度
channel.stop();
myStop.visible=false;
myPlay.visible=true;
Previous.removeEventListener(MouseEvent.CLICK,onPreviousClickHandler);//暂停时上一曲按钮不可用
Next.removeEventListener(MouseEvent.CLICK,onNextClickHandler);//暂停时下一曲按钮不可用
}
private function onSubtractSoundClickHandler(e:MouseEvent):void
{
SubtractSound.gotoAndStop(2);
if(yinLiang<10 && yinLiang>0)
{
yinLiang-=0.1;
soundtransform.volume=yinLiang;//音量
channel.soundTransform=soundtransform;
}
}
private function onaddSoundClickHandler(e:MouseEvent):void
{
addSound.gotoAndStop(2);
if(yinLiang<10 && yinLiang>0)
{
yinLiang+=0.1;
}
soundtransform.volume=yinLiang;
channel.soundTransform=soundtransform;
}
private function onProgressEventHandler(e:ProgressEvent):void
{
sprite1.scaleX=e.bytesLoaded/e.bytesTotal;//可用数据与总数据的比值确定进度条的长度
}
private function onEnterFrameHandler(e:Event):void
{
sprite3.x=19+channel.position/sound.length* 192;//实现歌曲当前的进度与小球的坐标同步,192是进度条的宽度;
sprite2.scaleX= channel.position/sound.length;//当前的进度与总长度的比值
//--------------------------------------------------------------
xunhuan=channel.position/sound.length * 100;//实现自动播放下一曲
if(xunhuan>99)
{
musicXuHao++;
dangQian=0; //当前播放位置
channel.stop();
sound = new Sound();
sound.load(new URLRequest(Xml.music[musicXuHao]));
name_txt.text=Xml.music[musicXuHao];//让歌曲名字的文本显示为当前播放的歌曲名
channel=sound.play();
}
//-------------------------------------------------------------
n=0;
sprite4.graphics.clear();//在舞台绘制,清空舞台绘制内容(因为音频频谱是随着时间的改变而不断变化的)
SoundMixer.computeSpectrum(barray,true,0);//把音频数据化.computeSpectrum(字节数组,模式,伸展因子)
for(var i=0;i<900;i+=19)//600是音波的宽度
{
n=barray.readFloat();//把字节数组转化为32位单精度浮点数
var num:Number= n * 220;//把字节数组放大(更改音波的高度)
sprite4.graphics.lineStyle(2,0x00ffff,1);//笔触 颜色 透明度Math.random() * 0xffffff + 0x000000
//绘制图形的公式
sprite4.graphics.moveTo(38+i/6,210);//210的参数用来更改y坐标,38用来更改x的坐标,6代表线与线之间的距离
sprite4.graphics.lineTo(38+i/6,210-num/2);
stage.addChild(sprite4);
}
//------------------------------------------------------------
}
private function onPreviousClickHandler(e:MouseEvent):void
{
Previous.gotoAndStop(2);
if(musicXuHao>0 && musicXuHao<=5)//共六首歌
{
musicXuHao--;
}
else
{
musicXuHao=5;//上一曲到了第一曲后再点击上一曲则从最后一曲开始
}
dangQian=0; //当前播放位置
channel.stop();
sound = new Sound();
sound.load(new URLRequest(Xml.music[musicXuHao]));
name_txt.text=Xml.music[musicXuHao];//让歌曲名字的文本显示为当前播放的歌曲名
channel=sound.play();
backGround.gotoAndStop(musicXuHao+1);//背景图片
}
function onNextClickHandler(e:MouseEvent):void
{
Next.gotoAndStop(2);
if(musicXuHao>=0 && musicXuHao<5)
{
musicXuHao++;
}
else
{
musicXuHao=0;//下一曲到了最后一曲后再点击下一曲则从第一曲开始
}
dangQian=0; //当前播放位置
channel.stop();
sound = new Sound();
sound.load(new URLRequest(Xml.music[musicXuHao]));
name_txt.text=Xml.music[musicXuHao];//让歌曲名字的文本显示为当前播放的歌曲名
channel=sound.play();
backGround.gotoAndStop(musicXuHao+1);//背景图片
}
private function onSprite3MouseOverHandler(e:MouseEvent):void
{
sprite3.scaleX=1.5;
sprite3.scaleY=1.5;
sprite3.addEventListener(MouseEvent.MOUSE_DOWN,onSprite3DownHandler);
}
private function onSprite3MouseOutHandler(e:MouseEvent):void
{
sprite3.scaleX=1;
sprite3.scaleY=1;
}
private function onSprite3DownHandler(e:MouseEvent):void//点击一次快进一段!
{
dangQian+=(192 * sprite2.scaleX+192)* sound.length/10000;//每单击实现加一个向前的字段
channel.stop();
channel=sound.play(dangQian);
}
private function onXiaZaiClickHandler(e:MouseEvent):void
{
XiaZai.gotoAndStop(2);
xiaZai_txt.gotoAndPlay(2);
}
}
}
浙公网安备 33010602011771号