android - descargar - Conversión de GLSurfaceView a TextureView(a través de GLTextureView)
opengl es 3.1 android download (4)
¡Brillante!
Una pequeña adición a la brillante respuesta del Sr. Goodale:
La versión 4.1.1 de GLSurfaceView parece haber sido modificada para evitar la representación en una superficie de ancho / altura cero, creo. Y no parece haber una notificación gratuita enSurfaceTextureChanged inmediatamente después de onSurfaceTextureAvailable.
Si comienza con las fuentes 4.1.1, onSurfaceTextureAvailable debe leer lo siguiente:
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,
int height)
{
this.surfaceCreated(surface);
this.surfaceChanged(surface, 0,width,height);
}
Aparte de eso, estuve en marcha en aproximadamente cinco minutos. Gracias.
Cuando se lanzó Android 4.0 (Ice Cream Sandwich), se introdujo una nueva vista en el SDK. Esta vista es la TextureView. En la documentación, dice que TextureView se puede usar para mostrar contenido para una escena OpenGL.
Cuando busque cómo hacer esto, encontrará este enlace a un ejemplo.
https://groups.google.com/forum/?fromgroups=#!topic/android-developers/U5RXFGpAHPE
Sin embargo, solo quería reemplazar GLSurfaceView con TextureView, y mantener el resto de mi código igual, y solo recibir las ventajas de TextureView.
¡Gracias al Sr. Goodale y al Sr. Davies por las respuestas!
Tengo algo más acerca de la conversión GLSurfaceView a GLTextureView. El primero es sobre el modo render. Como se describe there solo elimine la llamada requestRender () en onSurfaceTextureUpdated.
El segundo es sobre
mGLESVersion = SystemProperties.getInt ("ro.opengles.version", ConfigurationInfo.GL_ES_VERSION_UNDEFINED); Solo usa el link , pero necesitas Context to do context.getClassLoader (); Puede llamar a la versión de reflexión de getInt desde init () y guardar el resultado en el campo estático sGLESVersion = getInt (getContext (), "ro.opengles.version", ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
Y el último cambio más fácil es sobre EGLLogWrapper.getErrorString (error); Solo copie getErrorString de las fuentes de EGLLogWrapper.
Ver la versión final de mi conversión GLSurfaceView a GLTextureView en GitHub Gist
Si quieres copiar / pegar una clase ya hecha, escribí una aquí:
Puede llamar a setRenderer (GLSurfaceView.Renderer), como con un GLSurfaceView.
Responder:
1) Comience con el código fuente de GLSurfaceView, nombre el archivo GLTextureView.java
2) Cambie el encabezado a: GLTextureView amplía los implementos TextureView SurfaceTextureListener
3) Cambiar el nombre de los constructores a GLTextureView. Eliminar código del método init ().
4) Organizar las importaciones. Elija siempre la opción que no sea GLSurfaceView.
5) Encuentre cada instancia de SurfaceHolder y cámbiela a SurfaceTexture
6) Agregue métodos no implementados para SurfaceTextureListener, cada método debe ser el siguiente:
- onSurfaceTextureAvailable - surfaceCreated (superficie)
- onSurfaceTextureDestroyed - surfaceDestroyed (surface), (return true)
- onSurfaceTextureSizeChanged - surfaceChanged (superficie, 0, ancho, alto)
- onSurfaceTextureUpdated - requestRender ()
7) Debe haber una línea donde se realiza una llamada a getHolder (), cámbiela a getSurfaceTexture ()
8) En el método init (), coloque la siguiente línea setSurfaceTextureListener(this)
Luego, agregue un OnLayoutChangeListener
y OnLayoutChangeListener
que se llame a surfaceChanged(getSurfaceTexture(), 0, right - left, bottom - top)
.
Con eso deberías poder reemplazar tu código GLTextureView
con GLTextureView
y recibir los beneficios de GLTextureView
. También asegúrese de que su aplicación sea compatible con la aceleración de hardware y que su Renderer amplíe GLTextureView
.Renderer.