一个多星期以来,我们一直在解决一些与 SurfaceViews 相关的问题,但没有找到合适的解决方案。我们阅读了论坛中有关类似问题的其他问题(甚至是 Mixare 源代码),但找不到答案,因此我们希望您能以某种方式帮助我们。
场景:我们有
- 相机的 SurfaceView
- 用于 OpenGL 层的 SurfaceView,位于相机顶部。
- 另一个视图,它显示了一些关于我们可以在屏幕上看到的信息。这个位于两个 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。
我们发现,如果我们在显示视图的 Activity 中执行 onStart() 后让主线程休眠 4.6 秒(或更长时间),则行为符合预期(即使在锁定/解锁之后,也会显示相机、glsurface 和信息视图)。
问题是,我们正在寻找一个更...优雅的解决方案。
在我们看来,问题在于相机花费的时间比预期的要多Camera.open()
,因此添加了相机视图,添加了 GLSurfaceView,当相机实际打开时,它在 GLSurfaceView 之上打开。关于这一点,我们bringToFront()
在 GLSurfaceView 上使用,并将它放在信息视图的顶部,但是在锁定/解锁后,相机仍然在它上面打开,给我们留下了一个只有相机预览的屏幕。
有任何想法吗?我们怎样才能同时显示 SurfaceView 和它们之上的信息视图?