2010-07-31 14 views
5

Estoy tratando de crear una aplicación 3D simple para Android que tendrá una vista adicional en capas sobre la vista OpenGL (muy similar al ejemplo de SurfaceViewOverlay en las demostraciones de la API). Me encuentro con un problema al tratar de implementar ese método con una clase extendida GLSurfaceView. He creado un ejemplo en el que intento hacer una combinación de this demo con la demostración API Oerlay. Si trato de echar a VortexView objeto de un Martin como esto (reemplazar las líneas 44-46 en la demo API)Android OpenGL que extiende excepciones de puntero nulo GLSurfaceView

VortexView glSurfaceView= 
    (VortexView) findViewById(R.id.glsurfaceview); 

consigo un error ClassCastException (lo cual es comprensible, como supongo fundición es bastante específico) así que Supongo que estoy buscando un método para transferir la vista de una instancia GLSurfaceView a una nueva subclase o una forma de establecer la superficie de representación en una vista definida XML para una subclase después de que se haya creado.

EDIT: He hecho algunos progresos tratando de conseguir que esto de obra en el ejemplo de la API XML utiliza la vista (de ApiDemos/res/layout/surface_view_overlay.xml)

 <android.opengl.GLSurfaceView android:id="@+id/glsurfaceview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

Si Cambio ese elemento a
com.domain.project.VortexView que hará el casting correctamente con el código anterior, pero genera excepciones de puntero nulo cuando golpea las rutinas surfaceCreated y surfaceChanged (creo que son los métodos llamados en la clase GLThread basado en el número de línea) dentro de la clase GLSurfaceView. Así que tal vez debería cambiar la pregunta: ¿Cómo puedo implementar una extensión para GLSurfaceView sin generar NullPointerExceptions en surfaceCreated y surfaceChanged, o cómo puedo depurarlos sin tener la fuente de GLSurfaceView.java?

Respuesta

1

Así es como llegué a trabajar:

en el archivo XML (el mío es main.xml) utiliza la especificación extendida clase

 <com.domain.project.VortexView android:id="@+id/vortexview" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" /> 

En su clase de actividad:

setContentView(R.layout.main); 
    VortexRenderer _renderer=new VortexRenderer();   // setup our renderer 
    VortexView glSurface=(VortexView) findViewById(R.id.vortexview); // use the xml to set the view 
    glSurface.setRenderer(_renderer); // MUST BE RIGHT HERE, NOT in the class definition, not after any other calls (see GLSurfaceView.java for related notes) 
    glSurface.showRenderer(_renderer); // allows us to access the renderer instance for touch events, etc 

La definición de vista (VortexView.java):

public class VortexView extends GLSurfaceView { 
    public VortexRenderer _renderer; // just a placeholder for now 

public VortexView(Context context) { // default constructor 
    super(context); 
} 


public VortexView(Context context, AttributeSet attrs) { /*IMPORTANT - this is the constructor that is used when you send your view ID in the main activity */ 
    super(context, attrs); 
} 

public void showRenderer(VortexRenderer renderer){ // sets our local object to the one created in the main activity, a poor man's getRenderer 
    this._renderer=renderer;   
} 

public boolean onTouchEvent(final MotionEvent event) { // An example touchevent from the vortex demo 
    queueEvent(new Runnable() { 
     public void run() { 
      _renderer.setColor(event.getX()/getWidth(), event.getY()/getHeight(), 1.0f); 
     } 
    }); 
    return true; 
} 

}

el VortexRenderer.java solo tiene llamadas típicas enSurfaceXXXXX.

De todos modos, esto parece permitirme apilar otras vistas XML definidas sobre mi GLSurface extendida, que es lo que quería en primer lugar.

¡Salud!

+0

Gracias, esto me ayudó. Debe marcar la pregunta como respondió – stealthcopter

+0

Marcado, gracias. Me alegra ser de ayuda. –

Cuestiones relacionadas