2012-05-08 8 views
3

私はオーディオVUメーターに取り組んでいます。リアルタイムで表示されたオーディオの振幅を使って、以下の画像を取得したいと思います。Androidでのリアルタイムデータの視覚化

私は各チャンネルの音声の振幅を取得する方法を知っていますが、色付きの矩形を十分に速く表示する方法がわかりません。

私の最初のアイデアは、各矩形に背景色をつけて振幅に応じて表示/非表示にすることです。

すでに誰かがそれを試みましたか? 50または100msごとに振幅を表示するのに十分速いでしょうか?

これを達成する最速の方法は何ですか?あなたは長方形を持っているし、彼らの可視性を変更すると、あなた

enter image description here

答えて

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; 
     } 
    } 
}