2

经过一番挣扎,我确定 aSurfaceView不会做我想让它做的事情,即位于某些 UI 元素之上和其他 UI 元素之下。我还发现,将所有 UI 元素绘制到SurfaceView实际上比我试图替换的多层层次结构要慢得多。因此,我正在尝试View使用onDraw().

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

  1. 现在测量时间
  2. 执行有关动画状态的计算
  3. 称呼invalidate()
  4. 绘制动画在onDraw()
  5. 返回到 1。

我已经有了一个nextFrame()函数,SurfaceView它执行步骤 1 和 2,而绘图函数实际上很简单——一条路径。我可以nextFrame()打电话invalidate(),我可以onDraw()打电话nextFrame()来表示绘图已经完成,我们准备好下一帧了。不幸的是,我可以想象这会导致问题。

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

4

2 回答 2

5

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

于 2012-06-29T11:56:01.347 回答
0

当您调用 invalidate() 时,您可以假设 onDraw(canvas 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
}
于 2012-06-29T09:34:18.543 回答