Android SurfaceView / Canvas мерцает после попытки его очистки - PullRequest
4 голосов
/ 27 июля 2011

Итак, я пытаюсь очистить Canvas с помощью canvas.drawColor (Color.BLACK), но если я вызову его один раз, дисплей замигает и отобразит старый рисунок, который должен был быть скрыт drawColor.

Вот важные биты моего кода -

// This method is called by a Thread                
public void update() {
    Canvas canvas = holder.lockCanvas(null);
    if (canvas != null) {
        onDraw(canvas);
    }
    holder.unlockCanvasAndPost(canvas);
}

@Override
protected void onDraw(Canvas canvas) {

    if (toClear) {
        canvas.drawColor(Color.BLACK);

        //if this is not set to change back to false, it does not flicker
        toClear = false;
    }

    //Draw some objects that are moving around
}

public void clearScreen() {     
    // This method is called when the user pressed a button
    toClear = true;
}

После поиска в Google, я услышал о двойной буферизации, но пришел к выводу, что lockCanvas () и unlockCanvasAndPost () должны обрабатывать это для меня.Что здесь не так?

Ответы [ 3 ]

3 голосов
/ 27 июля 2011

Интересно, связано ли это с SurfaceView с двойной буферизацией, и они чередуются в каждом кадре.Следовательно, вам придется очистить экран как минимум от двух кадров.

Измените toClear = true на toClear = 2 и установите

if(toClear > 0) { 
   'drawColor'
   toClear--; 
}
3 голосов
/ 11 ноября 2012

У меня была такая же проблема в прошлом, или, по крайней мере, она звучит похоже на ваше описание. Способ, который я решил, состоял в том, чтобы избежать вызова метода onDraw, поскольку платформа также вызывает этот метод МЕЖДУ вашими вызовами к нему в методе run вашего потока.

Вкратце, переименуйте ваш метод onDraw в что-то вроде Render (), а затем вызовите Render из цикла выполнения. Если вы все еще хотите очистить экран, а затем просто сделайте это в цикле выполнения (перед вызовом Render), это решило мою проблему "прорисовки случайных спрайтов".

Пожалуйста, дайте мне знать, если это поможет - это отлично сработало для меня.

0 голосов
/ 27 июля 2011
  1. Вы читали документы на SurfaceHolder ?Я бы удостоверился, что вы соблюдаете все рекомендуемые способы использования вызовов из другого потока.

  2. Вы уверены, что другие ваши объекты не просто рисуются после того, как вы сделали черную заливку?Вы упоминаете рисование движущихся объектов и говорите, что оно не мерцает, если вы не сбросили свой флаг очистки.Может быть, это рисуется дважды?Поместили ли вы в этот метод точку останова отладки, чтобы проверить, что происходит и когда / как часто он вызывается?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...