我正在阅读SurfaceView
以及如何使用它,我发现了一些信息,指出默认情况下SurfaceView
View#willNotDraw()
设置为false,并且你可以打电话给SurfaceView#onDraw()
。我还读到RomainGuy说这是默认完成的,因为它更有效率。我现在的问题是,你何时应该在一个单独的线程中处理SurfaceView#onDraw()
,何时应该将View#willNotDraw()
设置为true
,然后只需拨打SurfaceView#invalidate()
。这两者之间是否存在差异,是否会提高性能?
答案 0 :(得分:1)
请参阅:
http://developer.android.com/reference/android/view/View.html#setWillNotDraw(boolean)
我不确定您在哪里获得了您的信息,但至少javadoc表示大多数用户会将此设置为false
以让Android自行发送onDraw
个事件。关于你何时应该这样做的问题,我想说的是你使用SurfaceView
的原因。
如果您的视图显示动态的内容(例如,对于游戏或具有紧密事件循环的内容),您将希望准确控制更新何时发生,特别是如果您将获得使用其中一个的信息更详细的invalidate
形式,用于保存重绘整个View
。您不希望Android为您调用invalidate
,这就是旗帜存在的原因。
另一方面,如果您只是简单地绘制静态内容,那么让Android的UI堆栈控制失效是有意义的。
顺便说一句,invalidate
只发布重新绘制View
的请求,因此如果您打算使用事件循环样式,请注意这一点(onDraw
将是之后调用某个时间。)
编辑:一些澄清。
答案 1 :(得分:1)
使用SurfaceView.onDraw()和SurfaceView.invalidate()将使SurfaceView的行为与普通View一样,您将支付与SurfaceView相关的额外开销。如果要从UI线程绘制,请改用常规View。它更容易,更便宜。