Предварительный просмотр Camera2 черный, если я добавляю GLSurfaceView впереди

Я хочу сделать анимацию OpenGL (GLSurfaceView) перед предварительным просмотром API Camera2 (TextureView), но анимация непрозрачна. Я добавил GLSurfaceView перед TextureView.

  • это работает только в том случае, если я установил setZOrderOnTop(true); в GLSurfaceView, но тогда все кнопки, а также ящик находятся за видом...

Есть ли способ сделать GLSurfaceView (анимацию) прозрачным?


person Manuel Schmitzberger    schedule 03.02.2016    source источник


Ответы (2)


SurfaceView (и его подкласс GLSurfaceView) состоит из двух частей: Surface и View. Surface предоставляет доступ к отдельному слою, независимому от слоя View UI. Вы можете расположить его перед или за слоем View, но он не может поместиться «между» Views.

Использование setZOrderOnTop(true) — это правильный способ разместить поверхностный слой перед представлениями. Если это не то, что вам нужно, вам следует вместо этого рассмотреть возможность использования TextureView, так как они отображаются на слое View и могут располагаться выше или ниже отдельных View.

Вы можете визуализировать TextureView (или что-либо еще с Surface) с помощью OpenGL ES. См., например, действие «простой GL в TextureView» в Grafika.

person fadden    schedule 03.02.2016
comment
Спасибо за хороший ответ! Сейчас я использовал TexturveView, но проблема в том, что он не прозрачен. А также setOpaque(false) не работает... - person Manuel Schmitzberger; 05.02.2016
comment
setOpaque(false) необходимо (по умолчанию система предполагает непрозрачность). Убедитесь, что вы очищаете пиксели с прозрачностью, например. canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR) (обратите внимание на явный режим наложения) или glClear(0,0,0,0). Вы используете setAlpha()? Один ответ (stackoverflow.com/questions/18993355) также нашел успех, поработав с макетом. - person fadden; 05.02.2016
comment
Это невозможно с TextureView. Даже если вы визуализируете прозрачный чистый цвет, он будет на белом фоне из-за того, как Android использует представления текстур в своей системе рисования. - person Manuel Schmitzberger; 22.02.2016

setZOrderOnTop() работает, но это означает, что выше прозрачного SurfaceView у вас ничего быть не может, что очень жаль.

Единственный способ — заменить TextureView предварительного просмотра Camera2 на SurfaceView. Тогда я могу использовать setZOrderMediaOverlay(true); в GLSurfaceView.

setZOrderMediaOverlay (логическое значение isMediaOverlay)

Контролируйте, размещается ли поверхность вида поверхности поверх другого обычного вида поверхности в окне (но все же за самим окном).

person Manuel Schmitzberger    schedule 23.02.2016