2010-11-08 17 views
6

empecé una aplicación para Android OpenGL y tengo las siguientes clases:Android glSurfaceView con superposición utilizando XML/Java

class A extends Activity 
class B extends GlSurfaceView implements Renderer 

Cuando la clase de un onCreate se llama, se crea un objeto de la clase de tipo B y llama:

setContentView(Bobject) 

Hasta ahora funciona y pasé unos días en él.

Ahora quería agregar botones a mi aplicación y encontré el ejemplo de SurfaceViewOverlay. Eso usa algo de XML para crear una jerarquía de vista. Quería crear algo muy similar a lo simplemente cortar y pegar el código XML:

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

    <LinearLayout android:id="@+id/hidecontainer" 
      android:orientation="vertical" 
      android:visibility="gone" 
      android:background="@drawable/translucent_background" 
      android:gravity="center" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 
      ... 

Ahora teniendo en cuenta mi jerarquía de clases original, ¿cómo iba a inicializar mis puntos de vista? ¿Qué debo escribir en onCreate() de mi clase A?

He intentado utilizar:

Bobject = new B(this); 
GLSurfaceView glSurfaceView = 
     (GLSurfaceView) findViewById(R.id.glsurfaceview); 
    glSurfaceView.setRenderer(Bobject); 

y lo hace dibujar los botones y la vista GL en la pantalla, pero la vista GL es incapaz de tomar en cualquier entrada de los grifos/clics.

Esto es probablemente debido a la Bobject onTouchEvent() no se llama, ya que sólo está siendo utilizado como:

Renderer 

y no una:

glSurfaceView 

objeto.

En lugar del código anterior, lo que realmente quiero es que Bobject reemplace glSurfaceView. Pero no sé cómo hacer eso. Cuando encuentro ViewById(), parece que glSurfaceView ya está creado por el momento. ¿Cómo puedo pedirle que use un objeto de tipo B para la vista GL?

Disculpe las faltas de los novatos. Completamente nuevo para Android.

EDIT: También intentado esto:

También trató lo siguiente: En mi archivo XML, he cambiado el GLSurfaceView a:

<com.bla.bla.B 
      android:id="@+id/glsurfaceview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

Y en mi Un constructor de la clase que estoy llamando:

// This returns null 
Bobject = (B) findViewById(R.id.glsurfaceview); 

// And this suspends the application. :(
setContentView(R.layout.surface_view_overlay); 

¿Cómo debo usar mi clase personalizada que se extiende glSurfaceView en mi archivo XML/actividad?

+1

Estoy atascado con el mismo problema y no pude encontrar una aplicación completa que demuestre esto. ¿Alguien puede mostrar alguna aplicación de ejemplo? Parece que no puedo encontrar este famoso ejemplo SurfaceOverlayView de muestras de Android en cualquier lugar. Gracias por adelantado. – rgngl

Respuesta

7

bien, así que la forma correcta de hacer esto es tener un constructor de la clase B, que toma en:

B(Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
} 

Y en el diseño de XML, utilice esto:

<com.bla.bla.B 
     android:id="@+id/glsurfaceview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

El Lo que faltaba en mi código era la firma del constructor.

+0

Agregando lo mismo que recibo "El objeto constructor (Context, AttributeSet) no está definido" ¿Me puede guiar? – JehandadK

+0

He agregado en la clase Renderer. – JehandadK

+0

Muchas gracias, muy útiles – zest

1

Una forma alternativa de resolver esto, es dejar sus puntos de vista unidos a la Actividad A.Así que en lugar de utilizar setContentView (objeto B) se utiliza setContentView (un objeto) y dentro de su "Un XML" archivo, es la vista GLsurfaceView:

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

A continuación, puede hacer referencia a su objeto B en la Actividad A, ya que se infla cuando setContentView a a, en lugar de B:

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


glSurfaceView.setRenderer(); //no longer have to pass the object 

sinceramente no estoy seguro de cómo conseguir que funcione exactamente de la manera deseada, pero en su caso no estoy seguro de que en última instancia hace una diferencia Por otra parte, todavía soy un novato también. Me interesaría aprender a hacer esto de forma alternativa ya que hice una pregunta similar hoy.

+0

No estoy seguro si entiendo su propuesta de modificación XML. ¿No es exactamente lo mismo que mi XML (el que corté y pegué del ejemplo de SurfaceViewOverlay)? Mi problema principal es que los clics no pasan al método de Bobject'sTouchEvent(). Creo que esto se debe al hecho de que lo estoy usando como un Renderer y no como un SurfaceViewObject. El SurfaceViewObject que estoy usando es el que devuelve findViewById(). –

+0

Lea atentamente, no propongo cambiarlo, propongo cambiar DONDE lo pones. Coloque el XML de vista de superficie en el diseño de A en lugar de B e infle A. No hay necesidad de inflar solo el diseño de B como lo hace, cuando A contiene todas sus vistas. – user432209

+0

Todavía no lo entiendo. Ya no estoy usando setContentView (Bobject). Estoy siguiendo el ejemplo del SDK. Estoy usando: setContentView (R.layout.surface_view_overlay); Me encantaría utilizar Bobject en lugar de R.layout.surface_view_overlay, pero eso no muestra ningún botón. –

Cuestiones relacionadas