2012-05-08 25 views
3

Я работаю над звуковым VU-метром, и я хотел бы получить что-то вроде изображения, показанного ниже, с амплитудой звука, отображаемой в реальном времени.Визуализация данных в реальном времени в Android

Я знаю, как получить амплитуду звука для каждого канала, но я не уверен, как сделать достаточно быстрое отображение цветных прямоугольников.

Моя первая идея состоит в том, чтобы иметь View с цветом фона для каждого прямоугольника и отображать/скрывать его в соответствии с амплитудой.

Кто-нибудь уже пробовал это? Было бы достаточно быстро для отображения амплитуды каждые 50 или 100 мс?

Какой самый быстрый способ достичь этого?

Спасибо Вам

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; 
     } 
    } 
} 
Смежные вопросы