我希望在相机顶部放置一个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命令可能有帮助)。
感谢您的帮助!
答案 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);
我自己刚刚完成了这个过程,所以我可能错过了一些细节。