2010-11-08 16 views
6

ho iniziato un'applicazione OpenGL Android e ho le seguenti classi:Android glSurfaceView con overlay usando XML/Java

class A extends Activity 
class B extends GlSurfaceView implements Renderer 

Quando la classe di un onCreate si chiama, si crea un oggetto di tipo classe B e chiama:

setContentView(Bobject) 

Finora funziona e ci ho dedicato alcuni giorni.

Ora volevo aggiungere pulsanti alla mia applicazione e ho trovato l'esempio di SurfaceViewOverlay. Questo utilizza un codice XML per creare una gerarchia di viste. Ho voluto creare qualcosa di molto simile a Ho semplicemente tagliare e incollare il codice 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"> 
      ... 

Ora tenendo a mente la mia gerarchia di classi originale, come avrei inizializzare le mie opinioni? Cosa dovrei scrivere su onCreate() della mia classe A?

Ho provato utilizzando:

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

e lo fa disegnare i pulsanti e la vista GL sullo schermo, ma la vista GL è in grado di prendere in qualsiasi input da rubinetti/clic.

Questo è dovuto probabilmente al fatto di Bobject onTouchEvent() non è chiamato come esso è utilizzato solo come:

Renderer 

e non una:

glSurfaceView 

oggetto.

Invece del codice precedente, quello che voglio veramente è che Bobject sostituisca glSurfaceView. Ma non so come farlo. Quando trovoViewById(), sembra che glSurfaceView sia già stato creato per ora. Come posso chiederle di usare un oggetto di tipo B per la vista GL?

Ci scusiamo per eventuali nuovi errori. Completamente nuovo per Android.

EDIT: Ho provato anche questo:

Ho anche provato il seguente: Nel mio file XML, ho cambiato il GLSurfaceView a:

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

E nella mia un costruttore della classe che io chiamo:

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

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

Come dovrei usare la mia classe personalizzata che estende glSurfaceView nel mio file/attività XML?

+1

Sono bloccato con lo stesso problema e non è riuscito a trovare un'intera applicazione per dimostrare questa cosa. Qualcuno può mostrare qualche applicazione di esempio? Non riesco a trovare questo famoso esempio di SurfaceOverlayView da campioni Android ovunque. Grazie in anticipo. – rgngl

risposta

7

Okay, quindi il modo corretto di fare questo è quello di avere un costruttore della classe B che prende in:

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

E nel layout XML, utilizzare questo:

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

Il cosa che mancava nel mio codice era la firma del costruttore.

+0

Aggiungendo la stessa cosa ottengo "L'oggetto costruttore (Context, AttributeSet) non è definito" Potete guidarmi? – JehandadK

+0

Ho aggiunto nella classe Renderer. – JehandadK

+0

Grazie mille, molto utile – zest

1

Un modo alternativo per risolvere questo problema è lasciare le proprie viste allegate all'attività A.Così, invece di utilizzare setContentView (oggetto B) si utilizza setContentView (un oggetto) e dentro il vostro "Un XML" di file, è la vista GLsurfaceView:

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

È quindi possibile fare riferimento al vostro oggetto B nell'attività A, perché è stato gonfiato quando si setContentView ad a, invece di B:

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


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

io non sono onestamente sicuro di come farlo funzionare esattamente nel modo desiderato, ma nel tuo caso non sono sicuro che in ultima analisi, fa la differenza Poi di nuovo, sono ancora un novizio anche io. Sarei interessato a imparare come farlo in un modo alternativo, come ho fatto una domanda simile proprio oggi.

+0

Non sono sicuro di aver compreso la tua proposta di modifica XML. Non è esattamente uguale al mio XML (quello che taglia e incolla dall'esempio di SurfaceViewOverlay)? Il mio problema principale è che i clic non passano al metodo onTouchEvent() di Bobject. Credo che questo sia dovuto al fatto che lo sto usando come Renderer e non come SurfaceViewObject. Il SurfaceViewObject che sto utilizzando è quello restituito da findViewById(). –

+0

Leggere attentamente, non sto proponendo di cambiarlo, sto proponendo di cambiare DOVE LO Metti. Metti l'XML della vista superficiale nel layout di A anziché in B e gonfia A. Non c'è bisogno di gonfiare solo il layout di B come fai tu, quando A contiene tutte le tue viste. – user432209

+0

Ancora non capisco. Non sto più usando setContentView (Bobject). Sto seguendo l'esempio dall'SDK. Sto usando: setContentView (R.layout.surface_view_overlay); Mi piacerebbe usare Bobject invece di R.layout.surface_view_overlay, ma questo non mostra alcun pulsante. –

Problemi correlati