Comment obtenir la position tactile dans Android?

92

J'ai besoin d'obtenir la position de début tactile (X, Y), la position de déplacement tactile et la position finale tactile de l'écran sous Android.

Alex
la source

Réponses:

169
@Override
public boolean onTouchEvent(MotionEvent event)
{
    int x = (int)event.getX();
    int y = (int)event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_UP:
    }

    return false;
}

Les trois cas sont pour que vous puissiez réagir à différents types d'événements, dans cet exemple en appuyant ou en faisant glisser ou en soulevant à nouveau le doigt.

dbrettschneider
la source
7
Pourquoi renvoyez-vous faux?
Daniel Reyhanian
1
La valeur de retour de true signifierait que l'événement tactile a été géré et que cela empêcherait la propagation de l'événement et vice versa.
chaosifier
27

Réponse supplémentaire

Étant donné un OnTouchListener

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;
    }
};

mis sur une vue:

myView.setOnTouchListener(handleTouch);

Cela vous donne les coordonnées de l'événement tactile par rapport à la vue à laquelle l'écouteur tactile lui est attribué. Le coin supérieur gauche de la vue est (0, 0). Si vous déplacez votre doigt au-dessus de la vue, ce ysera négatif. Si vous déplacez votre doigt à gauche de la vue, ce xsera négatif.

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

Si vous voulez les coordonnées relatives au coin supérieur gauche de l'écran de l'appareil, utilisez les valeurs brutes.

int x = (int)event.getRawX();
int y = (int)event.getRawY();

en relation

Suragch
la source
Cela fonctionne, mais dans mes tests, la vue à laquelle l'auditeur est ajouté ne doit pas être couverte par d'autres vues. Pour obtenir les coordonnées absolues de la position touchée à l'écran, j'ai ajouté une mise en page en tant que vue de base, et en plus, la vue avec l'auditeur. N'oubliez pas return falsesinon cela consommera le toucher.
lenooh le
@lenooh getRawX()et getRawY()doit renvoyer les coordonnées absolues de la position tactile sur toute vue à laquelle l'auditeur est ajouté. Mais vous avez raison, s'il y a une autre vue au-dessus qui revient true, alors aucune vue inférieure ne sera notifiée des événements tactiles.
Suragch le
Suragch: exactement. Depuis que j'utilise un FrameLayout, j'ai défini la vue sur "matchParent" getX()et getY()fonctionne très bien (pas besoin de getRawX/Y()).
lenooh
@Suragch Est-il possible d'enregistrer le toucher même s'il est couvert par une autre vue ou s'il a des enfants comme des boutons?
vignesh kumar le
@vigneshkumar, les vues sont notifiées des événements tactiles de bas en haut (voir le lien en bas de ma réponse), vous pouvez donc enregistrer l'événement onInterceptTouchEventpuis revenir falsepour que l'événement soit traité normalement.
Suragch le
10
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }
Sephy
la source
0

Voici le style Koltin, je l'utilise dans mon projet et cela fonctionne très bien:

this.yourview.setOnTouchListener(View.OnTouchListener { _, event ->
        val x = event.x
        val y = event.y

        when(event.action) {
            MotionEvent.ACTION_DOWN -> {
                Log.d(TAG, "ACTION_DOWN \nx: $x\ny: $y")
            }
            MotionEvent.ACTION_MOVE -> {
                Log.d(TAG, "ACTION_MOVE \nx: $x\ny: $y")
            }
            MotionEvent.ACTION_UP -> {
                Log.d(TAG, "ACTION_UP \nx: $x\ny: $y")
            }
        }
        return@OnTouchListener  true
    })
cjung
la source