2011-04-09 3 views
2

내 라이브 벽지에서 각 프레임을 그리는 데 다음 코드 (Runnable에 의해 호출 됨)를 사용합니다. 호출 될 때마다 현재 캔버스를 단색으로 채우고 배경 비트 맵을 그립니다 (bg_image는 화면에 완벽하게 맞도록 크기가 조정되었습니다). 그런 다음 drawParticles (c)를 호출합니다. 이것은 c.drawCircle (...)을 사용하여 캔버스 전체에 입자를 여러 번 그리는 작업입니다.비트 맵을 포함 할 때 라이브 벽지 캔버스가 깜박임

라이브 벽지 미리보기 모드에서이 코드는 훌륭하게 작동합니다. 그러나 실제로 이것을 라이브 배경 화면으로 설정하면 화면이 깜박 거리고 그리기 전에 캔버스를 지우지 않는 것처럼 보입니다. 나에게 'splain :

프레임 1 : 비트 맵이 그려지고 원이 중첩됩니다.

프레임 2 : 비트 맵이 그려지고 원이 겹쳐집니다 (대략적인 이해를 바탕으로 효율성을 위해 번갈아 게시되는 두 개의 캔버스가 있음).

프레임 3 : 캔버스가 지워지지 않습니다! 이 프레임에는 그려진 각 원의 새 위치 뿐만 아니라 프레임 1!의 원인이 포함됩니다.

프레임 4 : 프레임 2의 원뿐만 아니라 그려진 각 원의 새 위치가 포함됩니다!

최종 효과는 두 원을 번갈아 사용하는 캔버스 사이에서 깜박 거리는 원이 화면 전체에 "흔적"을 남기는 것입니다. 아래 코드를 기반으로 왜 각 프레임이 지워지지 않습니까? 다시 말하지만 미리보기 모드에서는 정상적으로 작동하지만 실제 라이브 배경으로 설정되어있는 경우에는 그렇지 않습니다. 이 깜박 거리는 문제는 비트 맵을 그릴 때만 발생한다는 점도 주목할 가치가 있습니다. 배경이 단색 일 경우이 문제가 발생하지 않습니다.

final SurfaceHolder holder = getSurfaceHolder(); 

Canvas c = null; 
try { 
    c = holder.lockCanvas(); 
    if (c != null) { 
     c.drawColor(Color.BLACK); 
     c.drawBitmap(bg_image, 0, 0, null); 
     fluid.drawParticles(c); 
    } 
} finally { 
    if (c != null) holder.unlockCanvasAndPost(c); 
} 

mHandler.removeCallbacks(mDrawRunnable); 
mHandler.postDelayed(mDrawRunnable, 1000/targetFramerate -(System.currentTimeMillis() - mLastTime)); 
} 

답변

2

제 생각에 애니메이션이 프레임 속도를 따라 가기에는 너무 복잡합니다. 프레임 속도를 줄이면 여전히 문제가 있습니까? 또한 각 프레임에서 불투명 한 배경 비트 맵을 그리는 경우 먼저 화면을 검정색으로 칠할 필요가 없습니다. 시간이 낭비되고 최대 프레임 속도가 제한됩니다.

미리보기 모드에서는 휴대 전화의 리소스가 집중되어 있기 때문에 문제가 발생하지 않는 것 같지만 배경 정보가 설정되면 백그라운드에서 더 많은 작업이 진행됩니다.

+0

아마도 당신 말이 맞을 것 같습니다. – wopkins

+0

@wopkins는 내 답변을 수락 해 주셔서 감사합니다. :-) 나는 당신이 만들고있는 벽지의 종류를 모르지만 "입자"라는 단어를 사용하면 게임 엔진을 볼 수도 있다고 생각하게됩니다 (AndEngine, LibGDX). 또한, 나는 은하의 배경 화면에 대한 소스를 여기에 사용할 수 있다고 생각 : http://android.git.kernel.org/?p=platform/packages/wallpapers/Basic.git;a=tree;f=src/com/android /벽지 –

관련 문제