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 に答える