2010-07-30 11 views
3

J'ai été informé dans une réponse plus tard que je dois ajouter le GestureOverlayView que je crée dans le code à ma hiérarchie de vue, et je ne suis pas 100% comment faire cela. Voici la question originale pour l'exhaustivité.Ajouter GestureOverlayView à ma classe SurfaceView, comment l'ajouter à la hiérarchie?

Je veux que mon jeu reconnaisse les gestes. J'ai cette belle classe SurfaceView que je fais un onDraw pour dessiner mes sprites, et j'ai un thread qui l'exécute pour appeler le onDraw etc.

Tout cela fonctionne très bien.

J'essaye d'ajouter le GestureOverlayView à ceci et cela ne fonctionne tout simplement pas. Enfin piraté où il ne tombe pas en panne, mais ce que j'ai

public class Panel extends SurfaceView implements SurfaceHolder.Callback,   OnGesturePerformedListener 
{ 
public Panel(Context context) 
{ 
    theContext=context; 
    mLibrary = GestureLibraries.fromRawResource(context, R.raw.myspells); 
    GestureOverlayView gestures = new GestureOverlayView(theContext);  
    gestures.setOrientation(gestures.ORIENTATION_VERTICAL); 
    gestures.setEventsInterceptionEnabled(true); 
    gestures.setGestureStrokeType(gestures.GESTURE_STROKE_TYPE_MULTIPLE); 

    gestures.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
      LayoutParams.FILL_PARENT)); 

    //GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures); 
    gestures.addOnGesturePerformedListener(this); 
} 
... 
... 
onDraw... 
surfaceCreated(..); 
... 
... 


public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { 
    ArrayList<Prediction> predictions = mLibrary.recognize(gesture); 

    // We want at least one prediction 
    if (predictions.size() > 0) { 
    Prediction prediction = predictions.get(0); 
    // We want at least some confidence in the result 
    if (prediction.score > 1.0) { 
    // Show the spell  
    Toast.makeText(theContext, prediction.name, Toast.LENGTH_SHORT).show(); 
    } 
    } 
} 


} 

Le onGesturePerformed est jamais appelé. Leur exemple a GestureOverlay dans le fichier XML, je n'utilise pas, mon activité est simple:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    Panel p = new Panel(this); 
    setContentView(p); 
} 

Je suis un peu d'une perte de la pièce manquante d'informations ici, il ne remet pas OnGesturePerformed et le joli joli jaune "vous dessinez un geste" n'apparaît jamais.

Répondre

6

C'était une douleur importante mais j'ai finalement trouvé la solution. Il n'y a absolument aucune bonne documentation à ce sujet en ligne. Je l'ai finalement fait travailler en utilisant quelque chose appelé "FrameLayout" et en y ajoutant à la fois la vue de surface et la vue gestuelle. Une fois que vous faites cela, vous définissez le FrameLayout comme votre vue de contenu.

Malheureusement, la solution ci-dessus offerte par RomanGuy ne semble pas fonctionner (ou peut-être, je ne pouvais tout simplement pas le faire fonctionner) pour une raison quelconque. Il y a no .addView() fonction disponible pour la classe SurfaceView comme pour une vue régulière. Cette fonction existe pour ViewGroups et fonctionnera bien pour ajouter des gestes sur autre chose qu'une surfaceview je pense.

Votre activité doit implémenter l'interface OnGesturePerformedListener pour que cela fonctionne.

Vous pouvez voir le tutoriel complet et le code source sur mon site ici: http://scanplaygames.com/?p=193

package view.stack; 

import game.core.GameView; 

import java.util.ArrayList; 
import android.app.Activity; 
import android.gesture.Gesture; 
import android.gesture.GestureLibraries; 
import android.gesture.GestureLibrary; 
import android.gesture.GestureOverlayView; 
import android.gesture.Prediction; 
import android.gesture.GestureOverlayView.OnGesturePerformedListener; 
import android.os.Bundle; 
import android.view.SurfaceView; 
import android.view.ViewGroup; 
import android.view.ViewGroup.LayoutParams; 
import android.view.Window; 
import android.widget.FrameLayout; 
import android.widget.Toast; 

public class GestureActivity extends Activity implements OnGesturePerformedListener 
{ 
    protected GameView surfaceView; 
    protected GestureOverlayView gestureOverlayView; 
    protected GestureLibrary mLibrary; 
    protected FrameLayout frameLayout; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     gestureOverlayView = new GestureOverlayView(this); 
     surfaceView  = new GameView(this);    
     frameLayout  = new FrameLayout(this); 

     //gestureOverlayView.addView(surfaceView);  
     gestureOverlayView.setOrientation(gestureOverlayView.ORIENTATION_VERTICAL); 
     gestureOverlayView.setEventsInterceptionEnabled(true); 
     gestureOverlayView.setGestureStrokeType(gestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE); 

     mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures); 
     gestureOverlayView.addOnGesturePerformedListener(this); 

     frameLayout.addView(surfaceView, 0); 
     frameLayout.addView(gestureOverlayView,1); 

     setContentView(frameLayout); 
    } 

    @Override 
    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) 
    { 
     // TODO Auto-generated method stub 
     ArrayList<Prediction> predictions = mLibrary.recognize(gesture); 

     // one prediction needed 
     if (predictions.size() > 0) 
     { 
      Prediction prediction = predictions.get(0); 

      // checking prediction 
      if (prediction.score > 1.0) 
      { 
       // and action 
       Toast.makeText(GestureActivity.this, prediction.name, 
         Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }  
} 
+0

wow été il y a des siècles depuis que j'ai bricolé avec ça. Cette nouvelle information me permettra cependant de revenir en arrière. – Codejoy

2

Vous créez la superposition de gestes, mais vous ne l'ajoutez jamais à la hiérarchie de vue. Ça ne marchera pas si ça n'existe pas :)

+0

haine bien sonner comme un plongeon, mais comment puis-je ajouter à la hiérarchie de la vue. ? Je suppose que c'est dans le fichier .xml fait cela? Comment puis-je l'ajouter à la hiérarchie sans qu'il soit dans le fichier xml? – Codejoy

+0

Regardez ViewGroup.addView(). –

1

Vous pouvez simplement ajouter votre point de vue à la gestureOverlayView:

gestureOverlayView.addView(new yourview (this) , 600, 800); 

puis

this.setContentView(gestureOverlayView); 

gestureOverlayView est déjà un framelayout