SurfaceView和View的区别?

什么时候需要使用SurfaceView而不是View

所有视图都在同一个GUI线程上绘制,也用于所有用户交互。

因此,如果您需要快速更新GUI,或者如果渲染花费太多时间并影响用户体验,请使用SurfaceView

我注意到了一些事情:

  • SurfaceViews包含一个很好的渲染机制,允许线程更新表面的内容,而无需使用处理程序(适用于animation)。
  • 曲面视图不能透明,只能出现在视图层次结构中的其他元素的后面。
  • 我发现它们比渲染到View更快。

有关更多信息(以及一个很好的使用示例),请参阅SDK示例部分中的LunarLander项目。

已更新05/09/2014

好。 我们现在有官方文件。 它以更好的方式谈到我所提到的所有事情。


在这里阅读更多细节。

是的,主要区别是SurfaceView可以在后台线程上更新。 但是,你可能会关心更多。

  • surfaceView有专门的表面缓冲区,而所有的视图共享一个由ViewRoot分配的表面缓冲区。 换句话说,surfaceView花费更多的资源。

  • surfaceView不能被硬件加速(从JB4.2开始),而普通视图的95%的操作是使用openGL ES进行硬件加速的。

  • 应该做更多的工作来创build自定义的surfaceView。 你需要侦听到surfaceCreated / Destroy Event,创build一个渲染线程,更重要的是同步渲染线程和主线程。 但是,要自定义视图,您只需要重写onDraw方法。

  • 更新的时机不同。 普通视图更新机制是由框架约束或控制的:您view.invalidate在UI线程中调用view.invalidate ,或者在其他线程中调用view.invalidate来向框架指示应该更新视图。 但是,视图不会立即更新,而是等到下一个VSYNC事件到达。 理解VYSNC的简单方法是把它看作一个计时器,每隔16ms触发60fps的屏幕。 在Android中,所有正常的视图更新(实际上显示但我今天不会说),与VSYNC同步以达到更好的平滑度。 现在,回到surfaceView,你可以随时渲染它,如你所愿。 但是,如前所述,由于显示器也与VSNC同步,所以我几乎不知道它是否有优势。

主要区别是SurfaceView可以通过背景绘制,但Views不能。 SurfaceViews使用更多的资源,所以你不想使用它们,除非必须。

SurfaceView是Android中的一个自定义视图,可用于在其中绘制。

ViewSurfaceView之间的主要区别是在UI Thread绘制了一个View,用于所有的用户交互。

如果你想足够快地更新用户界面,并在其中渲染大量的信息,SurfaceView是一个更好的select。

SurfaceView有一些技术SurfaceView

1.他们没有硬件加速。

2.当您调用方法invalidatepostInvalidate()时会呈现普通视图,但这并不意味着视图将被立即更新( VSYNC将被发送,操作系统决定何时更新) SurfaceView可以立即更新。

3. SurfaceView有一个分配的surface buffer ,所以成本更高

Surfaceview和视图之间的主要区别之一是,为了刷新正常视图的屏幕,我们必须从定义视图的相同线程中调用invalidate方法。 但即使我们称之为无效,刷新也不会立即发生。 它只发生在VSYNC信号的下一个到达之后。 VSYNC信号是每16.6毫秒发生一次内核产生的信号,或者这也被称为每秒60帧。 所以如果我们想更好的控制屏幕的刷新(比如对于快速移动的animation),我们不应该使用普通的视图类。

另一方面,在surfaceview的情况下,我们可以尽快刷新屏幕,我们可以从后台线程中完成。 因此,表面视图的清爽真的不依赖于VSYNC,如果我们想要做高速animation,这是非常有用的。 我很less有培训video和示例应用程序,很好地解释了所有这些事情。 请看下面的培训video。

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8

另一个定义是:

SurfaceView是一个特殊的视图,可以让你直接在屏幕上显示内容。

来源:大书呆子牧场指南