2010-11-12 4 views

Répondre

80

Eh bien pour tous ceux qui veulent savoir ce que j'ai fait ... je ne pouvais pas. Je l'ai fait une solution de contournement de savoir exactement si mon composant vue spécifique a été cliqué, alors je ne pouvais terminer par ceci:

if(isPointInsideView(ev.getRawX(), ev.getRawY(), myViewComponent)){ 
    doSomething() 
    } 

et la méthode:

/** 
* Determines if given points are inside view 
* @param x - x coordinate of point 
* @param y - y coordinate of point 
* @param view - view object to compare 
* @return true if the points are within view bounds, false otherwise 
*/ 
public static boolean isPointInsideView(float x, float y, View view){ 
    int location[] = new int[2]; 
    view.getLocationOnScreen(location); 
    int viewX = location[0]; 
    int viewY = location[1]; 

    //point is inside view bounds 
    if((x > viewX && x < (viewX + view.getWidth())) && 
      (y > viewY && y < (viewY + view.getHeight()))){ 
     return true; 
    } else { 
     return false; 
    } 
} 

Cependant cela ne fonctionne que pour les vues connues dans le mise en page que vous pouvez passer en paramètre, je ne peux toujours pas obtenir la vue cliquée simplement en connaissant les coordonnées. Vous pouvez cependant rechercher toutes les vues dans la mise en page.

+9

privé isPointInsideView booléenne (float x, y flotter, Vue vue) { \t \t Rect Rect = new Rect(); \t \t view.getDrawingRect (rect); \t \t return rect.contains ((int) x, (int) y); \t} – etienne

+0

Suggestion: méthode idéale pour être rendue statique. – m0skit0

+6

@etienne, notez que getDrawingRect() renvoie des informations sur le rectangle de dessin affiché à l'intérieur d'une vue défilante. Cela ne fonctionne pas si vous voulez obtenir le rect d'une vue imbriquée dans une autre vue. La solution de Htafoya fonctionne comme prévu. – sulai

3

Un moyen simple d'obtenir la vue tactile est de définir un OnTouchListener sur les vues individuelles et de stocker la vue dans une variable de classe de l'activité. Renvoyer false rend l'événement d'entrée disponible pour la méthode onTouchEvent() de l'activité, où vous pouvez facilement gérer tous les événements tactiles (également ceux de votre vue parente).

myView.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
    touchedView = myView; 
    return false; 
    } 
}); 


@Override 
public boolean onTouchEvent(MotionEvent event) { 


    switch (event.getAction()) { 

     case MotionEvent.ACTION_UP: 

      if(touchedView!=null) { 
       doStuffWithMyView(touchedView); 
      .... 
      .... 
3

Juste pour méthode de htafoya plus simple:

/** 
* Determines if given points are inside view 
* @param x - x coordinate of point 
* @param y - y coordinate of point 
* @param view - view object to compare 
* @return true if the points are within view bounds, false otherwise 
*/ 
private boolean isPointInsideView(float x, float y, View view) { 
    int location[] = new int[2]; 
    view.getLocationOnScreen(location); 
    int viewX = location[0]; 
    int viewY = location[1]; 

    // point is inside view bounds 
    return ((x > viewX && x < (viewX + view.getWidth())) && 
      (y > viewY && y < (viewY + view.getHeight()))); 
} 
+0

Répétition de mon commentaire d'en haut: view.getLocationOnScreen n'a pas vraiment fonctionné pour moi - je pense qu'il peut retourner les coordonnées du centre de la vue, donc le clic doit être dans le coin inférieur droit de la vue pour que le test retourne vrai , donc la vérification des limites dans cet exemple est fausse. Au lieu de cela, utilisez ce test: (x> = view.getLeft() && x <= view.getRight()) && (y> = view.getTop() && y <= view.getBottom()). – gjgjgj

Questions connexes