SurfaceHolder.lockCanvas возвращает ноль, если поверхность находится не на переднем плане - PullRequest
0 голосов
/ 05 августа 2011

В настоящее время я делаю тест с LiveWallpaper в Android. Я рисую что-то на холсте, используя код, который выглядит примерно так:

final SurfaceHolder holder = getSurfaceHolder();
Canvas c = new Canvas();
c = holder.lockCanvas(); // c becomes null
c.save();
c.drawBitmap(currentBitmap);
c.restore();
holder.unlockCanvasAndPost(c);

Эта часть работает нормально при нормальных обстоятельствах . Тем не менее, у меня есть прослушиватель, который выполняет этот код всякий раз, когда параметр изменяется в настройках, которые соответствуют этой службе. Кажется, что всякий раз, когда я выполняю этот код из действия настройки, я получаю NullPointer по методу c.save().

Кажется, что только когда обои находятся не на переднем плане, holder.lockCanvas (). Нельзя ли рисовать на этой поверхности, когда она не на переднем плане?

1 Ответ

2 голосов
/ 05 августа 2011

Это верно. Распространенный способ избежать этого - отменить регистрацию слушателя в onPause или onVisibilityChanged (false) и заново зарегистрировать в onResume или onVisibilityChanged (true), поскольку вы не должны реагировать на изменения настроек, когда ваш холст не виден.

Другим решением было бы просто окружить этот раздел кода нулевой проверкой и забыть об этом. Однако я бы рекомендовал против этого, поскольку на самом деле вы хотите, чтобы ваш код даже не пытался отрисовать поверхность, когда ее не видно.

...