2013-05-26 16 views
9

Ci scusiamo per il mio inglese.Android GLSurfaceView sfondo trasparente senza setZOrderonTop

Il mio lavoro si basa su https://github.com/harism/android_page_curl/

Dopo molte ore di ricerca, ho trovato un paio di soluzioni, ma non per tutti i problemi quello che ho nella mia applicazione. Ho qualche problema con un GLSurfaceView. Ho uno sfondo con una relativaLayout, una GLSurfaceView e una sovrapposizione in cima.

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

Quando ho init mio punto di vista:

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

Nel mio renderer:

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

Dopo la ricerca multipla, attualmente sto bloccato con questo risultato:
con setZOrderOnTop, ho lo sfondo, ma l'overlay è sotto la vista.
con setZOrderMediaOverlay, ho la sovrapposizione, ma lo sfondo è nero.

Qualcuno può aiutarmi?

+1

Ho lo stesso identico problema, hai mai trovato una soluzione? – aez

+0

Qualche soluzione trovata? – yarin

risposta

11

questo ha funzionato per me:

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

trovate qui: http://andrewhague.wordpress.com/2011/05/24/how-to-set-a-transparent-glsurfaceview/

+0

Puoi mettere un fronte overlay nella tua vista opengl? Ho trovato qualche altra soluzione, come la mia sovrapposizione in opengl, ma se qualcuno ha una soluzione che può aiutarmi modificare: quando parlo di sovrapposizione, parlo di un layout relativo (non un elemento della mia vista opengl) – user2422856

+0

Non ci ho provato. In realtà, ho trovato questo mentre provavo il contrario. –

+0

Ho provato questa cosa nel mio codice ma non funziona, ci sono problemi nella configurazione degli shader? –

2

vorrei ottenere lo stesso risultato con vista sulla cima di una GLSurfaceView e non ho trovato una soluzione senza limitazioni. Innanzitutto, glView.setZOrderOnTop (true) fornisce lo sfondo trasparente corretto ma la vista è sempre in primo piano, indipendentemente dalla sequenza delle viste degli ordini. In secondo luogo, senza ZOrderOnTop viene mantenuta la gerarchia della vista, ma lo sfondo GLSurface è nero o il colore impostato con glClearColor (rosso, verde, blu, alfa) nel renderer. Purtroppo, l'argomento alpha non ha alcun effetto quando si utilizza questo metodo a meno che

android:windowIsTranslucent="true" 

e il problema con questo è che non si può decidere di fare un buco nella vista operativo. Ci dovrebbe essere un modo per farlo facilmente per un'interfaccia utente più animata che usa openGL. Ho cercato questo sito e altri senza trovare una soluzione.

1

Sto lavorando allo stesso problema. Ho scoperto che si deve effettuare le chiamate per

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

prima della chiamata a

setRenderer(...); 

Buona fortuna!