在做flash站点的时候,通常会有背景音乐。这个时候难免要做背景音乐跳动符。与其用动画做,还不如利用media下的SoundMixer。
效果(点击跳动符,会暂停和播放音乐):
波形的绘制在 MusicNotation.as 中,构造器函数中,先设定单个矩形图的颜色,透明度,宽,高,间隔。MusicNotation继承Sprite,MusicNotation的坐标x,y为绘制矩形图的视觉左边以及底部。所有code如下:
package com.vini123 { import com.vini123.player.Player; import com.vini123.player.SoundPlayer; import com.vini123.utils.MusicNotation; import flash.display.Sprite; import flash.events.MouseEvent; import flash.system.Capabilities; import flash.net.URLRequest; import flash.net.navigateToURL; import flash.external.ExternalInterface; public class Main extends Sprite { private var _soundPlayer:SoundPlayer; private var _musicNotation:MusicNotation; public function Main():void { _soundPlayer = new SoundPlayer(); _soundPlayer.url = "mengyan.mp3"; _soundPlayer.Load(); _musicNotation = new MusicNotation(0x0,1,2,10,6,2);// 颜色,透明度, 宽, 高 ,柱数,柱间隔 addChild(_musicNotation); _musicNotation.x = 50; _musicNotation.y = 30; _musicNotation.Start(); var button:Sprite = new Sprite(); addChild(button); button.graphics.beginFill(0x00ffff ,0); button.graphics.drawRect(0,0,stage.stageWidth , stage.stageHeight); button.graphics.endFill(); button.buttonMode = true; button.addEventListener(MouseEvent.MOUSE_DOWN , mouseDownHandler); } private function mouseDownHandler(e:MouseEvent):void { if (mouseX < _musicNotation.x + 30) { if (_soundPlayer.playerState == Player.PAUSE) { _soundPlayer.Resume(); _musicNotation.Start(); } else if (_soundPlayer.playerState == Player.PLAY) { _soundPlayer.Pause(); _musicNotation.Stop(); } } else { toUrl("http://www.1314175.com"); } } private function toUrl(url:String):void { if (Capabilities.playerType == "ActiveX") { ExternalInterface.call("window.open",url); } else { navigateToURL(new URLRequest(url),"_blank"); } } } }
package com.vini123.player { import flash.events.EventDispatcher; public class Player extends EventDispatcher { private var _url:String; protected var state:String; protected var position:Number; protected var length:Number; public static const INIT:String = "init"; public static const PLAY:String = "play"; public static const PAUSE:String = "pause"; public function Player():void { } public function Load():void { } public function Pause():void { } public function Resume():void { } public function Stop():void { } public function Dispose():void { } public function set url(value:String):void { _url = value; } public function get url():String { return _url; } public function get playerState():String { return state; } } }
package com.vini123.player { import flash.media.Sound; import flash.media.SoundChannel; import flash.net.URLRequest; import flash.media.SoundLoaderContext; import flash.events.ProgressEvent; import flash.events.Event; public class SoundPlayer extends Player { private var _sound:Sound; private var _soundChannel:SoundChannel; private var _urlRequest:URLRequest; public function SoundPlayer():void { state = Player.INIT; } public override function Load():void { Dispose(); _sound = new Sound(); _urlRequest = new URLRequest(url); _sound.load(_urlRequest,new SoundLoaderContext(5000)); _soundChannel = _sound.play(); _soundChannel.addEventListener(Event.SOUND_COMPLETE , soundCompleteHandler); state = Player.PLAY; } private function soundCompleteHandler():void { _soundChannel.removeEventListener(Event.SOUND_COMPLETE , soundCompleteHandler); Load(); } public override function Pause():void { position = _soundChannel.position; _soundChannel.stop(); _soundChannel.removeEventListener(Event.SOUND_COMPLETE , soundCompleteHandler); _soundChannel = null; state = Player.PAUSE; } public override function Resume():void { _soundChannel = _sound.play(position); _soundChannel.addEventListener(Event.SOUND_COMPLETE , soundCompleteHandler); state = Player.PLAY; } public override function Dispose():void { if (_sound) { _sound = null; } if (_urlRequest) { _urlRequest = null; } } } }
package com.vini123.utils { import flash.display.Sprite; import flash.events.Event; import flash.utils.ByteArray; import flash.media.SoundMixer; public class MusicNotation extends Sprite { private var data:ByteArray; private var _rects:Vector.<Sprite> = new Vector.<Sprite>(); private var _rectColor:uint = 0; private var _rectAlpha:Number = 1; private var _rectWidth:Number = 0; private var _rectHeight:Number = 0; private var _rectNumber:int = 0; private var _rectGap:Number = 0; /** * rectColor 柱形颜色 * rectAlpha 柱形透明度 * rectWidth 单个柱形宽度 * rectHeight 单个柱形高度 * rectNumber 柱形的个数 * gap 柱形之间的间距 */ public function MusicNotation(rectColor:uint = 0x00ff00 , rectAlpha:Number = 1 , rectWidth:Number = 10,rectHeight:Number =50 ,rectNumber:int = 10,gap:Number=5):void { _rectColor = rectColor; _rectAlpha = rectAlpha; _rectWidth = rectWidth; _rectHeight = rectHeight; _rectNumber = rectNumber; _rectGap = gap; for (var i:int = 0; i < _rectNumber; i++) { var sp:Sprite = Rect(_rectColor); sp.alpha = _rectAlpha; sp.width = _rectWidth; sp.x = i * (_rectWidth + _rectGap); sp.y = 0; addChild(sp); _rects.push(sp); } data = new ByteArray ; } private function Rect(color:uint):Sprite { var sp:Sprite = new Sprite ; sp.graphics.beginFill(color); sp.graphics.drawRect(0,-2,10,2); sp.graphics.endFill(); return sp; } public function Start():void { addEventListener(Event.ENTER_FRAME,enterHandler); } public function Stop():void { removeEventListener(Event.ENTER_FRAME,enterHandler); } private function enterHandler(e:Event):void { SoundMixer.computeSpectrum(data,true,0); draw(data); } private function draw(data:ByteArray):void { for (var i:int = 0; i < _rectNumber; i++) { _rects[i].height = data.readFloat() * _rectHeight * 2; } } } }