3

我希望在相机顶部放置一个 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 顺序可能会有所帮助)。

谢谢你的帮助!

4

1 回答 1

2

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

在Activity中创建派生自GLSurfaceView的MySurfaceView实例MyCameraPreview派生自SurfaceView的实例

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

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

于 2013-04-24T01:40:19.797 回答