web-dev-qa-db-fra.com

Comment utiliser View.OnTouchListener au lieu de onClick

Je développe une application Android 2.2.2 pour un client et il souhaite procéder comme suit:

Maintenant, j'ai un bouton avec un événement onClick mais il n'aime pas, il veut détecter quand l'utilisateur relâche le bouton.

J'ai trouvé View.OnTouchListener que je pense que c'est ce que je dois utiliser, mais existe-t-il une possibilité d'ajouter cet événement à xml comme avec onClick?

<ImageButton
    Android:id="@+id/btnSaveNewGate"
    Android:layout_width="@dimen/btnSaveNewGate_width"
    Android:layout_height="@dimen/btnSaveNewGate_height"
    Android:layout_below="@+id/radioGrGateType"
    Android:layout_centerHorizontal="true"
    Android:layout_marginTop="@dimen/btnSaveNewGate_marginTop"
    Android:background="@null"
    Android:contentDescription="@string/layout_empty"
    Android:onClick="onSaveNewGateClick"
    Android:scaleType="fitXY"
    Android:src="@drawable/save_gate_selector" />

J'ai encore deux questions:

Quel est l'événement associé lorsque l'utilisateur relâche son doigt?

Existe-t-il des directives interdisant l'utilisation de View.OnTouchListener au lieu de onClick?

41
VansFannel

L'événement lorsque l'utilisateur relâche son doigt est MotionEvent.ACTION_UP. Je ne sais pas s'il existe des directives interdisant l'utilisation de View.OnTouchListener au lieu de onClick (), cela dépend très probablement de la situation.

Voici un exemple de code:

imageButton.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP){

            // Do what you want
            return true;
        }
        return false;
    }
});
72
Andy Res

Vraisemblablement, si on veut utiliser un OnTouchListener plutôt qu'un OnClickListener, alors la fonctionnalité supplémentaire de OnTouchListener est nécessaire. Ceci est une réponse supplémentaire pour montrer plus en détail comment un OnTouchListener peut être utilisé.

Définir l'auditeur

Mettez ceci quelque part dans votre activité ou votre fragment.

private View.OnTouchListener handleTouch = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.i("TAG", "touched down");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.i("TAG", "moving: (" + x + ", " + y + ")");
                break;
            case MotionEvent.ACTION_UP:
                Log.i("TAG", "touched up");
                break;
        }

        return true;
    }
};

Définir l'auditeur

Définissez le programme d'écoute dans onCreate (pour une activité) ou onCreateView (pour un fragment).

myView.setOnTouchListener(handleTouch);

Notes

  • getX et getY vous donnent les coordonnées relatives à la vue (c'est-à-dire le coin supérieur gauche de la vue). Ils seront négatifs si vous vous déplacez au-dessus ou à gauche de votre vue. Utilisez getRawX et getRawY si vous voulez les coordonnées absolues de l’écran.
  • Vous pouvez utiliser les valeurs x et y pour déterminer des éléments tels que la direction du balayage.
11
Suragch

OnClick est déclenché lorsque l'utilisateur relâche le bouton. Mais si vous souhaitez toujours utiliser TouchListener, vous devez l'ajouter dans le code. C'est juste:

myView.setOnTouchListener(new View.OnTouchListener()
{
    // Implementation;
});
5
CaseyB