3

我正在研究音频 vu 表,我想得到如下图所示的内容,并实时显示音频幅度。

我知道如何获取每个通道的音频幅度,但我不确定如何足够快地显示彩色矩形。

我的第一个想法是View为每个矩形设置一个背景颜色,并根据幅度显示/隐藏它。

有人已经试过了吗?每 50 或 100 毫秒显示一次幅度是否足够快?

实现这一目标的最快方法是什么?

谢谢

在此处输入图像描述

4

1 回答 1

2

因此,您想制作与矩形一样多的视图并更改它们的可见性?不要那样做。你的布局里面会一团糟。而是制作一个自定义视图并覆盖 onDraw()。在 onDraw 中,您使用 canvas.drawRect() 来绘制矩形。通过这种方式,您将轻松获得每秒 30-60 帧的速度。这是一个简单且不完整的示例,但应该让您走上正轨。

private class AmplitudeView extends View {

    private int mWidth;
    private int mHeight;
    private Paint mRectPaint;

    public AmplitudeView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mRectPaint = new Paint() {
            {
                setStyle(Style.FILL);
            }
        };
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mWidth = w;
        mHeight = h;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int numRects = 10;
        int red = 255;
        int green = 0;
        int incr = 255/numRects;
        for (int i = 0; i< numRects;i++){
            //TODO calculate color based on amplitude
            mRectPaint.setColor(Color.argb(0xff, red, green, 0));
            //TODO calculate rectangle
            canvas.drawRect(r, mRectPaint);
            red-=incr;
            green+=incr;
        }
    }
}
于 2012-05-08T12:17:19.300 回答