Мы боролись с некоторыми проблемами, связанными с SurfaceViews, более недели, и не нашли подходящего решения для них. Мы читаем другие вопросы на форуме относительно похожих проблем (и даже исходного кода Mixare), но не можем найти ответ, поэтому мы надеемся, что вы каким-то образом поможете нам.
Сценарий: У нас есть
- a SurfaceView для камеры
- a SurfaceView для слоя OpenGL, который находится поверх камеры.
- другой вид, который показывает некоторую информацию о том, что мы видим на экране. Это идет поверх обоих SurfaceViews.
Проблема:
Как бы мы ни старались, оба SurfaceViews, похоже, не ладят друг с другом. Если мы попытаемся:
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, В связи с этим мы использовали bringToFront()
в GLSurfaceView и получили его поверх информационного представления, но после блокировки/разблокировки камера все еще открывалась поверх него, оставляя нас с экраном только с предварительным просмотром камеры.
Любые идеи? Как мы можем показать как SurfaceViews, так и представление информации поверх них?