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 Berührungsereignis 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 Zeiger auf allen API-Levels erkennen und ablehnen.

Versionskompatibilität

Legen Sie für das minSDK Ihres Projekts API-Level 33 für Ereignisse mit mehreren Zeigern fest. Single-Pointer-Ereignisse werden auf API-Ebenen unterstützt.

Abhängigkeiten

Keine.

Handflächenberührungen erkennen und ignorieren

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

  • Prüfen 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. Bei Android 13 und höher sollten Sie auch nach FLAG_CANCELED suchen.
    • Multi-Pointer-Ereignisse: Prüfen Sie unter Android 13 und höher auf ACTION_POINTER_UP und FLAG_CANCELED.
  • 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 ‑kennzeichnungen ermitteln

Suchen Sie nach ACTION_CANCEL. Dies 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 Displayeffekte der Geste 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 Bewegungserkennungsvorgang verknüpft ist.
  • ACTION_CANCEL: MotionEvent-Konstante, die angibt, dass eine Geste rückgängig gemacht werden soll.
  • ACTION_POINTER_UP: Die MotionEvent-Konstante, die angibt, 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 den Ereignissen ACTION_POINTER_UP und ACTION_CANCEL unter Android 13 (API‑Level 33) und höher hinzugefügt.

Sammlungen, die diesen Leitfaden enthalten

Dieser Leitfaden ist Teil der folgenden kuratierten Sammlungen von 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.