Android将GLSurfaceView与相机的SurfaceView重叠

时间:2013-04-13 19:52:23

标签: java android opengl-es

我希望在相机顶部放置一个openGL模型(通过GLSurfaceView),它有自己的SurfaceView。当然这一定是可能的,像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的SetZOrderMediaOverlay属性;在上面的代码中将其设置为TRUE,3D立方体显示为黑色背景(即没有显示相机预览)。

参考文献:

我尝试过的其他测试:更改各个表面视图的addView顺序没有帮助;它只显示相机(我读到某处更改addView命令可能有帮助)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

由于您声明当前只能看到相机预览,因此您可能没有正确地订购视图。这就是我创造你想要的东西。

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

派生的MyCameraPreview实例

在我的Activity的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);

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