2012-06-29 52 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()'的绘制周期结束? –