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

Android 从onDraw()调用invalidate()会导致堆栈溢出吗?,android,stack-overflow,ondraw,invalidation,Android,Stack Overflow,Ondraw,Invalidation,经过多次努力,我已经确定,SurfaceView不会做我希望它做的事情,也就是说,在某些UI元素之上,而在其他元素之下。我还发现,将所有UI元素绘制到SurfaceView实际上比我试图替换的多层层次结构要慢得多。因此,我尝试使用onDraw()为自己的动画视图编写代码 我能想到的最简单的方法大致如下: 现在测量时间 执行有关动画状态的计算 调用invalidate() 在onDraw()处绘制动画 返回到1 我的SurfaceView中已经有了一个nextFrame()函数,它执行步骤1和步骤

经过多次努力,我已经确定,
SurfaceView
不会做我希望它做的事情,也就是说,在某些UI元素之上,而在其他元素之下。我还发现,将所有UI元素绘制到
SurfaceView
实际上比我试图替换的多层层次结构要慢得多。因此,我尝试使用
onDraw()
为自己的动画
视图编写代码

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

  • 现在测量时间
  • 执行有关动画状态的计算
  • 调用
    invalidate()
  • onDraw()处绘制动画
  • 返回到1
  • 我的
    SurfaceView
    中已经有了一个
    nextFrame()
    函数,它执行步骤1和步骤2,而draw函数实际上很简单,只有一条路径。我可以调用
    nextFrame()
    call
    invalidate()
    ,也可以调用
    onDraw()
    call
    nextFrame()
    来表示绘图已经完成,我们已经准备好下一帧了。不幸的是,我可以想象这会造成问题


    invalidate()
    是否直接调用
    onDraw()
    ?我是否需要实现一个调用线程,如
    SurfaceView

    调用invalidate()时,可以假设将调用onDraw(canvas c),是的

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

    如果您想要实现onDraw(Canvas c)方法,只需重写它,就可以在那里绘制您想要的任何东西

    如果要基于当前时间控制刷新时间,请执行以下操作:

    //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中,您说您正在控制当前时间:

    //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
    }
    
    //我假设您在onCreate()中实例化了最后一次
    void method1(){
    while(currentTime-lastTime
    不,它不会导致堆栈溢出。

    我知道调用
    invalidate()
    会导致调用
    onDraw()
    ,但我担心它可能会直接调用它,并导致类似于
    invalidate()->onDraw()->invalidate()->onDraw()
    等的嵌套,从而导致堆栈溢出(网站除外)。其思想是根据绘图完成的时间控制刷新时间。你会如何控制它?如果你测量时间(你描述的方法1),你可以比较上一次的时间和当前的时间,每X毫秒刷新一次,只需在你的第一个方法中做一段时间(我将用它编辑我的答案)是的,但在我看来,这是以设备的已知帧速率为前提的。难道没有一种方法可以从
    视图
    接收事件,告诉您绘图周期已完成吗?我假设
    onDraw()
    中的所有绘图函数都发生在UI线程上,因此大概在
    onDraw()
    结束时,绘图周期就完成了?因为onDraw()是周期的结束,在最后调用第一个方法时,可以假设绘图完成了,是的。所以fps将是不同的,但可以控制。谢谢!我想这就够了。