GLSurfaceView – cómo hacer el fondo translúcido

Intento rendir usando GLSurfaceView, y por docs fijo el formato:

getHolder().setFormat(PixelFormat.TRANSLUCENT); 

El uso GLSurfaceView.Renderer, que dibuja en onDrawFrame:

 GLES20.glClearColor(0, 0, 1, .5f); GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 

Sin embargo, la representación GL en GLSurfaceView no es translúcida y es totalmente azul. Si omito la llamada de glClear, entonces es totalmente negro.

¿Cómo hago la representación de GL para tener un fondo transparente, de modo que se mezcla con las vistas dibujadas detrás de ella?

Introduzca aquí la descripción de la imagen

EDIT : aquí está mi GLSurfaceView:

 class GLView extends GLSurfaceView{ MyRenderer r; public GLView(Context ctx){ super(ctx); setEGLContextClientVersion(2); getHolder().setFormat(PixelFormat.TRANSLUCENT); setEGLConfigChooser(8, 8, 8, 8, 16, 0); r = new MyRenderer(getContext()); setRenderer(r); } } 

OK, después de algunas investigaciones puedo responder a esto yo mismo.

Finalmente lo hice para dibujar con transparencia usando SurfaceView.setZOrderOnTop (true). Pero luego perdí la posibilidad de colocar otras vistas en la parte superior de mi GLSurfaceView.

Terminé con dos posibles resultados:

detrásen la parte superior

A la izquierda hay una superficie GL estándar debajo de todas las otras vistas, que no se pueden dibujar con transparencia, ya que la superficie GL se dibuja antes de la superficie de la ventana de la aplicación y GLSurfaceView acaba de perforar el agujero en su ubicación para que se vea la superficie GL.

A la derecha es la superficie GL transparente dibujada con setZOrderOnTop (true), por lo que su superficie se dibuja en la parte superior de la ventana de la aplicación. Ahora es transparente, pero se dibuja en la parte superior de otras vistas puestas en ella en la jerarquía de vista.

Así que parece que la aplicación tiene una ventana con superficie para su jerarquía de vista, y SurfaceView tiene una superficie propia para GL, que puede estar en la parte superior o inferior de la ventana de la aplicación. Desafortunadamente, la vista GL transparente no se puede ordenar correctamente dentro de la jerarquía de vistas con otras vistas encima de ella.

Necesita RGBA 8888 formato de píxel para la translucidez:

 private void init( boolean translucent, int depth, int stencil ) { /* By default, GLSurfaceView() creates a RGB_565 opaque surface. * If we want a translucent one, we should change the surface's * format here, using PixelFormat.TRANSLUCENT for GL Surfaces * is interpreted as any 32-bit surface with alpha by SurfaceFlinger. */ this.getHolder().setFormat( PixelFormat.RGB_565 ); if ( translucent ) { this.getHolder().setFormat( PixelFormat.TRANSLUCENT ); } setEGLContextFactory( new ContextFactory() ); /* We need to choose an EGLConfig that matches the format of * our surface exactly. This is going to be done in our * custom config chooser. See ConfigChooser class definition * below. */ setEGLConfigChooser( translucent ? new ConfigChooser( 8, 8, 8, 8, depth, stencil ) : new ConfigChooser( 5, 6, 5, 0, depth, stencil ) ); setRenderer( new Renderer() ); } 

¿Ha pensado en usar un LayerDrawable con setAlpha? He aquí un ejemplo que tengo de dos imágenes … una es transparente (por el setAlpha) y la otra no. La 'calendar_cell' es sólida y está en la parte posterior, luego viene la caja que es transparente para mostrar la celda de calendario detrás de ella. De esta manera puede apilar tantas imágenes como desee, dándoles una transparencia diferente.

 Drawable []layers = new Drawable [2]; int imageResource1 = mContext.getResources().getIdentifier("drawable/calendar_cell", null, mContext.getPackageName()); Drawable background = v.getResources().getDrawable(imageResource1); layers [0]= background; int imageResource = mContext.getResources().getIdentifier("drawable/box_" + box, null, mContext.getPackageName()); Drawable boxImg = v.getResources().getDrawable(imageResource); boxImg.setAlpha(100); layers [1]= boxImg; LayerDrawable layerDrawable = new LayerDrawable (layers); v.setBackground(layerDrawable) 

No estoy seguro de cuál es exactamente el problema, pero una alternativa podría cubrir la pantalla con un rectángulo de color translúcido y simplemente borrar el bit de buffer de profundidad.

¿Hay alguna alternativa para GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT)?

De lo contrario, asegúrese de que su bit de profundidad bit 1

Volveré más tarde para tratar de recrear el problema en mi teléfono en un poco cuando pueda.

Edit : Acabo de darse cuenta de que la razón por la que parece azul puede ser que usted lo establece en. 5f por lo que sólo se necesita 2 llamadas para que llegue a 1f completa opacidad. Lo que significa que toma a 30fps 1 / 15th de un segundo para ir totalmente azul.

Intente bajar el valor de transparencia alfa a 0.01f o 0.05f

  • Totalmente transparente ActionBarSherlock utilizando el tema
  • GIF transparente en Android ImageView
  • Problema con Android OptionsMenu, el fondo siempre es transparente
  • Android: Fondo de degradado de AppBarLayout
  • Android XML dibujable degradado transparente
  • Vista transparente sobre ImageView
  • Android WebView estilo background-color: transparente ignorado en android 2.2
  • Cómo hacer Android Webview Background Transparente en KITKAT (4.4)
  • Forma personalizada real del botón
  • Android ScriptIntrinsicBlur no desenfoca toda la imagen y genera un borde transparente
  • Android: Transparencia PNG fallando con BitmapFactory.decodeStream (...) y carpeta de activos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.