在做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;
            }
        }
    }
}