Борьба с SurfaceView, камерой и OpenGL

Мы боремся с некоторыми проблемами, связанными с SurfaceView, более недели и не нашли для них подходящего решения. Мы читаем другие вопросы на форуме относительно аналогичных проблем (и даже исходного кода Mixare), но не смог найти ответа, поэтому мы надеемся, что вы можете нам чем-то помочь.

Сценарий: У нас есть

  • SurfaceView для камеры
  • SurfaceView для слоя OpenGL, который находится поверх камеры.
  • еще один 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.

Мы обнаружили, что если мы спим основной поток на 4. Через 6 секунд (или более) после выполнения onStart () в действии, которое отображает представления, поведение соответствует ожидаемому (отображаются как камеры, так и glsurface и информационные представления, даже после блокировки / разблокировки).

Дело в том, что мы ищем более ... элегантное решение.

Нам кажется, что проблема в том, что камера занимает больше времени, чем ожидалось в Camera.open () , поэтому добавляется вид камеры, добавляется GLSurfaceView, и когда камера действительно открывается , он открывается поверх GLSurfaceView. Что касается этого, мы использовали takeToFront () в GLSurfaceView и разместили его поверх информационного окна, но после блокировки / разблокировки камера все еще открывалась поверх него, оставив нам экран с камерой только предварительный просмотр.

Есть идеи? Как мы можем показать и SurfaceView, и информационное представление поверх них?

11
задан genpfault 13 April 2011 в 14:52
поделиться