Wie bekomme ich die Touch-Position in Android?


92

Ich muss die Touch-Startposition (X, Y), die Touch-Move-Position und die Touch-Endposition des Bildschirms in Android erhalten.

Antworten:


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

In den drei Fällen können Sie auf verschiedene Arten von Ereignissen reagieren, in diesem Beispiel durch Antippen oder Ziehen oder erneutes Anheben des Fingers.


7
Warum gibst du falsch zurück?
Daniel Reyhanian

1
Der Rückgabewert von true würde bedeuten, dass das Berührungsereignis behandelt wurde, und dies würde verhindern, dass sich das Ereignis ausbreitet und umgekehrt.
Chaosifier

27

Ergänzende Antwort

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

auf eine Ansicht gesetzt:

myView.setOnTouchListener(handleTouch);

Auf diese Weise erhalten Sie die Koordinaten des Berührungsereignisses relativ zur Ansicht, der der Berührungslistener zugewiesen ist. Die obere linke Ecke der Ansicht ist (0, 0). Wenn Sie Ihren Finger über die Ansicht bewegen, ist ydies negativ. Wenn Sie Ihren Finger links von der Ansicht bewegen, ist xdies negativ.

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

Wenn Sie die Koordinaten relativ zur oberen linken Ecke des Gerätebildschirms möchten, verwenden Sie die Rohwerte.

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

verbunden


Dies funktioniert, aber in meinen Tests sollte die Ansicht, zu der der Listener hinzugefügt wird, nicht durch andere Ansichten abgedeckt werden. Um die absoluten Koordinaten der berührten Position auf dem Bildschirm zu erhalten, habe ich ein Framelayout als Basisansicht und darüber die Ansicht mit dem Hörer hinzugefügt. Vergessen Sie nicht, return falsesonst wird es die Berührung verbrauchen.
Lenooh

@lenooh, getRawX()und getRawY()sollte die absoluten Koordinaten der Berührungsposition in jeder Ansicht zurückgeben, zu der der Hörer hinzugefügt wird. Aber Sie haben Recht, wenn darüber eine andere Ansicht zurückgegeben truewird, werden keine niedrigeren Ansichten über Berührungsereignisse benachrichtigt.
Suragch

Suragch: genau. Da ich ein FrameLayout verwende, setze ich die Ansicht auf "matchParent" getX()und getY()arbeite einwandfrei (keine Notwendigkeit getRawX/Y()).
Lenooh

@Suragch Gibt es überhaupt eine Möglichkeit, Berührungen aufzuzeichnen, selbst wenn diese von einer anderen Ansicht abgedeckt werden oder Kinder wie Schaltflächen haben?
Vignesh Kumar

@vigneshkumar, Ansichten werden von unten nach oben über Berührungsereignisse benachrichtigt (siehe den Link unten in meiner Antwort), sodass Sie das Ereignis in aufzeichnen onInterceptTouchEventund dann zurückkehren können, falsedamit das Ereignis wie gewohnt verarbeitet wird.
Suragch

10
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }

0

Hier ist der Koltin-Stil, den ich in meinem Projekt verwende und der sehr gut funktioniert:

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
    })
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.