我正在构建一个需要实时显示信号轨迹的应用程序(想想你在医院的心脏监视器上看到的那种)。为了使我的线条动画看起来流畅,我希望帧速率约为每秒 15 帧(我做了一些实验得出结论,这是可接受的最低帧速率)。在这篇文章的上下文中可能无关紧要,但我可能在 ListView 中有很多这样的视图(大约 20 个很常见,每次显示大约 5 个)。
到目前为止,我一直在使用自定义视图来执行此操作,扩展 View 类。我在包含片段中有一个线程,它每隔约 70 毫秒在视图上调用 invalidate() 来重绘视图。这本身不会引起问题,因为我已经优化了我的 onDraw() 函数,大多数时间都在 2 毫秒内运行。
现在我在片段中添加了一个 Spinner 并且在调试它时我注意到一旦我打开 Spinner 适配器不断地点击 getView() 调用,即使我没有触摸 Spinner(即打开但不滚动)并且也滞后少量。这让我意识到我的整个片段每隔约 70 毫秒就会被重绘一次,这对我来说听起来很糟糕。现在的问题:
- 有没有办法在子视图上触发 onDraw() 而不会导致整个层次结构的重绘?
- 我应该求助于 SurfaceView 吗?(这不会导致完整的视图层次结构重绘,对吧?)
- 我注意到 SurfaceView 没有硬件加速。如果我只使用基本的绘图函数(drawLine() 和 drawText()),这有关系吗?
- 在我的情况下 GLSurfaceView 会更好吗?