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