내 라이브 벽지에서 각 프레임을 그리는 데 다음 코드 (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));
}
아마도 당신 말이 맞을 것 같습니다. – wopkins
@wopkins는 내 답변을 수락 해 주셔서 감사합니다. :-) 나는 당신이 만들고있는 벽지의 종류를 모르지만 "입자"라는 단어를 사용하면 게임 엔진을 볼 수도 있다고 생각하게됩니다 (AndEngine, LibGDX). 또한, 나는 은하의 배경 화면에 대한 소스를 여기에 사용할 수 있다고 생각 : http://android.git.kernel.org/?p=platform/packages/wallpapers/Basic.git;a=tree;f=src/com/android /벽지 –