什么时候应该让UI线程绘制SurfaceView?

时间:2012-03-27 17:05:13

标签: android surfaceview android-custom-view

我正在阅读SurfaceView以及如何使用它,我发现了一些信息,指出默认情况下SurfaceView View#willNotDraw()设置为false,并且你可以打电话给SurfaceView#onDraw()。我还读到RomainGuy说这是默认完成的,因为它更有效率。我现在的问题是,你何时应该在一个单独的线程中处理SurfaceView#onDraw(),何时应该将View#willNotDraw()设置为true,然后只需拨打SurfaceView#invalidate()。这两者之间是否存在差异,是否会提高性能?

2 个答案:

答案 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。它更容易,更便宜。