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

4 Solutions collect form web for “GLSurfaceView – cómo hacer el fondo translúcido”

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

  • Ocultar divisor sin ocultar childDivider en ExpandableListView
  • Cómo hacer un menú transparente de lujo como el "menú compartido" en la galería de Android?
  • Forma personalizada real del botón
  • Cómo crear una ActionBar como Google Play que se desvanece al desplazarse
  • Especificación de recortes transparentes en xml
  • Transparent InputMethod para Android
  • Asegúrese de que el área del mapa de bits sea transparente al tocar
  • Android, Transparente sub-GLSurfaceView en el diseño?
  • Creación de ImageButton de forma irregular con diferentes estados de clic
  • Android: Fondo de degradado de AppBarLayout
  • Cómo hacer Android Webview Background Transparente en KITKAT (4.4)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.