Android中FrameLayout中的分层SurfaceViews


问题内容

我正在尝试为Android构建增强现实应用程序,并且遇到了将表面视图分层的问题。我需要一个表面视图来显示要在上面叠加图形的相机预览,并且我需要一个表面视图以在上面绘制图形。还需要在相机预览上方绘制此第二表面,但具有透明背景。在我当前的实现中,我使曲面视图都按照预期的方式工作和出现,但是背景不是透明的,因此没有第二曲面视图的外观,绘制的图形叠加在相机预览曲面视图上。如何做到这一点?在搜索了许多堆栈溢出问题以及其他论坛后,我遇到了与此问题有关的许多相互矛盾的观点。有人说在Android中不可能对表面视图进行分层,而其他人则说这是使用不同的布局(FrameLayout与LinearLayout?)的问题。具体来说,我的实现包括两个视图:一个类,用于扩展SurfaceView的CustomCameraView,一个类,CustomDrawView,也扩展了FrameLayout中包含的SurfaceView,并且CustomDrawView出现在CustomCameraView之后。如何对它们进行分层,以便CustomDrawView看起来像叠加在CustomCameraView上?这也扩展了FrameLayout中包含的SurfaceView,并且CustomDrawView出现在CustomCameraView之后。如何对它们进行分层,以便CustomDrawView看起来像叠加在CustomCameraView上?这也扩展了FrameLayout中包含的SurfaceView,并且CustomDrawView出现在CustomCameraView之后。如何对它们进行分层,以便CustomDrawView看起来像叠加在CustomCameraView上?


问题答案:

我认为很多人都尝试过。Google引擎清楚地(here)声明,您应该避免堆叠Surface
View。即使有人发现了一些技巧,它也可能不兼容并会导致问题。

我认为这提供了三种选择,具体取决于您的要求:

  • 表面视图上方的视图

将“表面视图”用于“相机”预览,并在其顶部堆叠视图。这种方法的缺点是,在“普通”视图上绘制a)较慢,而b)在UI线程中进行。如果您自己实现线程,则可以解决b)。但是通常,如果叠加层包含UI元素或一些不需要频繁更新的Drawables之类的东西,那可能就是解决方法。

  • 在SurfaceView中执行所有操作

这样可以在运行时提供更好的性能和更少的开销。您只有一个SurfaceView。在SurfaceView上合成叠加层并在那里绘制所有内容。当然,您可以将两种方法结合起来。

  • 在GLSurfaceView中做所有事情

这可能是获得真正性能的方法。像上面一样,但是在GLSurfaceView中将摄像机视图渲染为OpenGL纹理。