2011-07-17 4 views
1

J'ai une classe s'étend ViewGroup et je veux obtenir tous les MotionEvent. Jusqu'à présent, j'ai ceci:Tracer un MotionEvent dans un ViewGroup

class TestViewGroup extends ViewGroup { 
    public TestViewGroup(Context context) { 
     super(context); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     Log.d("TestViewGroup", "X: " + (int)event.getX() + " Y: " + (int)event.getY()); 
     return true; 
    } 
} 

La méthode onTouchEvent(MotionEvent event) est capable de capturer un MotionEvent chaque fois que je mets mon doigt sur l'écran. Mais si je déplace mon doigt autour de l'écran alors que mon doigt est toujours en bas, il ne continuera pas à tracer les coordonnées de mon doigt. Je sais que dans une classe qui s'étend un View, il est possible de continuer à suivre le doigt pendant qu'il se déplace à travers le View. Je me demande simplement comment il est possible d'appliquer la même idée à un ViewGroup.

Répondre

0

I mis en œuvre une classe ViewGroup très simple et copiais votre code, le onTouchEvent a bien fonctionné

La seule chose que je faisais différemment était de mettre en œuvre tous les constructeurs, mais en général, je dirais aussi super pour la classe onTochEvent cela ne semblait pas faire la différence. Donc, je me demande s'il y a un code/XML que vous laissez qui pourrait faire une différence?

Capture tous les événements tactiles dans l'émulateur et sur le périphérique, à peu près comme le vôtre à l'exception des constructeurs.

public class customViewGroup extends ViewGroup { 

    public customViewGroup(Context context) { 
     super(context,null,0); 
    } 

    public customViewGroup(Context context, AttributeSet attrs) { 
     super(context, attrs,0); 

    } 

    public customViewGroup(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     Log.d("bThere", "X: " + (int)event.getX() + " Y: " + (int)event.getY()); 
     return true;//super.onTouchEvent(event); 
    } 

} 
+0

Vous savez, vous avez raison, ce n'est rien à voir avec View ou ViewGroup, c'est en fait lié à la façon dont je l'intègre je pense. J'essaye de placer le ViewGroup dans le WindowManager du système de sorte qu'il puisse rester persistant sur une superposition de système (montrer fondamentalement une vue n'importe quelle activité est dessus). Savez-vous si l'ajout d'une vue au WindowManager affecte la manière dont les événements tactiles lui sont transmis? – Brian

+0

@AeroDroid ... semble être une chose intéressante à faire, je suggère d'ouvrir une autre question et de reformuler, également ajouter du code. Vous pouvez également essayer @Override public boolean dispatchTouchEvent (événement MotionEvent) {} comme alternative, car il semble être un peu plus robuste dans l'obtention d'événements, vous devrez ajouter du code si – Idistic

+0

En fait, je viens d'ouvrir une nouvelle question il y a un moment , ici s'il vous plaît jeter un coup d'oeil [ici] (http://stackoverflow.com/questions/6725636/getting-all-motionevents-with-windowmanager-layoutparams-flag-watch-outside-touch). – Brian

-1

vous devez ajouter viewGroup.setClickable(true); pour vous assurer que la vue peut recevoir plus TouchEvent.