2013-05-26 12 views
9

Przepraszamy za mój angielski.Android GLSurfaceView przezroczyste tło bez zestawuZOrderonTop

Moja praca opiera się na https://github.com/harism/android_page_curl/

Po wielu godzinach badań, znalazłem kilka rozwiązań, ale nie dla wszystkich kwestii, co mam w mojej aplikacji. Mam pewne problemy z GLSurfaceView. Mam tło z relativeLayout, GLSurfaceView i nakładką na wierzchu.

<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> 

Kiedy init, mój pogląd:

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

W moim renderujący:

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(); 
} 

po wielu badaniach, jestem obecnie zablokowany z tego wyniku:
z setZOrderOnTop, mam tło, ale nakładka jest pod widok.
z setZOrderMediaOverlay, mam nakładkę, ale tło jest czarne.

Ktoś może mi pomóc?

+1

Mam ten sam dokładny problem, czy kiedykolwiek znalazłeś rozwiązanie? – aez

+0

Czy znaleziono jakieś rozwiązanie? – yarin

Odpowiedz

11

Ten pracował dla mnie:

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); 

znaleźć tutaj: http://andrewhague.wordpress.com/2011/05/24/how-to-set-a-transparent-glsurfaceview/

+0

Czy możesz umieścić przednią nakładkę na swoim widoku OpenGL? Znalazłem inne rozwiązanie, takie jak moja nakładka w opengl, ale jeśli ktoś ma rozwiązanie, które może mi pomóc edytować: kiedy mówię o nakładce, mówię o układzie względnym (nie jest elementem mojego widoku OpenGL) – user2422856

+0

Nie próbowałem. Właściwie to znalazłem to próbując czegoś przeciwnego. –

+0

Próbowałem tego w moim kodzie, ale nie działa, czy są jakieś problemy z konfiguracją shaderów? –

2

chciałbym osiągnąć to samo z widokiem na szczycie GLSurfaceView i nie znalazłem rozwiązanie bez ograniczeń. Po pierwsze, glView.setZOrderOnTop (true) daje prawidłowe przezroczyste tło, ale widok jest zawsze na wierzchu, bez względu na kolejność sortowania widoków. Po drugie, bez ZOrderOnTop hierarchia widoków jest zachowywana, ale tło GLSurface jest czarne lub kolor ustawiony za pomocą glClearColor (czerwony, zielony, niebieski, alfa) w rendererze. Niestety, argument alfa nie ma wpływu przy użyciu tej metody, chyba

android:windowIsTranslucent="true" 

i problem polega na tym, że może nie chcieć, aby przebić dziurę w widoku OS. Powinien być sposób, aby osiągnąć ten cel łatwo dla bardziej animowanego interfejsu użytkownika przy użyciu OpenGL. Przeszukałem tę stronę i inne, nie znajdując rozwiązania.

1

Pracuję nad tym samym problemem. Okazało się, że trzeba dokonać połączenia za

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

przed wywołaniem

setRenderer(...); 

powodzenia!

Powiązane problemy