音乐播放器(用到了音乐相关类和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);
  }
 }
 
}

posted on 2012-10-23 22:10  笔墨丹青  阅读(1336)  评论(0)    收藏  举报

导航