AS3.0频谱系列-01:

package fengzi.spectrum
{
	//import fengzi.colors.GetColor;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.TimerEvent;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.media.SoundMixer;
	import flash.utils.ByteArray;
	import flash.utils.Timer;
	import flash.geom.Matrix;
	import flash.display.BitmapData;
	import flash.display.Bitmap;
	import flash.geom.ColorTransform;
	import flash.filters.BlurFilter;
	import flash.filters.DisplacementMapFilter;

	public class Spectrum_01 extends Sprite
	{
		private var _sprite:Sprite;
		private var timer:Timer;
		private var thisW:Number;
		private var thisH:Number;

		private var byteArray:ByteArray;

		var sDis:Number = 30;
		var lDis:Number = 100;
		var maxDis:Number;
		var bitmapData:BitmapData;
		private var bitmap:Bitmap;
		var colorTF:ColorTransform = new ColorTransform(0.90,1,1,0.90);
		var numArr:Array = [];
		private var onBg:Boolean;
		private var color:uint;

		/**
		 * Spectrum_01   构造函数(实例)
		 * @param        width           宽
		 * @param        height          高
		 * @param        _color          颜色 
		 * @param        onBg            黑色背景的布尔值(默认false黑色背景,true透明)
		 */
		public function Spectrum_01(width:Number=550,height:Number=400,_color:uint=0xFF00FF,_onBg:Boolean=false)
		{
			thisW = width;
			thisH = height;
			color = _color;
			onBg = _onBg;
			maxDis = height / 4;
			byteArray = new ByteArray  ;
			_sprite = new Sprite  ;
			for (var i:int = 0; i < 256; ++i)
			{
				numArr[i] = 0;
			}

			bitmapData = new BitmapData(thisW,thisH,onBg,0);
			bitmap = addChild(new Bitmap(bitmapData)) as Bitmap;
			addChild(_sprite);

			timer = new Timer(30);
			timer.addEventListener(TimerEvent.TIMER,timerHandler);
			timer.start();

		}



		/**
		 * onStageReSize()
		 * Event.RESIZE时调用此方法,频谱随舞台缩放
		 */
		public function onStageReSize():void
		{
			thisW = stage.stageWidth;
			thisH = stage.stageHeight;
			maxDis = height / 4;
			if (bitmapData)
			{
				bitmapData.dispose();
			}
			bitmapData = new BitmapData(thisW,thisH,onBg,0);

			bitmap = addChild(new Bitmap(bitmapData)) as Bitmap;
		}


		private function timerHandler(event:TimerEvent):void
		{
			var aPower:Number = 3;
			var num:Number;

			SoundMixer.computeSpectrum(byteArray,false);

			aPower /=  2;
			_sprite.graphics.clear();
			_sprite.graphics.lineStyle(1,color);
			for (var i:int = 0; i < 128; i++)
			{
				num = Math.abs(byteArray.readFloat() + 0.1);
				numArr[i] +=  ((num - numArr[i]) * 0.25);
				num = numArr[i];
				_sprite.graphics.drawCircle(((thisW / 2) + Math.sin(((((i * 360) / 128) * Math.PI) / 180)) * (sDis + num * maxDis)),thisH / 2 + Math.cos(((((i * 360) / 128) * Math.PI) / 180)) * (sDis + num * maxDis),num * 20);


			}

			_sprite.graphics.beginFill(0xFF33FF,1);
			for (i = 0; i < 128; ++i)
			{
				num = Math.abs(byteArray.readFloat() + 0.1);
				numArr[i] +=  ((num - numArr[i]) * 0.25);
				_sprite.graphics.drawCircle(((thisW / 2) + Math.sin(((((i * 360) / 128) * Math.PI) / 180)) * (lDis + num * maxDis)),thisH / 2 + Math.cos(((((i * 360) / 128) * Math.PI) / 180)) * (lDis + num * maxDis),num * num * 10);
			}
			bitmapData.draw(_sprite);
			//bitmapData.fillRect( new Rectangle( 0,0, bitmapData.width, 1 ), 0 );
			//bitmapData.fillRect( new Rectangle( 0,0, 1, bitmapData.height ), 0 );
			//bitmapData.scroll( aPower *0, aPower *0);
			bitmapData.colorTransform(bitmapData.rect,colorTF);
			bitmapData.applyFilter(bitmapData,bitmapData.rect,new Point  ,new BlurFilter(2,2));
			bitmapData.applyFilter(bitmapData,bitmapData.rect,new Point  ,new DisplacementMapFilter(bitmapData,new Point  ,1,2,5,5,"clamp"));
		}

	}
}

  

posted on 2019-05-24 22:35  疯子_wu  阅读(272)  评论(0编辑  收藏  举报