一个多星期以来,我们一直在与 SurfaceViews 相关的一些问题作斗争,但没有找到合适的解决方案。我们阅读了论坛中关于类似问题(甚至 Mixare 源代码)的其他问题,但找不到答案,所以我们希望您能以某种方式帮助我们。
场景: 我们有
- 相机的 SurfaceView
- OpenGL 层的 SurfaceView,位于相机顶部。
- 另一个 View ,它显示了一些关于我们可以在屏幕上看到的信息。这个位于两个 SurfaceView 之上。
问题:
无论我们多么努力,两个 SurfaceView 显然都不能很好地相处。如果我们尝试:
setContentView(mCameraPreview);
addContentView(mGLSurfaceView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
addContentView(mInfoView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
(这似乎合乎逻辑),一切都按预期进行,直到我们锁定/解锁手机。之后,GLSurfaceView 就消失了(不是 InfoView,那个仍然显示)。
相反,如果我们尝试:
setContentView(mGLSurfaceView);
addContentView(mCameraPreview, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
addContentView(mInfoView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
然后问题是 GLSurfaceView 只在锁定/解锁后出现,而在此之前屏幕显示相机和 InfoView。
我们发现,如果我们在显示 View 的 Activity 中执行 onStart() 后让主线程休眠 4.6 秒(或更长时间),则行为符合预期(显示相机、glsurface 和信息 View ,即使在锁定/解锁)。
问题是,我们正在寻找一个更……优雅的解决方案。
在我们看来,问题是相机在 Camera.open()
中花费的时间比预期的要多,所以添加了相机 View ,添加了 GLSurfaceView,当相机实际打开,它在 GLSurfaceView 的顶部打开。关于这一点,我们在 GLSurfaceView 上使用了 bringToFront()
,并将其置于信息 View 之上,但是在锁定/解锁之后,相机仍然在其之上打开,给我们留下了一个带有仅相机预览。
有什么想法吗?我们如何才能同时显示 SurfaceView 和它们之上的信息 View ?
最佳答案
试试这个:
mLayout.addView(mRenderView);
mLayout.addView(mCustomSurfaceView);
// without this line, the camera preview cannot be displayed
// when running activity at first time.
mCustomSurfaceView.setZOrderMediaOverlay(true);
这对我有用:)
关于android - 与 SurfaceView、Camera 和 OpenGL 战斗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5648221/