2013-12-22 7 views
0

나는 밤새 안드로이드를 사용하여 일련의 비트 맵을 완전히 서로 인접하게 (그 사이에 간격을 두지 않고) 그릴 수없는 이유를 알아 냈습니다.어떻게 안드로이드에서 캔버스에 인접한 비트 맵을 그립니까?

맥락에서 필자는 제공되는 오디오 데이터의 각 '창'에 대한 수직 비트 맵을 표시하여 사용자에게 주파수 히트 맵을 제공하는 스펙트로 그램 애플리케이션을 구축 중입니다. 지금은 미리 녹음 된 오디오를 사용하고 있기 때문에 모든 것을 표시해야하기 전에 모든 계산을 수행 할 수 있습니다. 정수 배열의 ArrayList가 있습니다. 각 배열은 하나의 창 비트 맵을 나타내며 타이머를 사용하여 캔버스에 그려집니다 실.

응용 프로그램이 화면의 크기를 초과하여 그릴 때 아래의 접근 방식이 궁극적으로 중단된다는 것을 알고 있습니다 만, 지금 당장 걱정할 필요가 없습니다. 내가 해결하고자하는 문제는 아래 코드가 그려진 비트 맵 사이에 하나의 픽셀 (ish) 갭을 생성한다는 것입니다. 실제로는 그 비트 맵이 절대적으로 인접 해있는 것이 좋을 때입니다.

내 타이머 스레드의 실행() 방법 :

public void run() { 
     Canvas c = null; 
     try { 
      c = sh.lockCanvas(null); 
      synchronized(sh) { 
       doDraw(c); 
      } 
     } finally { 
      if (c!=null) { 
       sh.unlockCanvasAndPost(c); 
      } 
     } 
    } 

이 비트 맵을 그리는 doDraw() 메소드이며, 다음 그리기 위해이 그려진 비트 맵의 ​​말에 따라 생략 다음. 수직 창 그려야 할

private void doDraw(Canvas canvas) { 
     canvas.drawBitmap(spec.getBitmapWindow(windowsDrawn), 0, 1, windowsDrawn, 0, 1, h, false, null); 
     System.out.println("Windows drawn: "+windowsDrawn); 
     windowsDrawn++; 
    } 

spec.getBitmapWindow(windowsDrawn) 단순히 화소 값의 정수 배열 결과 : 'windowsDrawn'필드를 증가시켜 그래서 간단히한다.

Here's a screenshot to show what I'm talking about. 이미지가 마치 작은 감옥 뒤에있는 것처럼 보이므로이 부분을 제거하고 싶습니다.

감사합니다.

답변

0

내가 잘못하고있는 것을 발견했습니다. 'prison bars'효과는 실제로 백 버퍼에 대한 증분 업데이트를 작성하는 부작용이었습니다. 이는 아마도 너무 자주 뒤집어 졌을 것입니다 (따라서 다른 버퍼에 대한 업데이트를 잃어 버렸고 검은 세로 줄이 나타납니다). 문제는 버퍼 비트 맵에 쓰고 매번 프레임 전체를 다시 그려 넣음으로써 해결되었습니다. 안드로이드에서는 (내가하려고했던 것처럼) 화면을 점진적으로 업데이트 할 수 없습니다.

관련 문제