Холст живых обоев мерцает, когда включает растровое изображение - PullRequest
2 голосов
/ 09 апреля 2011

Для моих живых обоев я использую следующий код (называемый 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));
}

1 Ответ

2 голосов
/ 09 апреля 2011

Я предполагаю, что ваша анимация слишком сложна, чтобы соответствовать частоте кадров.Если вы снизите частоту кадров, проблема останется?Кроме того, если вы рисуете непрозрачное фоновое растровое изображение в каждом кадре, вам не нужно сначала закрашивать экран черным - это просто напрасная трата времени и ограничивает максимальную частоту кадров.проблема не возникает в режиме предварительного просмотра, потому что больше ресурсов телефона сосредоточено на вас, тогда как после установки обоев в фоновом режиме происходит больше вещей.

...