Eingabestift-Berührungen der Handfläche ablehnen

Wenn Nutzer mit einem Eingabestift zeichnen, schreiben oder mit einer App interagieren, berühren sie manchmal das Display mit der Handfläche. Das Touch-Ereignis wird möglicherweise an Ihre App gemeldet, bevor das System es als versehentliche Berührung mit der Handfläche erkennt und verwirft.

Ihre App muss zusätzliche Touch-Ereignisse erkennen und ignorieren. Bei Android 13 und höheren API-Levels werden Handflächenberührungen anders als bei allen anderen API-Levels angegeben.

Ergebnisse

Ihre App kann Handflächenberührungen für Ereignisse mit mehreren Zeigern unter Android 13 und höheren API-Levels sowie für Ereignisse mit einem einzelnen Zeiger auf allen API-Levels erkennen und ablehnen.

Handflächenberührungen erkennen und ignorieren

Unter Android wird eine Handflächenberührung abgebrochen, indem ein MotionEvent-Objekt an Ihre App gesendet wird.

  • Untersuchen Sie die MotionEvent-Objekte, die an Ihre App gesendet werden. Verwenden Sie die MotionEvent-APIs, um Ereigniseigenschaften (Aktionen und Flags) zu ermitteln:

    • Ereignisse mit einem Zeiger: Suchen Sie nach ACTION_CANCEL. Prüfen Sie unter Android 13 und höher auch, ob FLAG_CANCELED vorhanden ist.
    • Multi-Pointer-Ereignisse: Bei Android 13 und höher sollten Sie nach ACTION_POINTER_UP und FLAG_CANCELED suchen.
  • Bewegungsereignisse mit den Attributen ACTION_CANCEL und ACTION_POINTER_UP/FLAG_CANCELED ignorieren.

1. Objekte für Bewegungsereignisse abrufen

Fügen Sie Ihrer App ein OnTouchListener hinzu:

Kotlin

val myView = findViewById<View>(R.id.myView).apply {
    setOnTouchListener { view, event ->
        // Process motion event.
    }
}

Java

View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
    // Process motion event.
});

2. Ereignisaktion und ‑flags festlegen

Prüfen Sie, ob ACTION_CANCEL vorhanden ist. Das weist auf ein Single-Pointer-Ereignis auf allen API-Ebenen hin. Bei Android 13 und höher finden Sie FLAG_CANCELED. unter ACTION_POINTER_UP.

Kotlin

val myView = findViewById<View>(R.id.myView).apply {
    setOnTouchListener { view, event ->
        when (event.actionMasked) {
            MotionEvent.ACTION_CANCEL -> {
                //Process canceled single-pointer motion event for all SDK versions.
            }
            MotionEvent.ACTION_POINTER_UP -> {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
                   (event.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) {
                    //Process canceled multi-pointer motion event for Android 13 and higher.
                }
            }
        }
        true
    }
}

Java

View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_CANCEL:
            // Process canceled single-pointer motion event for all SDK versions.
        case MotionEvent.ACTION_UP:
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
               (event.getFlags() & MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) {
                //Process canceled multi-pointer motion event for Android 13 and higher.
            }
    }
    return true;
});

3. Geste rückgängig machen

Wenn Sie eine Handflächenberührung erkannt haben, können Sie die Auswirkungen der Geste auf dem Display rückgängig machen.

Ihre App muss einen Verlauf der Nutzeraktionen führen, damit unbeabsichtigte Eingaben wie Berührungen mit der Handfläche rückgängig gemacht werden können. Ein Beispiel dafür, wie der Verlauf beibehalten wird, finden Sie im Codelab Stiftunterstützung in einer Android-App verbessern unter Einfache Zeichen-App implementieren.

Wichtige Fakten

  • MotionEvent: Stellt Touch- und Bewegungsereignisse dar. Enthält die Informationen, die erforderlich sind, um zu bestimmen, ob ein Ereignis ignoriert werden soll.
  • OnTouchListener#onTouch(): Empfängt MotionEvent-Objekte.
  • MotionEvent#getActionMasked(): Gibt die Aktion zurück, die mit einem Bewegungsereignis verknüpft ist.
  • ACTION_CANCEL: MotionEvent-Konstante, die angibt, dass eine Geste rückgängig gemacht werden soll.
  • ACTION_POINTER_UP: Die Konstante MotionEvent gibt an, dass ein anderer als der erste Zeiger nach oben bewegt wurde (d. h. den Kontakt mit dem Gerätebildschirm verloren hat).
  • FLAG_CANCELED: MotionEvent-Konstante, die angibt, dass das Hochgehen des Zeigers ein unbeabsichtigtes Touch-Ereignis verursacht hat. Wurde ACTION_POINTER_UP- und ACTION_CANCEL-Ereignissen unter Android 13 (API‑Level 33) und höher hinzugefügt.

Sammlungen, die diesen Leitfaden enthalten

Dieser Leitfaden ist Teil der folgenden Kurzanleitungen, die umfassendere Ziele der Android-Entwicklung abdecken:

Sorgen Sie dafür, dass Ihre App eine optimierte Nutzerfreundlichkeit auf Tablets, Foldables und ChromeOS-Geräten bietet.

Fragen oder Feedback

Auf der Seite mit den häufig gestellten Fragen finden Sie Kurzanleitungen. Sie können uns aber auch gern kontaktieren und uns Ihre Meinung mitteilen.