2010-05-13 5 views
3

J'essaie de configurer un GridView de boutons qui répond à onTouch. Par exemple, si je fais glisser mon doigt sur l'écran horizontalement, verticalement ou en diagonale, je veux que les boutons qui ont été touchés soient sélectionnés. J'ai essayé de définir OnTouchListener pour les boutons, mais cela n'a pas fonctionné, seul le premier bouton de l'événement drag a reçu les événements onTouch.GridView onTouch

Ensuite, j'ai essayé de créer un OnTouchListener pour le GridView et ensuite en utilisant les coordonnées X, Y pour déterminer les boutons qui ont été touchés. Cela ne semble pas fonctionner non plus puisque les événements MOTION_DOWN ne sont passés à onTouch() de GridView que si je commence le glisser sur le bord même de GridView. En fait, si je fais glisser mon doigt horizontalement sur la grille, les événements onTouch ne sont pas déclenchés à moins que je ne commence le glisser sur le bord de la GridView. Est-ce que quelqu'un sait d'une meilleure façon de le faire?

Merci d'avance.

gridview.setOnTouchListener(new View.OnTouchListener() 
{ 
@Override 
public boolean onTouch(@SuppressWarnings("unused") View view, MotionEvent event) 
{ 
    float X = event.getX(); 
    float Y = event.getY(); 

    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
    System.out.println("Down: " + X + "," + Y); 
    break; 
    case MotionEvent.ACTION_MOVE: 
    System.out.println("Move: " + X + "," + Y); 
    break; 
    case MotionEvent.ACTION_UP: 
    System.out.println("Up: " + X + "," + Y); 
    break; 
    } 

    return true; 
} 
} 

Répondre

0

Vous pouvez essayer d'utiliser GestureDetector pour déclencher les événements tactiles corrects. À partir de là, vous devriez être en mesure de déterminer ce que vous avez fait et où exactement. GestureDetector vous donnera plusieurs méthodes pour vous dire ce que vous avez fait (SingleTapUp, Fling, Scroll, ...) et à quelle position et combien de temps vous l'avez fait (si par exemple vous faites glisser, vous obtenez la position de départ, le durée du swipe et dans quelle mesure vous glissée)

1

Si vous avez un adaptateur implémentent une interface pour écouter les événements de clic sur votre GridCell, par exemple:

public interface OnSaveEditsListener 
{ 
    public abstract void onSaveEdits(); 
} 

private OnSaveEditsListener saveEditsListener = null; 
public void setOnSaveEditsListener(OnSaveEditsListener l) { 
    saveEditsListener = l; 
} 

et vous devez mettre en œuvre dans votre getView adaptateur (. .) méthode, l'écouteur de clic spécial:

 holder.gridcell.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       CalendarPosition = position; 
       v.requestFocusFromTouch(); 

       try{ 
        saveEditsListener.onSaveEdits(); 
        holder.gridcell.invalidate(); 
       }catch(Exception ex){} 

      } 
     }); 

Il est recommandé d'utiliser un support pour vos éléments de vue à l'intérieur de l'adaptateur.

Et la dernière partie, de votre classe d'activité, il suffit d'appeler:

adapter.setOnSaveEditsListener(new GridCellAdapter.OnSaveEditsListener() { 

     @Override 
     public void onSaveEdits() { 
      /** methods *// 
    }); 
} 
0

Il est pas complet mais peut aider u

gridview.setOnTouchListener(new OnTouchListener(){ 
@Override 
public boolean onTouch(View v, MotionEvent event) { 

      if(event.getAction() == MotionEvent.ACTION_MOVE){ 
       gridview.requestFocusFromTouch(); 
       gridview.setSelection(gridview.pointToPosition((int)event.getX(),(int)event.getY())); 
       return true; 
      } 
      if(event.getAction() == MotionEvent.ACTION_UP){ 
       gridview.clearFocus(); 
       return true; 
      } 

      return false; 
     } 
    }); 
0

Vous êtes sur la bonne voie. Vous avez juste besoin d'utiliser les coordonnées X, Y de l'onTouch pour obtenir la position de la cellule de la grille en utilisant la méthode pointToPosition de gridView. Vous pouvez ensuite utiliser la position (ID) pour obtenir l'élément réel dans la cellule en utilisant la méthode getChildAt. Par exemple, si votre grilleView a des TextView dans chaque cellule, utilisez-le

int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition); 
TextView tv = (TextView) gridView.getChildAt(position);