2011-07-27 65 views
4

所以我想清除畫布使用canvas.drawcolor(Color.BLACK),但如果我只是調用一次,顯示器閃爍並顯示應該已經被drawColor覆蓋。Android SurfaceView/Canvas閃爍後,試圖清除它

這裏是我的代碼的重要位 -

public void update() { 


    //This method is called by a Thread     


    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; 
} 

周圍的Googling豆蔻後,我聽說過雙緩衝,但來到理解是lockCanvas()和unlockCanvasAndPost()應該處理這對我來說。這裏出了什麼問題?

回答

3

我不知道這是否與SurfaceView是雙緩衝,他們交替每幀。因此,您必須至少清除兩個畫面。

變化toClear = truetoClear = 2並設置

if(toClear > 0) { 
    'drawColor' 
    toClear--; 
} 
+0

這個工作,雖然我不得不說它是非常直觀的 –

0
  1. 你看過SurfaceHolder上的文檔嗎?我會確保你遵循所有推薦的用於從另一個線程進行調用的用途。

  2. 你確定你的其他物體不是在完成黑色填充後簡單地繪製的?你提到繪製移動物體,並說如果你沒有重置清晰的標誌,它不會閃爍。也許它被畫兩次?您是否在該方法中放置了一個調試中斷點來驗證發生了什麼以及何時/多久調用它?

+0

1.不應該有任何問題從另一個線程調用它。它完美的工作,直到我試圖清除它,我不認爲這是問題。是的,我確定。事實上,即使我完全阻止他們在清晰之後被抽籤,他們仍然閃爍,即使他們不應該在那裏。我確信它不是這樣的問題 –

3

我有同樣的問題,在過去,或至少聽起來類似的描述。我解決這個問題的方式是避免調用onDraw方法,因爲框架還會在線程的run方法中調用此方法。

簡而言之,將您的onDraw方法重命名爲Render(),然後從您的運行循環中調用Render。如果你仍然想清除屏幕,那麼只需在你的運行循環內執行(在你調用Render之前),這就解決了我的「隨機精靈被繪製」的問題。

請讓我知道這是否有幫助 - 它對我來說非常合適。

+0

這解決了閃爍完美的問題!不幸的是,至少在我的情況下,動畫似乎比'onDraw()'更不流暢。大概這是因爲自定義的'render()'它不像'onDraw()'那樣經常被調用。你有沒有找到這個?我試圖想辦法解決它.... –