在經過很多努力之後,我確定SurfaceView
不會做我想做的事情,即在一些UI元素之上,在其他之下。我還發現,將所有UI元素繪製到SurfaceView
實際上比我試圖替換的多層分層結構慢得多。因此,我試圖使用onDraw()
編碼我自己的動畫View
。從onDraw()調用invalidate()是否會導致堆棧溢出?
我能想到的最簡單的方法大致如下:
- 測量時間,現在
- 關於動畫狀態
- 呼叫
invalidate()
- 執行計算繪製動畫在
onDraw()
- 返回1.
我已經有了我的SurfaceView
的nextFrame()
函數,它執行步驟1和2,而繪圖函數實際上很簡單 - 只有一個路徑。我可以讓nextFrame()
致電invalidate()
,我可以讓onDraw()
致電nextFrame()
表示圖紙已完成,我們已準備好接下一幀。不幸的是,我可以想象這會造成問題。
是否invalidate()
直接調用onDraw()
?我需要實現一個調用線程,如SurfaceView
?
我知道,調用'無效()''引起的onDraw()'被調用,但我擔心,它可能把它直接* *和導致像'無效窩() - >的onDraw() - > invalidate() - > onDraw()'等導致堆棧溢出(例外不是網站)。這個想法是根據繪圖完成的時間來控制刷新時間。你將如何控制它? –
如果你測量時間(你的描述的方法1),你可以比較前一次和當前時間來刷新每X毫秒只是在你的第一種方法(我要編輯我的答案) –
是,但在我看來,這預示着設備的已知幀速率。沒有辦法從'View'接收事件,告訴你繪圖週期已經完成?我假定'onDraw()中的所有繪圖函數都出現在UI線程上,所以大概在'onDraw()'的繪製週期結束? –