java - Android FrameLayout 中的分层 SurfaceView

标签 java android transparency augmented-reality surfaceview

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

最佳答案

我想很多人都试过这个。一位 Google 工程师 ( here ) 明确指出,您应该避免堆叠表面 View 。即使有人找到了一些技巧来做到这一点,它也可能不兼容并会导致问题。

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

  • 表面 View 之上的 View

使用 Surface View 进行 Camera 预览并在其上堆叠 Views。这种方法的缺点是在“普通” View 上绘制 a) 速度较慢并且 b) 发生在 UI 线程中。如果您自己实现线程,则可以绕过 b)。但一般来说,如果您的叠加层包含诸如 UI 元素或一些不需要经常更新的 Drawable 之类的内容,那么这可能是可行的方法。

  • 在 SurfaceView 中做所有事情

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

  • 在 GLSurfaceView 中做所有事情

这可能是实现真正性能的方法。像上面一样,但是在 GLSurfaceView 中使用相机 View 渲染到 OpenGL 纹理.

关于java - Android FrameLayout 中的分层 SurfaceView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4965724/

相关文章:

java - 在 J2ME 中绘制透明弧线而不是图像?

css - 在图片的 div 上强制透明边框?

java - 为 Java servlet 管理数据库连接的最佳方法

java - android 4.1.2 html 代码中的文本颜色不起作用

android BitmapFactory.decodeStream 低质量

android - 为不同的 Android 屏幕尺寸/密度缩放 Phonegap 应用程序?

python - 调整文本背景透明度

java - 如何获取设备的总存储大小?

java - 我使用 MediaCodec 从 Buffer 获得的颜色类型是什么

java - 如何在没有 getter 的情况下获取附加到实体的实体列表?