android 音乐频谱

http://blog.youkuaiyun.com/a79412906/article/details/18318761


  1. public class VisualizerView extends View {  
  2.                 // 取得有效数据  
  3.         int length = 512;  
  4.         // 线条数(必须为数据的1/4以下)  
  5.         int index = 128;  
  6.         // 下落速度  
  7.         int downspeed = 24;  
  8.   
  9.         private byte[] mBytes;  
  10.         private float[] mPoints;// 当前位置  
  11.         private float[] mPoints2; // 上一次位置  
  12.         private float[] upsetPoints;// 倒影  
  13.   
  14.         private Paint mForePaint = new Paint();  
  15.         private Paint upsetPaint = new Paint();// 倒影  
  16.           
  17.                 public VisualizerView(Context context){  
  18.                         super(context);  
  19.                         init();  
  20.                 }          
  21.                   
  22.                 public VisualizerView(Context context, AttributeSet attrs) {  
  23.                         super(context, attrs);  
  24.                         init();  
  25.                 }  
  26.           
  27.                 private void init() {  
  28.             LinearGradient mRadialGradient = new LinearGradient(000400,new int[] { Color.WHITE, Color.rgb(0128255) }, null,Shader.TileMode.MIRROR);  
  29.   
  30.             mBytes = null;  
  31.             mForePaint.setStrokeWidth(2f);  
  32.             mForePaint.setAntiAlias(true);  
  33.             mForePaint.setShader(mRadialGradient);  
  34.   
  35.             upsetPaint.setStrokeWidth(2f);  
  36.             upsetPaint.setAntiAlias(true);  
  37.             upsetPaint.setShader(mRadialGradient);  
  38.             upsetPaint.setAlpha(150);  
  39.                 }  
  40.                   
  41.                  public void updateVisualizer(byte[] bytes) {  
  42.              mBytes = bytes;  
  43.              invalidate();  
  44.                  }  
  45.                    
  46.                  @Override  
  47.                 protected void onDraw(Canvas canvas) {  
  48.                         super.onDraw(canvas);  
  49.                         if (mBytes == null || mBytes.length < 3) {  
  50.                                 return;  
  51.                         }  
  52.   
  53.                         byte[] model1 = new byte[length / 2 + 1];  
  54.                         model1[0] = (byte) Math.abs(mBytes[1]);  
  55.   
  56.                         int j = 1;  
  57.                         for (int i = 2; i < length/4;) {  
  58.                                 model1[j] = (byte) Math.hypot(mBytes[i], mBytes[i + 1]);  
  59.                                 i += 2;  
  60.                                 j++;  
  61.                         }  
  62.   
  63.                         byte[] model = new byte[length / 2 + 1];  
  64.                         model[0] = (byte) Math.abs(model1[1]);  
  65.                         j = 1;  
  66.                         for (int i = 2; i < length / 2;) {  
  67.                                 model[j] = (byte) Math.max(model1[i], model1[i + 1]);  
  68.                                 if (j > 0) {  
  69.                                         model[j] = (byte) ((model[j] + model[j - 1]) / 2);  
  70.                                 }  
  71.                                 i += 2;  
  72.                                 j++;  
  73.                         }  
  74.                           
  75.                         // 需要画出线条的坐标系  
  76.                         if (mPoints == null || mPoints.length < index * 4) {  
  77.                                 mPoints = new float[index * 4];  
  78.                                 upsetPoints = new float[index * 4];  
  79.                                 mPoints2 = new float[index * 4];  
  80.                         }  
  81.                         for (int i = 0; i < index; i++) {  
  82.                                 if (model[i] < 0) {  
  83.                                         model[i] = 127;  
  84.                                 }  
  85.                                 if (model[i] > 127) {  
  86.                                         model[i] = 127;  
  87.                                 }  
  88.                                 float zoom = (float) (14.5 * i / index + 2.5);  
  89.                                 if (model[i] < 5) {  
  90.                                         zoom = 4;  
  91.                                 }  
  92.   
  93.                                 mPoints[i * 4] = getWidth() * i / index;  
  94.                                 mPoints[i * 4 + 1] = getHeight() / 3 * 2;  
  95.                                 mPoints[i * 4 + 2] = getWidth() * i / index;  
  96.                                 mPoints[i * 4 + 3] = 1 + getHeight() / 3 * 2 - model[i] * zoom;  
  97.   
  98.                                 upsetPoints[i * 4] = mPoints[i * 4];  
  99.                                 upsetPoints[i * 4 + 1] = mPoints[i * 4 + 1] + 4;  
  100.                                 upsetPoints[i * 4 + 2] = mPoints[i * 4 + 2];  
  101.                                 upsetPoints[i * 4 + 3] = mPoints[i * 4 + 3] + model[i] * zoom * 3  
  102.                                                 / 2;  
  103.   
  104.                                 mPoints2[i * 4] = mPoints[i * 4];  
  105.                                 mPoints2[i * 4 + 1] = mPoints[i * 4];  
  106.                                 mPoints2[i * 4 + 2] = mPoints[i * 4];  
  107.                                 if (mPoints2[i * 4 + 3] > 0 && mPoints[i * 4 + 3] > mPoints2[i * 4 + 3] + downspeed) {  
  108.                                         mPoints[i * 4 + 3] = mPoints2[i * 4 + 3] + downspeed;  
  109.                                         upsetPoints[i * 4 + 3] = (getHeight() * 2 - mPoints[i * 4 + 3]) / 2 - downspeed / 2;  
  110.                                 }  
  111.                                 mPoints2[i * 4 + 3] = mPoints[i * 4 + 3];  
  112.                         }  
  113.                         canvas.drawLines(mPoints, mForePaint);  
  114.                         canvas.drawLines(upsetPoints, upsetPaint);  
  115.                 }  
  116.         }  

  1. public class VisualizerView extends View {  
  2.                 // 取得有效数据  
  3.         int length = 512;  
  4.         // 线条数(必须为数据的1/4以下)  
  5.         int index = 128;  
  6.         // 下落速度  
  7.         int downspeed = 24;  
  8.   
  9.         private byte[] mBytes;  
  10.         private float[] mPoints;// 当前位置  
  11.         private float[] mPoints2; // 上一次位置  
  12.         private float[] upsetPoints;// 倒影  
  13.   
  14.         private Paint mForePaint = new Paint();  
  15.         private Paint upsetPaint = new Paint();// 倒影  
  16.           
  17.                 public VisualizerView(Context context){  
  18.                         super(context);  
  19.                         init();  
  20.                 }          
  21.                   
  22.                 public VisualizerView(Context context, AttributeSet attrs) {  
  23.                         super(context, attrs);  
  24.                         init();  
  25.                 }  
  26.           
  27.                 private void init() {  
  28.             LinearGradient mRadialGradient = new LinearGradient(000400,new int[] { Color.WHITE, Color.rgb(0128255) }, null,Shader.TileMode.MIRROR);  
  29.   
  30.             mBytes = null;  
  31.             mForePaint.setStrokeWidth(2f);  
  32.             mForePaint.setAntiAlias(true);  
  33.             mForePaint.setShader(mRadialGradient);  
  34.   
  35.             upsetPaint.setStrokeWidth(2f);  
  36.             upsetPaint.setAntiAlias(true);  
  37.             upsetPaint.setShader(mRadialGradient);  
  38.             upsetPaint.setAlpha(150);  
  39.                 }  
  40.                   
  41.                  public void updateVisualizer(byte[] bytes) {  
  42.              mBytes = bytes;  
  43.              invalidate();  
  44.                  }  
  45.                    
  46.                  @Override  
  47.                 protected void onDraw(Canvas canvas) {  
  48.                         super.onDraw(canvas);  
  49.                         if (mBytes == null || mBytes.length < 3) {  
  50.                                 return;  
  51.                         }  
  52.   
  53.                         byte[] model1 = new byte[length / 2 + 1];  
  54.                         model1[0] = (byte) Math.abs(mBytes[1]);  
  55.   
  56.                         int j = 1;  
  57.                         for (int i = 2; i < length/4;) {  
  58.                                 model1[j] = (byte) Math.hypot(mBytes[i], mBytes[i + 1]);  
  59.                                 i += 2;  
  60.                                 j++;  
  61.                         }  
  62.   
  63.                         byte[] model = new byte[length / 2 + 1];  
  64.                         model[0] = (byte) Math.abs(model1[1]);  
  65.                         j = 1;  
  66.                         for (int i = 2; i < length / 2;) {  
  67.                                 model[j] = (byte) Math.max(model1[i], model1[i + 1]);  
  68.                                 if (j > 0) {  
  69.                                         model[j] = (byte) ((model[j] + model[j - 1]) / 2);  
  70.                                 }  
  71.                                 i += 2;  
  72.                                 j++;  
  73.                         }  
  74.                           
  75.                         // 需要画出线条的坐标系  
  76.                         if (mPoints == null || mPoints.length < index * 4) {  
  77.                                 mPoints = new float[index * 4];  
  78.                                 upsetPoints = new float[index * 4];  
  79.                                 mPoints2 = new float[index * 4];  
  80.                         }  
  81.                         for (int i = 0; i < index; i++) {  
  82.                                 if (model[i] < 0) {  
  83.                                         model[i] = 127;  
  84.                                 }  
  85.                                 if (model[i] > 127) {  
  86.                                         model[i] = 127;  
  87.                                 }  
  88.                                 float zoom = (float) (14.5 * i / index + 2.5);  
  89.                                 if (model[i] < 5) {  
  90.                                         zoom = 4;  
  91.                                 }  
  92.   
  93.                                 mPoints[i * 4] = getWidth() * i / index;  
  94.                                 mPoints[i * 4 + 1] = getHeight() / 3 * 2;  
  95.                                 mPoints[i * 4 + 2] = getWidth() * i / index;  
  96.                                 mPoints[i * 4 + 3] = 1 + getHeight() / 3 * 2 - model[i] * zoom;  
  97.   
  98.                                 upsetPoints[i * 4] = mPoints[i * 4];  
  99.                                 upsetPoints[i * 4 + 1] = mPoints[i * 4 + 1] + 4;  
  100.                                 upsetPoints[i * 4 + 2] = mPoints[i * 4 + 2];  
  101.                                 upsetPoints[i * 4 + 3] = mPoints[i * 4 + 3] + model[i] * zoom * 3  
  102.                                                 / 2;  
  103.   
  104.                                 mPoints2[i * 4] = mPoints[i * 4];  
  105.                                 mPoints2[i * 4 + 1] = mPoints[i * 4];  
  106.                                 mPoints2[i * 4 + 2] = mPoints[i * 4];  
  107.                                 if (mPoints2[i * 4 + 3] > 0 && mPoints[i * 4 + 3] > mPoints2[i * 4 + 3] + downspeed) {  
  108.                                         mPoints[i * 4 + 3] = mPoints2[i * 4 + 3] + downspeed;  
  109.                                         upsetPoints[i * 4 + 3] = (getHeight() * 2 - mPoints[i * 4 + 3]) / 2 - downspeed / 2;  
  110.                                 }  
  111.                                 mPoints2[i * 4 + 3] = mPoints[i * 4 + 3];  
  112.                         }  
  113.                         canvas.drawLines(mPoints, mForePaint);  
  114.                         canvas.drawLines(upsetPoints, upsetPaint);  
  115.                 }  
  116.         }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值