2010-11-08 45 views
6

j'ai commencé une application OpenGL Android et j'ai les classes suivantes:Android glSurfaceView avec superposition en utilisant XML/Java

class A extends Activity 
class B extends GlSurfaceView implements Renderer 

Lorsque la classe onCreate de A est appelée, elle crée un objet de type classe B et appelle:

setContentView(Bobject) 

Jusqu'à présent cela fonctionne et j'ai passé quelques jours dessus.

Maintenant, je voulais ajouter des boutons à mon application et trouvé l'exemple SurfaceViewOverlay. Cela utilise du code XML pour créer une hiérarchie de vues. Je voulais créer quelque chose de très semblable à je simplement couper et coller le code 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"> 
      ... 

garder à l'esprit maintenant ma hiérarchie de classe d'origine, comment pourrais-je initialiser mon point de vue? Que dois-je écrire dans onCreate() de ma classe A?

J'ai essayé d'utiliser:

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

Et il ne tire les boutons et la vue GL sur l'écran, mais la vue GL ne peut pas prendre en aucune entrée des robinets/clics.

probablement parce onTouchEvent de Bobject() n'est pas appelé car il est seulement utilisé comme:

Renderer 

et non pas:

glSurfaceView 
objet

. Au lieu du code ci-dessus, ce que je veux vraiment, c'est que Bobject remplace glSurfaceView. Mais je ne sais pas comment faire ça. Quand je trouve findById(), il semble que glSurfaceView soit déjà créé pour le moment. Comment puis-je lui demander d'utiliser un objet de type B pour la vue GL?

Désolé pour toutes les erreurs de débutant. Complètement nouveau sur Android.

EDIT: J'ai aussi essayé ceci:

J'ai essayé aussi: Dans mon fichier XML, j'ai changé le GLSurfaceView à:

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

Et dans mon Un constructeur de classe J'appelle: Comment utiliser ma classe personnalisée qui étend glSurfaceView dans mon fichier/activité XML?

+1

Je suis coincé avec le même problème et n'a pas pu trouver une application entière démontrant cette chose. Quelqu'un peut-il montrer un exemple d'application? Je ne peux pas sembler trouver ce fameux exemple de SurfaceOverlayView à partir d'échantillons android n'importe où. Merci d'avance. – rgngl

Répondre

7

D'accord, donc la bonne façon de le faire est d'avoir un constructeur dans la classe B qui prend en:

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

Et dans la mise en page XML, utilisez ceci:

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

Le Ce qui manquait dans mon code était la signature du constructeur.

+0

Ajouter la même chose que moi "Le constructeur Object (Context, AttributeSet) est indéfini" Pouvez-vous me guider? – JehandadK

+0

J'ai ajouté dans la classe Renderer. – JehandadK

+0

Grand merci, très utile – zest

1

Une autre façon de résoudre ce problème consiste à laisser vos vues liées à l'activité A.Ainsi, au lieu d'utiliser setContentView (objet B) vous utilisez setContentView (Un objet) et à l'intérieur de votre fichier « Un XML », est la vue GLsurfaceView:

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

Vous pouvez vous référer à votre objet B dans l'activité A, parce qu'il a été gonflé quand vous setContentView à A, au lieu de B:

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


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

Je suis franchement pas sûr de savoir comment cela fonctionne exactement comme vous le voulez, mais dans votre cas, je ne suis pas sûr qu'il en fin de compte fait une différence. Là encore, je suis toujours novice. Je serais intéressé d'apprendre comment faire cela d'une manière alternative alors que je posais une question similaire aujourd'hui.

+0

Vous ne savez pas si je comprends votre proposition de modification XML. N'est-ce pas exactement le même que mon XML (celui que je coupe et colle à partir de l'exemple de SurfaceViewOverlay)? Mon problème principal est que les clics ne passent pas à la méthode onTouchEvent() de Bobject. Je crois que c'est dû au fait que je l'utilise comme un Renderer et non un SurfaceViewObject. Le SurfaceViewObject que j'utilise est celui retourné par findViewById(). –

+0

Lisez attentivement, je ne propose pas de le changer, je propose de changer où vous l'avez mis. Placez le XML de surface dans la disposition de A au lieu de B et gonflez A. Il n'est pas nécessaire de gonfler uniquement la disposition de B comme vous le faites, quand A contient toutes vos vues. – user432209

+0

Je ne comprends toujours pas. Je n'utilise plus setContentView (Bobject). Je suis l'exemple du SDK. J'utilise: setContentView (R.layout.surface_view_overlay); J'aimerais utiliser Bobject au lieu de R.layout.surface_view_overlay, mais cela ne montre aucun bouton. –