android 音乐频谱

public class VisualizerView extends View {
                // 取得有效数据
        int length = 512;
        // 线条数(必须为数据的1/4以下)
        int index = 128;
        // 下落速度
        int downspeed = 24;

        private byte[] mBytes;
        private float[] mPoints;// 当前位置
        private float[] mPoints2; // 上一次位置
        private float[] upsetPoints;// 倒影

        private Paint mForePaint = new Paint();
        private Paint upsetPaint = new Paint();// 倒影
        
                public VisualizerView(Context context){
                        super(context);
                        init();
                }        
                
                public VisualizerView(Context context, AttributeSet attrs) {
                        super(context, attrs);
                        init();
                }
        
                private void init() {
            LinearGradient mRadialGradient = new LinearGradient(0, 0, 0, 400,new int[] { Color.WHITE, Color.rgb(0, 128, 255) }, null,Shader.TileMode.MIRROR);

            mBytes = null;
            mForePaint.setStrokeWidth(2f);
            mForePaint.setAntiAlias(true);
            mForePaint.setShader(mRadialGradient);

            upsetPaint.setStrokeWidth(2f);
            upsetPaint.setAntiAlias(true);
            upsetPaint.setShader(mRadialGradient);
            upsetPaint.setAlpha(150);
                }
                
                 public void updateVisualizer(byte[] bytes) {
             mBytes = bytes;
             invalidate();
                 }
                 
                 @Override
                protected void onDraw(Canvas canvas) {
                        super.onDraw(canvas);
                        if (mBytes == null || mBytes.length < 3) {
                                return;
                        }

                        byte[] model1 = new byte[length / 2 + 1];
                        model1[0] = (byte) Math.abs(mBytes[1]);

                        int j = 1;
                        for (int i = 2; i < length/4;) {
                                model1[j] = (byte) Math.hypot(mBytes[i], mBytes[i + 1]);
                                i += 2;
                                j++;
                        }

                        byte[] model = new byte[length / 2 + 1];
                        model[0] = (byte) Math.abs(model1[1]);
                        j = 1;
                        for (int i = 2; i < length / 2;) {
                                model[j] = (byte) Math.max(model1[i], model1[i + 1]);
                                if (j > 0) {
                                        model[j] = (byte) ((model[j] + model[j - 1]) / 2);
                                }
                                i += 2;
                                j++;
                        }
                        
                        // 需要画出线条的坐标系
                        if (mPoints == null || mPoints.length < index * 4) {
                                mPoints = new float[index * 4];
                                upsetPoints = new float[index * 4];
                                mPoints2 = new float[index * 4];
                        }
                        for (int i = 0; i < index; i++) {
                                if (model[i] < 0) {
                                        model[i] = 127;
                                }
                                if (model[i] > 127) {
                                        model[i] = 127;
                                }
                                float zoom = (float) (14.5 * i / index + 2.5);
                                if (model[i] < 5) {
                                        zoom = 4;
                                }

                                mPoints[i * 4] = getWidth() * i / index;
                                mPoints[i * 4 + 1] = getHeight() / 3 * 2;
                                mPoints[i * 4 + 2] = getWidth() * i / index;
                                mPoints[i * 4 + 3] = 1 + getHeight() / 3 * 2 - model[i] * zoom;

                                upsetPoints[i * 4] = mPoints[i * 4];
                                upsetPoints[i * 4 + 1] = mPoints[i * 4 + 1] + 4;
                                upsetPoints[i * 4 + 2] = mPoints[i * 4 + 2];
                                upsetPoints[i * 4 + 3] = mPoints[i * 4 + 3] + model[i] * zoom * 3
                                                / 2;

                                mPoints2[i * 4] = mPoints[i * 4];
                                mPoints2[i * 4 + 1] = mPoints[i * 4];
                                mPoints2[i * 4 + 2] = mPoints[i * 4];
                                if (mPoints2[i * 4 + 3] > 0 && mPoints[i * 4 + 3] > mPoints2[i * 4 + 3] + downspeed) {
                                        mPoints[i * 4 + 3] = mPoints2[i * 4 + 3] + downspeed;
                                        upsetPoints[i * 4 + 3] = (getHeight() * 2 - mPoints[i * 4 + 3]) / 2 - downspeed / 2;
                                }
                                mPoints2[i * 4 + 3] = mPoints[i * 4 + 3];
                        }
                        canvas.drawLines(mPoints, mForePaint);
                        canvas.drawLines(upsetPoints, upsetPaint);
                }
        }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值