2014-10-17 5 views
1

Я хочу поставить некоторые точки зрения на верхней поверхность GL, в конце концов я придумал решение со структурой:рендеринг Просмотры компонента более GLSurfaseView

enter image description here

У меня есть такие макеты структура с корневым макетом - FrameLayout:

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent> 

    <GLSurfaceView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_marginLeft="100dp" 
     android:layout_marginRight="100dp"/> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="fill_parent"> 

    // here I put all my views which I want to be on top of GL surface 

    </RelativeLayout> 

</FrameLayout> 

Он отлично работает на моей галактике Samsung s3 и эмуляторах (от android SDK и Genymotion). Но он не работает на Xperia, по какой-то причине на этом устройстве все графические объекты в GLSurfaceView не отображаются.

Не могли бы вы дать мне совет - мой подход правильный и что может вызвать проблему на некоторых устройствах?

Есть ли другой более правильный способ отображения представлений от android sdk поверх GLSurfaceView?

+0

GLSurfaceView не работает слишком хорошо с заполнением и/или полями на всех устройствах. См. Первый комментарий по этому вопросу для обхода; http://stackoverflow.com/questions/8772783/android-how-do-i-resize-the-glsurfaceview-so-i-can-add-buttons-around-the-outsi. – harism

+0

Какое разрешение изображения вы пытаетесь нарисовать? –

+0

Я пытаюсь нарисовать объекты gl (включая текстуры, полилинии и т. Д.), И после этого я хочу нарисовать Views (Кнопки и т. Д.) Поверх этой поверхности gl. Так что речь идет не о рисовании какого-либо изображения вообще – XZen

ответ

1

Фон: поверхность GLSurfaceView является полностью независимым слоем, скомпонованным системой, а не приложением. Он будет либо появляться над или под всеми видами, и не может быть зажат между ними. Существует три возможных Z-порядка относительно слоя «Вид», два ниже и один выше. Grafika «многоповерхностный тест» демонстрирует многократные перекрывающиеся прозрачные поверхности SurfaceView, разделяющие экран с помощью представлений.

По умолчанию поверхность появляется за представлением, что похоже на то, что вы хотите. Если вы не видите поверхность GLSurfaceView, вероятно, это связано с тем, что в представлении поверх нее есть непрозрачный фон. Я предполагаю, что тема UI по умолчанию отличается между вашими различными устройствами, а одна обеспечивает прозрачность, а другая - нет.

В API 14+ структура обеспечивает способ смешивания видов и поверхностей с использованием TextureView. Использование GLES с TextureView не намного сложнее, чем GLSurfaceView - вам просто нужно выполнить собственную настройку EGL. Библиотека GLES от Grafika демонстрирует, как это сделать.

+0

Спасибо за ответ. Кажется, что в случае перехода в TextureView я должен реализовать метод queueEvent. – XZen

+0

Ну, мне нужно взглянуть на документацию, мне просто не очень понятно, где все «волшебство» связано с GLThread, которое содержится в классе GLSurfaceView :) – XZen

+0

GLSurfaceView и связанные с ним классы - это просто помощники, построенные на вершине SurfaceView. Все это должно быть действительно перенесено в библиотеку поддержки; он не должен быть частью основной структуры. Все, что вам действительно нужно, это настроить EGL для рендеринга на Surface, а затем начать рисовать по вашему потоку выбора. – fadden