6

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

4

2 回答 2

9

我想很多人都试过这个。Google Enginee 明确指出(此处),您应该避免堆叠 Surface Views。即使有人找到了一些技巧来做到这一点,它也可能不兼容并且会导致问题。

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

  • 表面视图顶部的视图

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

  • 在 SurfaceView 中执行所有操作

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

  • 在 GLSurfaceView 中做所有事情

这可能是实现真正性能的方法。和上面一样,但是相机视图渲染到GLSurfaceView中的 OpenGL 纹理。

于 2011-02-15T23:25:20.970 回答
2

我使用以下方法在相机的 SurfaceView 上方获得了 2 个透明视图:

我的活动在方法中设置了它的所有视图onCreate(),我没有为此使用任何布局文件。它看起来如下:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(null); //savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    cameraPreview = new CameraPreview(this);
    addContentView(cameraPreview, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

    animationView = new AnimationView(this);
    addContentView(animationView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

    crosslinesView = new CrosslinesView(this);
    addContentView(crosslinesView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
}

cameraPreview是 类型SurfaceViewanimationView并且crosslinesViews是 类型ViewonDraw()后两种视图如下所示:

protected void onDraw(Canvas canvas) {
    // Have the view being transparent
    canvas.drawARGB(0, 0, 0, 0);
    // Your drawing code goes here
    // ...
}

祝你好运!

于 2011-02-11T06:51:19.880 回答