2012-03-21 9 views
0

비트 맵을 기반으로 메뉴를 만들려고합니다. 메뉴 자체는 screentouch 이동 이벤트를 통해 이동 가능해야하며, 기본적으로보기에서 단추를 드래그하려고합니다. 버튼에는 충돌 감지 기능이 포함되어있어 터치 할 때마다 서로 튀어 나오게됩니다.안드로이드에서 캔버스로 비트 맵을 그릴 때 깜박임

하지만 내 비트 맵을 그릴 때 어떤 문제가 있습니다. 현재 내 장치의 창에 맞게 비트 맵을 확장하기 위해 사각형을 사용하고 있습니다. 현재의 비트 맵을 부드럽게 움직여서 깜박 거리지 않고 싶습니다. gl을 여는 유일한 방법은 무엇입니까? 아니면 내 코드에서 큰 것을 놓쳤는가?

각 단추 그리기 내 표면보기입니다. 여기서 MenuButton은 비트 맵을 보유하고 터치 및 드래그 이동에 따라 위치를 업데이트하는 클래스입니다.

protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.WHITE); 

    for(MenuButton menuButton : menuButtonSprites) { 
     menuButton.onDraw(canvas); 
    } 
} 

나는 비트 맵은 각 장치의 폭으로 확장하고 싶은 그것을 위해 난에 맞게 비트 맵의 ​​사각형을 사용합니다.

public MenuButton(MenuView v, Bitmap bmp, int yPosition){ 
    this.menuView = v; 
    this.menuButton = bmp; 
    this.xMax = v.getWidth(); 
    this.yPosistion = yPosition; 
    menuButtonRectangle = new Rect(xMin, this.yPosistion-yMin, xMax, this.yPosistion+yMax); 
} 

public void update(int y){ 
    if(menuButtonPressed) 
    { 
     this.yPosistion = y; 
     menuButtonRectangle.set(xMin, yPosistion-yMin, xMax, yPosistion+yMax); 
    } 
} 

public void onDraw(Canvas canvas){ 
    canvas.drawBitmap(menuButton, null, menuButtonRectangle, null); 
} 

나는 또한 추첨을 업데이트하는 스레드를 가지고

public void run() { 
    long ticksPS = 1000/FPS; 
    long startTime; 
    long sleepTime; 
    Canvas c = null; 

    while (running) { 
     startTime = System.currentTimeMillis(); 
     try { 
      c = view.getHolder().lockCanvas(); 
      synchronized (view.getHolder()) { 
       view.onDraw(c); 
      } 
     } 
     finally { 
      if (c != null) { 
       view.getHolder().unlockCanvasAndPost(c); 
      } 
     } 

     sleepTime = ticksPS - (System.currentTimeMillis() - startTime); 
     try { 
      if (sleepTime > 0) 
       sleep(sleepTime); 
      else 
       sleep(10); 
     } 
     catch (Exception e) { 
     } 
    } 
} 

난 정말 내가 잘못 알고하지 않습니다 왜 내 단추를 부드럽게 움직일 수 없는지. 캔버스를 사용하는 것이 단점입니까, 아니면 정말 중요한 것을 놓친 것입니까? D?

답변

0

일반적으로이 문제는 페인팅 중에 동기화 문제가있는 경우 발생합니다. 이것은 더 높은 프레임 속도 때문이거나 더 낮은 프레임 속도 일 수 있습니다. 더블 버퍼링 또는 프레임 속도 조정을 통해 이러한 종류의 문제를 해결할 수 있습니다.

이중 버퍼링은 이미지를 메인 캔버스에 직접 그리는 대신 화면 크기와 그래픽 객체를 가져 오는 빈 비트 맵을 생성합니다. 모든 것을 비트 맵에 그리면이 비트 맵을 기본 캔버스로 직접 그립니다.

+0

Thx, 그래도 프레임 속도는 조정되었지만 성공하지 못했습니다. 나는 더블 버퍼링을 시도하고 다시 당신에게 돌아갈거야! – Ghostcloud

+0

캔버스를 잠그고 그릴 때, 그리고 나중에 unlockCanvasAndPost (c)로 캔버스를 잠금 해제 할 때 이미 다음 프레임을 그리는 것 같습니다. [더블 버퍼링] (http://stackoverflow.com/questions/6538423/double-buffering-in-java-on-android-with-canvas-and-surfaceview) – Ghostcloud

+0

Ohh Thats 괜찮아요. 정보 주셔서 감사합니다. 이 문제에 관해 다시 생각해보십시오. – Pavandroid

관련 문제