Прозрачный фон Android GLSurfaceView без setZOrderonTop

Извините за мой английский.

Моя работа основана на https://github.com/harism/android_page_curl/.

После многих часов исследований я нашел несколько решений, но не для всех проблем, которые у меня есть в моем приложении. У меня проблемы с GLSurfaceView. У меня есть фон с относительным макетом, GLSurfaceView и наложением сверху.

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/background"
    android:layout_width="match_parent"
    android:background="@layout/backgroundrepeat"
    android:layout_height="match_parent">
<com.m2y.foxprez.view.CurlView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/openglview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/overlay"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
</RelativeLayout>

When I init my view :

setEGLConfigChooser(8,8,8,8,16,0);
setRenderer(renderer);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
setZOrderMediaOverlay(true);

В моем рендерере:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glClearColor(0f, 0f, 0f, 0f);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    gl.glHint(GL10.GL_LINE_SMOOTH_HINT, GL10.GL_NICEST);
    gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST);
    gl.glEnable(GL10.GL_LINE_SMOOTH);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glDisable(GL10.GL_CULL_FACE);
}

public synchronized void onDrawFrame(GL10 gl) {
    gl.glClearColor(0f,0f,0f,0f);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    gl.glLoadIdentity();
}

После нескольких исследований я в настоящее время заблокирован с этим результатом:
с setZOrderOnTop у меня есть фон, но оверлей находится под видом.
с setZOrderMediaOverlay у меня есть оверлей, но фон черный.

Кто-нибудь может мне помочь?


person user2422856    schedule 26.05.2013    source источник


Ответы (5)


Это сработало для меня:

final GLSurfaceView glView = (GLSurfaceView) findViewById(R.id.glView);

glView.setZOrderOnTop(true);
glView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
glView.getHolder().setFormat(PixelFormat.RGBA_8888);
glView.setRenderer(new MyRenderer());
glView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

Найдено здесь: http://andrewhague.wordpress.com/2011/05/24/how-to-set-a-transparent-glsurfaceview/

person Dario Castañé    schedule 01.06.2013
comment
Можете ли вы поместить какой-нибудь оверлей на свой вид opengl? Я нашел другое решение, например сделать наложение в opengl, но если у кого-то есть решение, которое может помочь мне отредактировать: когда я говорю о наложении, я говорю об относительном макете (не элемент моего представления opengl) - person user2422856; 08.06.2013
comment
Я не пробовал. На самом деле, я нашел это, пытаясь наоборот. - person Dario Castañé; 22.06.2013
comment
Я попробовал это в своем коде, но он не работает, есть ли проблемы с настройкой шейдеров? - person mayank_droid; 04.09.2013

Я хотел бы сделать то же самое с представлением поверх GLSurfaceView, и я не нашел решения без ограничений. Во-первых, glView.setZOrderOnTop(true) дает правильный прозрачный фон, но представление всегда находится сверху, независимо от последовательности упорядочивания представлений. Во-вторых, без ZOrderOnTop иерархия представления сохраняется, но фон GLSurface черный или цвет, установленный с помощью glClearColor(красный, зеленый, синий, альфа) в средстве визуализации. К сожалению, альфа-аргумент не действует при использовании этого метода, если только

android:windowIsTranslucent="true"

и проблема с этим в том, что вы можете не захотеть пробить дыру в представлении ОС. Должен быть способ сделать это легко для более анимированного пользовательского интерфейса с использованием openGL. Я искал этот сайт и другие, но не нашел решения.

person GregM    schedule 06.02.2014

На этот вопрос уже есть ответ для общего случая. Если вы ищете решение с LibGDX, вот оно.

ответ @DarioCastañé, но с LibGDX 1.9.12:

(код Котлина):

val config = AndroidApplicationConfiguration().apply {
    r = 8
    g = 8
    b = 8
    a = 8
    depth = 16
    stencil = 0
}

val view = initializeForView(MyGame(), config)

if (view is GLSurfaceView) {
    view.setZOrderOnTop(true)
    view.holder.setFormat(PixelFormat.RGBA_8888)
}

return view // in Fragment
setContentView(view) // in Activity

в вашем методе render():

Gdx.gl.glClearColor(0f, 0f, 0f, 0f)
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)

Это, под капотом, будет делать то же самое.

person GV_FiQst    schedule 25.01.2021

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

setZOrderOnTop(true);
getHolder().setFormat(PixelFormat.RGBA_8888);

до звонка в

setRenderer(...);

Удачи!

person Brian Titus    schedule 09.03.2018

Я также столкнулся с той же проблемой, что ничего не отображалось, когда я использовал GLSurfaceView.

После получения ссылки на GLSurfaceView сделайте так

glSurface=findViewById(R.id.gl_surfaceview)

//this is the import line only

glSurface.setZOrderOnTop(false)

теперь все мои представления видны поверх GLSurfaceView

Спасибо.

person user2610335    schedule 31.07.2018