Android: изображение поверх OpenGL-ES Game (HUD) - PullRequest
0 голосов
/ 13 января 2012

Я сделал базовую 3D-игру для Android и хочу добавить HUD. Как мне это сделать? Можно ли добавить макет, который остается поверх 3D-игры, или я должен сделать это с OpenGL?

Ответы [ 3 ]

2 голосов
/ 07 апреля 2012

Можно добавить один или несколько макетов поверх макета openGL.Для этого вы должны начать с RelativeLayout.Он будет содержать как OpenGL, так и Hud Layout.Порядок декларирования важен (сначала объявлен, сначала обработан).Чтобы изменить положение макета Hud, вы можете использовать атрибуты layout_margin или использовать match_parent, если это полное наложение.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativeLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- START of OpenGL Layout -->
    <LinearLayout
        android:id="@+id/openGLLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="0dp"
        android:layout_marginTop="0dp" >
    </LinearLayout>
    <!-- END of OpenGL Layout -->

    <!-- START of HUD Layout -->
    <LinearLayout
        android:id="@+id/hudLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:layout_marginTop="50dp">
        <TextView 
            android:id="@+id/hudText"
            android:text="Hud Text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        </TextView>
    </LinearLayout>
    <!-- END of HUD Layout -->

</RelativeLayout>

В этом примере макет OpenGL - это empy LinearLayout, используемый в качестве контейнера,Я добавляю свой собственный GLSurfaceView к этому RelativeLayout по коду:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState)

    setContentView( R.layout.main );
    MyOpenGLSurfaceView view = new MyOpenGLSurfaceView( getApplication() );
    LinearLayout openGLLayout = (LinearLayout)findViewById(R.id.openGLLayout);
    openGLLayout.addView(mView);
}

Я использую этот метод в основном для всплывающих окон подтверждения или контекстных меню.Таким образом, мне не нужно создавать свои собственные кнопки, используя openGL.

1 голос
/ 13 января 2012

Типичное решение - нарисовать 3D-сцену, затем переключиться на ортогональную проекцию и раскрасить HUD, используя OpenGL. Размещение обычных компонентов поверх холста OpenGL, вероятно, приведет к непредсказуемым результатам (они могут мерцать или просто быть невидимыми).

0 голосов
/ 21 мая 2013

У меня была та же проблема, и я боролся с ней почти год.Я не использовал макет xml, но вместо этого добавляю представления в java следующим образом:

rel.addView(camPreview, camParams);
rel.addView(glView, glParams);
rel.addView(imageView, imageParams); 

Одно из предложений, которое я получил, было добавить параметр индекса az к вызовам addView следующим образом:

rel.addView(camPreview, 0, camParams);
rel.addView(glView, 1, glParams);
rel.addView(imageView, 2, imageParams);

но это тоже не сработало ..

я даже попытался перейти на макет xml, но все равно не то, что хотел

, в конце концов решение было:

glView.setZOrderMediaOverlay(true);
rel.addView(camPreview, camParams);
rel.addView(glView, glParams);
rel.addView(imageView, imageParams);

ПРИМЕЧАНИЕ: setZOrderMediaOverlay (true) необходимо вызвать перед тем, как вы фактически добавите представление

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...