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.

Alex
quelle

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.

dbrettschneider
quelle
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

Suragch
quelle
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;
    }
Sephy
quelle
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
    })
cjung
quelle