Я пытался сделать то же самое, но, к сожалению, я не мог найти чистый способ сделать это. Мое решение требует постобработки записанных кадров и работает только в том случае, если слой, который вы хотите скрыть, является полупрозрачным наложением (все пиксели должны иметь альфа < 1).
Идея состоит в том, чтобы инвертировать альфа-смешение, выполняемое компонентом просмотра Android.
Пусть Cred, Cgreen, Cblue и Calpha быть цветовые компоненты для вашего наложения и пусть Бред, Bgreen, Bblue быть цветовые компоненты для всего, что в фоновом режиме , Окончательный цвет, который будет отображаться в кадре для каждого пикселя задается следующей формулой:
Ored = Bred * (1 - Calpha) + Cred * Calpha
Ogreen = Bgreen * (1 - Calpha) + Cgreen * Calpha
Oblue = Bblue * (1 - Calpha) + Cblue * Calpha
Если у вас есть точное растровое изображение наложения слоя, который вы хотите скрыть, вы можете восстановить цвета фона, как это :
Bred = (Ored - Cred * Calpha)/(1 - Calpha)
Bgreen = (Ogreen - Cgreen * Calpha)/(1 - Calpha)
Bblue = (Oblue - Cblue * Calpha)/(1 - Calpha)
Конечно, некоторая информация будет потеряна в процессе, потому что цвета в конечном итоге преобразуются в 8-битные целые числа. Таким образом, реконструкция может создавать визуальные артефакты, но она всегда должна выглядеть лучше черного наложения. Артефакты будут более или менее выражены в зависимости от альфа-канала вашего наложения (альфа-значения, близкие к 0, позволят вам более точно восстановить фоновый цвет).
Это будет работать только с изображениями с полным разрешением. Любой вид масштабирования или сжатия с потерями нарушит эту технику. Из-за ограничений хранения эта пост-обработка, вероятно, будет жизнеспособной, если она выполняется в режиме реального времени с использованием SurfaceTexture в шейдерном проходе.