2012-05-08 3 views
3

J'ai une vue d'image où j'ai besoin d'avoir les deux longues pressions (pour un menu contextuel) et les presses régulières fonctionnant. Je peux faire fonctionner l'un ou l'autre, mais pas les deux. Qu'est-ce que j'ai raté? Le code ci-dessous ne fonctionne que pour les presses régulières. Dès que je touche l'écran, il commence à exécuter le code onTouch.android imageview appui long et appui régulier

ImageView image = (ImageView)findViewById(R.id.visible_image); 
image.setLongClickable(true); 
image.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent ev) { 
     switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      // disable the screen taps for 500ms 
      DecodeActionDownEvent(v, ev, bm2); 
     case MotionEvent.ACTION_MOVE: 
     case MotionEvent.ACTION_UP: 
    } 
     return true; 
    } 
}); 
registerForContextMenu(image); 

...

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
    ContextMenuInfo menuInfo) { 
    menu.setHeaderTitle("Edit"); 
    ArrayList<String> menuItems = new ArrayList<String>(); 
    menuItems.add("Edit page settings"); 
    menuItems.add("Edit page objects"); 
    menuItems.add("Edit this object"); 
    for (int i = 0; i<menuItems.size(); i++) { 
     menu.add(Menu.NONE, i, i, menuItems.get(i)); 
    } 
} 

Répondre

17

Vous pouvez essayer de le faire de cette façon:

ImageView imageView = (ImageView) findViewById(R.id.ImageView); 
imageView.setOnLongClickListener(new OnLongClickListener() { 

    @Override 
    public boolean onLongClick(View v) { 
        //your stuff 
     return true; 
    } 
}); 
imageView.setOnClickListener(new OnClickListener() { 
    @Override 
    public boolean onClick(View v) { 
     //your stuff 
     return true; 
    } 
}); 
+0

OK, je n'avais pas essayé ça, et on dirait que ça va marcher. Pouvez-vous me dire comment obtenir les coordonnées x/y de clic/clic long à partir du View v qui est passé? – MrGibbage

+0

Peu importe, je l'ai compris. Je dois toujours garder l'écouteur OnTouch. Merci :) – MrGibbage

2

Pour obtenir les coordonnées x et y, définissez un auditeur contact

 ImageView.setOnTouchListener(new View.OnTouchListener() 
     { 
     public boolean onTouch(View v, MotionEvent event) 
     { 
      //And u can get x and y values like: 

      x = event.getX(); 
      y = event.getY() ; 
     } 
     } 
2

Après beaucoup de recherche et d'expérimentation c'est la meilleure solution que j'ai fou nd pour atteindre ce type de comportement:

//Define these variables at the beginning of your Activity or Fragment: 
private long then; 
private int longClickDuration = 5000; //for long click to trigger after 5 seconds 

... 

ImageView imageView = (ImageView) findViewById(R.id.visible_image); 
imageView.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      then = (long) System.currentTimeMillis(); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      if ((System.currentTimeMillis() - then) > longClickDuration) { 
      /* Implement long click behavior here */ 
      System.out.println("Long Click has happened!"); 
      return false; 
      } else { 
      /* Implement short click behavior here or do nothing */ 
      System.out.println("Short Click has happened..."); 
      return true; 
      } 
     } 
     return true; 
     } 
    }); 
+1

Je pense qu'un clic a une condition supplémentaire: le doigt ne devrait pas avoir bougé trop (comme avec un coup). Garder thenX et thenY pourrait être une bonne idée ici ... –

Questions connexes