Java Android覆盖GLSURFACHEVIEW和摄像头';s SurfaceView

Java Android覆盖GLSURFACHEVIEW和摄像头';s SurfaceView,java,android,opengl-es,Java,Android,Opengl Es,我希望将openGL模型(通过GLSURFACHEVIEW)放在相机的顶部,它有自己的SURFACHEVIEW。当然这是可能的,像Layar这样的应用程序可以做到这一点 以下是我正在尝试的: public class MainActivity extends Activity { private CameraSurfaceView mCameraSurfaceView; private GLSurfaceView mCubeGLSurfaceView; priva

我希望将openGL模型(通过GLSURFACHEVIEW)放在相机的顶部,它有自己的SURFACHEVIEW。当然这是可能的,像Layar这样的应用程序可以做到这一点

以下是我正在尝试的:

public class MainActivity extends Activity {


    private CameraSurfaceView mCameraSurfaceView; 
    private GLSurfaceView mCubeGLSurfaceView; 
    private FrameLayout mFrameLayout; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        mFrameLayout = new FrameLayout(this); 

        mCameraSurfaceView = new CameraSurfaceView(this);

        mCubeGLSurfaceView = new GLSurfaceView(this);
        mCubeGLSurfaceView.setRenderer(new CubeRenderer()); 
        //mCubeGLSurfaceView.setZOrderMediaOverlay(true);

        mFrameLayout.addView(mCameraSurfaceView); 
        mFrameLayout.addView(mCubeGLSurfaceView); 

        setContentView(mFrameLayout); 

    }

}
现在:只有摄像机出现了。我在网上读到了关于GLSurfaceView的setzordermediagoverlay属性的内容;在上面的代码中设置为TRUE,则3D立方体显示为黑色背景(即不显示相机预览)

参考资料:

  • 以下是我正在使用的多维数据集OpenGL代码:
  • 以下是CameraSurfaceView代码:
我尝试过的其他测试:更改相应SurfaceView的addView顺序没有帮助;它只显示相机(我在某处读到更改addView顺序可能会有所帮助)


谢谢你的帮助

由于您声明当前只有相机预览可见,因此可能是您没有正确排序视图。这就是我所做的来创造你想要的

在活动中创建 从GLSurfaceView派生的MySurfaceView实例 从SurfaceView派生的MyCameraPreview实例

在活动的onCreate方法中,我执行以下操作:

mySurfaceView = new MySurfaceView(this);
addContentView(mySurfaceView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
myCameraPreview = new MyCameraPreview(this, myCamera);
addContentView(myCameraPreview, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
请注意,使用此方法不会使用布局xml

这将创建两个相互重叠的视图,并将摄影机预览置于背景中

现在,您需要让MySurfaceView绘制一个透明的背景,以便摄影机预览将显示在渲染的对象后面。如果您使用的是OpenGL ES 2.0,请将其添加到MySurfaceView类的构造函数中

setEGLContextClientVersion(2);
setEGLConfigChooser(8,8,8,8,16,0);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

我自己刚刚完成了这个过程,所以我可能错过了一些细节。

是否认为您一次只能进行一次SurfaceView?