android - 与 SurfaceView、Camera 和 OpenGL 战斗

标签 android opengl-es surfaceview glsurfaceview

一个多星期以来,我们一直在与 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/

相关文章:

android - 如何在 Android Studio/JetBrains IntelliJ IDEA 中编辑模板?

java - 在运行时更改 xml 或布局

android - 如何在 OpenGLES 中渲染到特定的 mip 级别?

java - 缩放 3D 对象会产生奇怪的结果

android - 如何制作圆形的表面 View

android - 将变量从 ListView 传递到另一个 Activity

java - 在java/Android中解析JSON

java - 我应该如何在游戏中绘制这个?

java - Drawable不会在SurfaceView上绘制,Thread实现,不重写onDraw

android - lockCanvas() 真的很慢