从onDraw()调用invalidate()会导致堆栈溢出吗?

时间:2012-06-29 09:31:21

标签: android stack-overflow ondraw invalidation

经过多次努力之后,我确定SurfaceView不会做我想做的事情,即超出一些UI元素而不是其他元素。我还发现在SurfaceView上绘制所有UI元素实际上比我试图替换的多层次结构慢得多。因此,我正在尝试使用View编码我自己的动画onDraw()

我能想到的最简单的方法大致如下:

  1. 现在测量时间
  2. 执行有关动画状态的计算
  3. 致电invalidate()
  4. onDraw()
  5. 处绘制动画
  6. 返回1.
  7. 我的nextFrame()已经有SurfaceView函数执行第1步和第2步,而绘制函数实际上是微不足道的 - 一条路径。我可以nextFrame()拨打invalidate()我可以onDraw()拨打nextFrame()来表示绘图已经完成,我们已准备好接下一帧。不幸的是,我可以想象这会导致问题。

    invalidate()是否直接致电onDraw()?我是否需要像SurfaceView中那样实现调用线程?

2 个答案:

答案 0 :(得分:5)

不,它不会导致堆栈溢出。

答案 1 :(得分:0)

当你调用invalidate()时,你可以假设将调用onDraw(画布c),是的。

但是要小心调用onDraw()中的nextFrame,一定要控制刷新时间。

如果你想实现onDraw(Canvas 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
}