在Android中的FrameLayout中分层SurfaceViews

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


我想很多人都试过这个。 Google Enginee明确声明(此处)应该避免堆叠表面视图。 即使有人发现了一些窍门,它可能不兼容,并会导致问题。

我认为这给出了三个选择,取决于您的要求:

  • 在曲面视图顶部的视图
  • 使用Surface View进行摄像机预览,并在其上面堆叠视图。 这种方法的缺点是,在“正常”视图a)上绘图较慢,并且b)在UI线程中发生。 你可以绕过b)如果你自己实现线程。 但通常情况下,如果您的叠加层包含UI元素或几个不需要经常更新的Drawable等东西,那可能就是这样。

  • 在SurfaceView中做所有事情
  • 这会使运行时的性能更好,开销更少。 你只有一个SurfaceView。 在SurfaceView上合成叠加层,并在那里绘制所有内容。 当然,你可以把两种方法结合起来。

  • 在GLSurfaceView中做所有事情
  • 这可能是真正表现的方式。 像上面一样,但在GLSurfaceView中使用相机视图渲染为OpenGL纹理。


    我使用以下方法在摄像头的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类型为SurfaceViewanimationViewcrosslinesViews类型为View 。 后面两个视图的onDraw()如下所示:

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

    祝你好运!

    链接地址: http://www.djcxy.com/p/66767.html

    上一篇: Layered SurfaceViews in a FrameLayout in Android

    下一篇: Transparent RelativeLayout which sits "on top" of a surfaceview?