2011-03-27 3 views
0

언제나 매번 redrawingBitmap없이 캔버스 안에 비트 맵을 옮기는 더 좋은 방법이 있습니까?안드로이드 라이브 벽지 - onOffsetsChanged

public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) { 


      final SurfaceHolder holder = getSurfaceHolder();             
      Canvas c = null; 
      try { 
        c = holder.lockCanvas(); 
        if (c != null) {         
          c.drawBitmap(this.ImageI, xPixels, 0, null);                  
          c.drawBitmap(this.ImageII, xPixels, 0, paint); 



          } 
         } finally { 
          if (c != null) holder.unlockCanvasAndPost(c); 
         } 

      } 

답변

1

당신은 묻습니다 : 더 좋은 방법이 있습니까? 대답은 다음과 같습니다. 전체 장면, 배경 및 모든 프레임을 다시 그려야합니다. 또한 일반적으로 onOffsetsChanged를 그릴 필요가 없습니다. runnable에서 사용중인 변수를 업데이트하십시오. SDK의 Cube 예제가 어떻게 작동하는지 살펴보십시오. 조이의 예도 정확합니다. 도움이 되었습니까?

+0

나는 이해한다. 고마워요! 당신이 생각하는 마녀는 onOffsetChanged를 호출하는 것이 더 좋을까요? drawFrame(); 또는 mHandler.postDelayed (mDrawWall, 30); ?? 나는 진짜로 framerate를 좋아하지 않는다. – Misca

+0

@Misca onOffsetsChanged에서 그리기 호출을 할 필요가 없습니다 (Cube 예제의 drawFrame() 호출은 실제로 불필요합니다). 실행 파일의 다음 "예정된"호출은 공유 변수에서 변경 한 값을 사용하여 "자동으로"시작됩니다. 실행 파일의 본문에 원하는 프레임 속도를 설정합니다.이 프레임은 후속 호출을 자체적으로 예약합니다. –

+0

그래,하지만 내 스레드에서 나는 10 초 스케줄을 사용한다. onOffsetChanged에서 30 밀리 (milis)를 예약해야합니까? – Misca

1

오프셋을 변경하여 위치 또는 이미지를 읽고 수정하는 상황에서 일반적으로하는 것처럼 할 수 있습니다. onOffsetsChanged를 사용하여 정보가 변경 될 때마다 자동으로 그릴 루틴에서 업데이트되는 상수 변수에 정보를 제공합니다. 그렇게 같이 작업 할 상수를 정의하여

시작 ... 나는 onOffsetsChanged 이벤트에서 모든 값을 캡처하고이 예에서

Private float mXOffset = 0, 
       mYOffset = 0, 
       mXStep = 0, 
       mYStep = 0, 
       mXPixels = 0, 
       mYPixels = 0; 

, 당신이 필요만을 정의하고 오프셋을 캡처, 단계 또는 픽셀을 선택하십시오.

public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) { 

mXOffset = xOffset; 
mYOffset = yOffset; 
mXStep = xStep; 
mYStep = yStep; 
mXPixels = xPixels; 
mYPixels = yPixels; 

DrawStuff(); 
} 

는이 데이터를 일단 그것은 당신에게 응용 프로그램에서 사용하는 좀 더 많은 힘과 유연성을 제공 할 것입니다. 캔버스 업데이트를 다음과 같이 호출 할 수 있으며 그리기 루틴이 호출 될 때마다 오프셋이 변경되면이 숫자를 사용하여 이미지의 위치, 이동 속도 또는 원하는 다른 수학적 계산을 수정할 수 있습니다.

private void DrawStuff(){ 
     final SurfaceHolder holder = getSurfaceHolder();             
      Canvas c = null; 
      try { 
        c = holder.lockCanvas(); 
        if (c != null) {         
         c.drawBitmap(this.ImageI, mXPixels,mYPixels + mYOffset,null);                  
         c.drawBitmap(this.ImageII, xPixels, 0, paint); 
           } 
       } finally { 
        if (c != null) holder.unlockCanvasAndPost(c); 
       } 

    } 

... 등. 희망이 당신이 내가 완전히 명확하지 않았다고 묻는 것입니다. 또한 필요에 따라 이러한 오프셋, 단계 및 위치를 다른 곳에서도 사용할 수 있습니다.

+0

비트 맵을 다시로드하고 다시 그려 넣지 않고 이미지를 화면에 표시하는 더 좋은 방법은 없나요? 내 스레드가 매분마다 실행하고 무승부에 나는 많은 것들을 않습니다. 고맙습니다. – Misca

+0

코드에서 제공 한 비트 맵에 실제로로드되지 않습니다.로드 한 비트 맵을 참조하는 것입니다. c.drawBitmap을 사용하면 위에서 언급 한 비트 맵을 캔바스에 적용하는 것입니다. 그래서 정확히 무엇을 성취하려고하는지에 따라 프로세서에 대해 너무 걱정하지 않고 이러한 이미지를 아주 쉽게 조작 할 수 있어야합니다. 자주 다른 이미지를 호출하는 경우에는 작은 배열을 사용하여 작업 할 비트 맵을 처리 할 수 ​​있습니다. – Joey

관련 문제