2012-06-29 46 views
1

在經過很多努力之後,我確定SurfaceView不會做我想做的事情,即在一些UI元素之上,在其他之下。我還發現,將所有UI元素繪製到SurfaceView實際上比我試圖替換的多層分層結構慢得多。因此,我試圖使用onDraw()編碼我自己的動畫View從onDraw()調用invalidate()是否會導致堆棧溢出?

我能想到的最簡單的方法大致如下:

  1. 測量時間,現在
  2. 關於動畫狀態
  3. 呼叫invalidate()
  4. 執行計算繪製動畫在onDraw()
  5. 返回1.

我已經有了我的SurfaceViewnextFrame()函數,它執行步驟1和2,而繪圖函數實際上很簡單 - 只有一個路徑。我可以讓nextFrame()致電invalidate(),我可以讓onDraw()致電nextFrame()表示圖紙已完成,我們已準備好接下一幀。不幸的是,我可以想象這會造成問題。

是否invalidate()直接調用onDraw()?我需要實現一個調用線程,如SurfaceView

回答

5

沒有,也不會造成堆棧溢出。

0

當你調用無效(),你可以假設的onDraw(帆布C)將被調用,是的。

但要小心調用的onDraw裏面的nextFrame()時,一定要控制更新時間。

如果你想實現的onDraw(帆布c)方法只是覆蓋它,你能畫有任何你想要的。

如果你想根據當前時間來控制更新時間:

裏面的方法1,你說你正在控制當前時間:

//I assume you instantiate the lasTTime in the  onCreate() 

void method1() { 
    while (currentTime - lastTime < N) { 
     currentTime = //call the current time as you do 
    } 
    lastTime = currentTime; 
    //call method2 
} 
+1

我知道,調用'無效()''引起的onDraw()'被調用,但我擔心,它可能把它直接* *和導致像'無效窩() - >的onDraw() - > invalidate() - > onDraw()'等導致堆棧溢出(例外不是網站)。這個想法是根據繪圖完成的時間來控制刷新時間。你將如何控制它? –

+0

如果你測量時間(你的描述的方法1),你可以比較前一次和當前時間來刷新每X毫秒只是在你的第一種方法(我要編輯我的答案) –

+0

是,但在我看來,這預示着設備的已知幀速率。沒有辦法從'View'接收事件,告訴你繪圖週期已經完成?我假定'onDraw()中的所有繪圖函數都出現在UI線程上,所以大概在'onDraw()'的繪製週期結束? –