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()
callinvalidate()
,也可以调用onDraw()
callnextFrame()
来表示绘图已经完成,我们已经准备好下一帧了。不幸的是,我可以想象这会造成问题
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将是不同的,但可以控制。谢谢!我想这就够了。