Для моих живых обоев я использую следующий код (называемый Runnable), чтобы нарисовать каждый кадр.Каждый раз, когда он вызывается, я заполняю текущий холст сплошным цветом и рисую фоновое растровое изображение (размер bg_image был изменен, чтобы идеально соответствовать экрану).Затем я вызываю drawParticles (c), который просто использует c.drawCircle (...) несколько раз, рисуя частицы по всему холсту.
В режиме предварительного просмотра живых обоев этот код прекрасно работает.Однако, когда я на самом деле устанавливаю это как свои живые обои, они мерцают и, кажется, не очищают холст перед рисованием.Позвольте мне сказать:
Кадр 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));
}