在经过很多努力之后,我确定SurfaceView
不会做我想做的事情,即在一些UI元素之上,在其他之下。我还发现,将所有UI元素绘制到SurfaceView
实际上比我试图替换的多层分层结构慢得多。因此,我试图使用onDraw()
编码我自己的动画View
。从onDraw()调用invalidate()是否会导致堆栈溢出?
我能想到的最简单的方法大致如下:
- 测量时间,现在
- 关于动画状态
- 呼叫
invalidate()
- 执行计算绘制动画在
onDraw()
- 返回1.
我已经有了我的SurfaceView
的nextFrame()
函数,它执行步骤1和2,而绘图函数实际上很简单 - 只有一个路径。我可以让nextFrame()
致电invalidate()
,我可以让onDraw()
致电nextFrame()
表示图纸已完成,我们已准备好接下一帧。不幸的是,我可以想象这会造成问题。
是否invalidate()
直接调用onDraw()
?我需要实现一个调用线程,如SurfaceView
?
我知道,调用'无效()''引起的onDraw()'被调用,但我担心,它可能把它直接* *和导致像'无效窝() - >的onDraw() - > invalidate() - > onDraw()'等导致堆栈溢出(例外不是网站)。这个想法是根据绘图完成的时间来控制刷新时间。你将如何控制它? –
如果你测量时间(你的描述的方法1),你可以比较前一次和当前时间来刷新每X毫秒只是在你的第一种方法(我要编辑我的答案) –
是,但在我看来,这预示着设备的已知帧速率。没有办法从'View'接收事件,告诉你绘图周期已经完成?我假定'onDraw()中的所有绘图函数都出现在UI线程上,所以大概在'onDraw()'的绘制周期结束? –