Android: что такое растровое изображение цвета по умолчанию для SurfaceView и как его изменить?

В моем приложении полупрозрачный Activity с android:windowIsTranslucent установлен на true. Activity содержит FrameLayout, к которому я программно добавляю SurfaceView.

По умолчанию SurfaceView рисует растровое изображение, как Activity фон Theme, который в моем случае в Translucent, поэтому SurfaceView показывает прозрачное растровое изображение.

Для установки фона я использовал SurfaceHolder callbacks следующим образом:

surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                Canvas canvas = holder.lockCanvas();
                if (canvas != null) {
                    canvas.drawRGB(255, 255, 255);
                    holder.unlockCanvasAndPost(canvas);
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                Canvas canvas = holder.lockCanvas();
                if (canvas != null) {
                    canvas.drawRGB(255, 255, 255);
                    holder.unlockCanvasAndPost(canvas);
                }
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
            }
        });

В surfaceCreated()/surfaceChanged() я рисую цвет.

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

Таким образом, пользователь на мгновение видит Прозрачный фон.

Мои вопросы:

  1. Использует ли SurfaceView цвет окна Activity для рисования растрового изображения по умолчанию?
  2. Можем ли мы изменить color, который SurfaceViewиспользует для рисования растрового изображения по умолчанию?

person Sagar Trehan    schedule 13.05.2016    source источник
comment
На самом деле не отвечает на ваш вопрос, но использует TextureView вместо SurfaceView. SurfaceViews ужасны и не вызывают ничего, кроме проблем.   -  person Xaver Kapeller    schedule 13.05.2016
comment
@XaverKapeller: Спасибо за предложение. Но использование TextureView вместо SurfaceView не в моих силах.   -  person Sagar Trehan    schedule 13.05.2016
comment
Возможно, вы сможете решить свою проблему, просто назначив фон для SurfaceView. По умолчанию Surfaceview на самом деле ничего не рисует (поэтому вы видите за ним прозрачную активность). Это, однако, просто обычный View в глубине души.   -  person DeeV    schedule 13.05.2016
comment
@DeeV: Мой SurfaceView воспроизводит видеоконтент, когда я устанавливаю для него setBackgroundColor(), тогда видео не видно, но воспроизводится, и я думаю, что оно находится за фоном. Пожалуйста помоги   -  person Sagar Trehan    schedule 13.05.2016
comment
Две идеи. Используйте SurfaceView#setZOrderMediaOverlay() или SurfaceView#setZOrderOnTop(). Имейте в виду, что это поместит видео поверх всего, что означает, что вы не сможете накладывать Views поверх SurfaceView. Вторая идея состоит в том, чтобы установить фон на свой цвет, но затем установить его на ноль при вызове onSurfaceCreated(). Затем снова установите фон при вызове onSurfaceDestroyed().   -  person DeeV    schedule 13.05.2016
comment
Я не устанавливаю их как ответы, так как не уверен на 100%, что они решат вашу проблему.   -  person DeeV    schedule 13.05.2016
comment
@DeeV: Спасибо за помощь. Я уже пробовал подход SurfaceView#setZOrderMediaOverlay() или SurfaceView#setZOrderOnTop(), но, как вам, мне нужно наложение, поэтому я игнорирую этот подход. Но я пробую второе решение. Будет обновляться через некоторое время. Спасибо   -  person Sagar Trehan    schedule 13.05.2016
comment
Имейте в виду, что SurfaceViews состоит из двух частей: Surface и View. Они управляются и обновляются независимо. Вы можете обращаться с частью представления как с пользовательским представлением, но часть поверхности — это независимый слой, который частично управляется другим процессом, поэтому при перемещении элементов могут возникать визуальные сбои. @XaverKapeller: SurfaceViews на самом деле очень полезны, но их часто неправильно понимают, а множество плохих руководств и примеров не помогают. См. Grafika для примеров правильного использования.   -  person fadden    schedule 13.05.2016
comment
@fadden/@Deev: Попытка исправить с помощью следующего подхода, но это не помогло: установка фона на SurfaceView --> Рисование цвета поверхности в onSurfaceCreated() и установка фона на ноль --> Когда поверхность уничтожена, затем установка фона на черный цвет. Это работает хорошо, но, как сказал @fadden, есть некоторые сбои при изменении размера вида, который на мгновение виден прозрачным.   -  person Sagar Trehan    schedule 14.05.2016
comment
@Deev/@fadden: Один вопрос: когда представление поверхности будет уничтожено, весь контент, который мы нарисовали на нем, также исчезнет?   -  person Sagar Trehan    schedule 17.05.2016
comment
@SagarTrehan, ты наконец нашел решение? В настоящее время я сталкиваюсь с точно такой же проблемой.   -  person jenzz    schedule 26.07.2016
comment
@jenzz: Нет, я еще не нашел решения. Я добавляю хак, чтобы исправить эту проблему. Хак заключается в том, что при загрузке контента в проигрыватель я добавляю черный фон в порядке z поверх вида проигрывателя, и как только вызывается обратный вызов onPlaying(), я устанавливаю видимость вида порядка z в GONE. Это ОПРЕДЕЛЕННО НЕ ПРАВИЛЬНОЕ РЕШЕНИЕ. Я все еще борюсь. Пожалуйста, дайте мне знать, если что-то нашел.   -  person Sagar Trehan    schedule 26.07.2016