Перекрытие GLSurfaceView / SurfaceView

#java #android #opengl-es

#java #Android #opengl-es

Вопрос:

Я задавал вопрос об этом ранее, но не получил ответов, поэтому я пытаюсь снова.

Мне нужно сделать визуализированное 2D-изображение с некоторыми сопутствующими надписями и графикой на Motorola Xoom, Android 3.0. Хотя то, что мне нужно, можно сделать с помощью простого SurfaceView (Canvas) или просто GLSurfaceView, я бы действительно хотел использовать оба, потому что с GLSurfaceView рендеринг выполняется быстрее, а с SurfaceView проще создавать надписи и графику. Визуальный макет такой, как показано ниже. Визуальный макет SurfaceView / GLSurfaceView

Я попытался поместить SurfaceView сверху, объявив его в XML-макете после GLSurfaceView. SurfaceView прозрачен (за исключением тех мест, где я явно рисую материал), так что GLSurfaceView все еще можно увидеть.

Этот подход работал довольно хорошо, за одним огромным исключением. Все, что я рисую на SurfaceView, который находится в области GLSurfaceView, вообще не отображается. Чтобы убедиться в этом, я нарисовал некоторый текст, который находился прямо на границе (часть в общей области, часть просто в области SurfaceView), и он был обрезан на границе GLSurfaceView. Я пытался использовать метод «BringToFront», чтобы исправить это, но это не сработало.

Кто-нибудь может дать мне несколько идей о том, почему это не работает или что я могу с этим поделать? Это из-за того, что GLSurfaceView находится впереди, или из-за того, что GLSurfaceView записывает непосредственно в видеопамять, поэтому не имеет значения, находится ли что-то перед ним?

Ответ №1:

Способ работы SurfaceViews сделает невозможным выполнение того, что вы хотите. Вам нужно будет отобразить ваш текст внутри GLSurfaceView.

Ответ №2:

Никогда не пытайтесь перекрыть GLSurfaceView чем-либо (выше или ниже). В лучшем случае это прерывается на вашем устройстве, и вы обнаруживаете это рано, в худшем случае это работает на одном устройстве и не работает на других. Стисните зубы и делайте все в режиме GL view или ничего из этого. Если вам нужна скорость, то GL — это правильный путь.

Комментарии:

1. В моем приложении я накладываю множество элементов (кнопки, линейное описание, пользовательский вид и т.д… но без SurfaceView) поверх GLSurfaceView, в стеке FrameLayout. Это работает безупречно, и я никогда не слышал о какой-либо проблеме после 280000 загрузок и около 2000 писем в службу поддержки. Не могли бы вы, пожалуйста, подробнее рассказать о конкретных проблемах, с которыми вы столкнулись или о которых знаете?

2. В прошлый раз, когда я пытался поместить текст поверх GLSurfaceView, частота кадров снизилась, а фон текста выглядел шатким. Я обращался к нескольким цепочкам электронной почты с похожими проблемами. Возможно, вы нашли волшебную комбинацию, которая просто работает, или нам всем очень не повезло.

3. Хорошо, спасибо. Я не знаю ни о какой такой проблеме. Я попытаюсь задать конкретный вопрос по этому поводу для пояснения.

Ответ №3:

мы должны установить setZOrderMediaOverlay и setZOrderOnTop в истинное значение

setZOrderMediaOverlay

Добавленный в API уровень 5 void setZOrderMediaOverlay (логическое значение isMediaOverlay) Определяет, размещается ли поверхность вида surface поверх другого обычного вида surface в окне (но все еще за самим окном). Обычно это используется для размещения наложений поверх базового вида media surface.

Обратите внимание, что это значение должно быть установлено до того, как окно, содержащее surface view, будет подключено к оконному менеджеру.

Этот вызов переопределяет любой предыдущий вызов setZOrderOnTop (логическое значение).

Установите порядок поверх

Добавлено в API уровня 5 аннулирование setZOrderOnTop (логическое значение onTop), определяющее, размещается ли поверхность surface view поверх ее окна. Обычно оно размещается за окном, чтобы оно (по большей части) выглядело составным с представлениями в иерархии. Устанавливая это, вы заставляете его располагаться над окном. Это означает, что ничего из содержимого окна, в котором находится этот SurfaceView, не будет видно поверх его поверхности.

Обратите внимание, что это значение должно быть установлено до того, как окно, содержащее surface view, будет подключено к оконному менеджеру.

Этот вызов переопределяет любой предыдущий вызов setZOrderMediaOverlay (логическое значение).

Пожалуйста, перейдите по этой ссылке: http://developer.android.com/reference/android/view/SurfaceView.html#setZOrderMediaOverlay(boolean)