2013-06-29 7 views
25

Ich bin verwirrt von den beiden Methoden in Android. Es scheint, dass beide Methoden Ihnen sagen, welche Art von Ereignis es ist, , d. H., Ob es ein Down- oder Up-Ereignis ist.Worin besteht in Android der Unterschied zwischen getAction() und getActionMasked() in MotionEvent?

Wann werde ich welche verwenden?

public void onTouchEvent(MotionEvent e) 

Sie zitieren die Dokumentation nicht bitte, weil ich es gelesen, und ich sehe keinen Parameter I auf eine der beiden Methoden liefern kann, etwas anderes zu bekommen.

public final int getAction() 

und

public final int getActionMasked() 

Antwort

18

Ja, sie beide geben die Aktion (Up/Down etc.), aber getAction kann die Aktion mit Zeigerinformation zurückzukehren, in welchem ​​Fall die Ereignisse ein wenig unterschiedlich sein können . getActionMasked liefert immer "einfache" Aktionen mit der Zeigerinformation "Ausmaskiert" (get it?). Sie würden dann getPointerIndex für dasselbe Ereignis aufrufen, um den Zeigerindex zu erhalten. Beachten Sie, dass Sie dies am häufigsten auf Multitouch-Geräten mit mehreren Berührungspunkten (Zeigern) sehen. Der Zeigerindex ist im Wesentlichen eine Möglichkeit, Ereignisse mit Kontaktpunkten abzugleichen, sodass Sie sie unterscheiden können.

+0

was ist dieser Zeiger Informationen? –

+0

Zusätzliche Bitfelder im Rückgabewert; Der Action- und Pointer-Index wird in derselben Ganzzahl zurückgegeben.Android definiert eine Reihe von Bitmasken, um sie zu extrahieren (was im Wesentlichen das ist, was getActionMasked tut) –

29

getAction() gibt eine Zeiger-ID und eine Ereignisinformation (d. H. Hoch, runter, bewegen) zurück.

getActionMasked() gibt nur eine Ereignisinformation (d. H. Hoch, runter, bewegen) zurück. Andere Informationen sind ausgeblendet.

Zum Beispiel:

getAction() kehrt 0x0105.
getActionMasked()0x0005 zurückkehren wird, die 0x0105 & & ACTION_MASK ist.

  1. Der Wert von ACTION_MASK ist 0xFF. Es maskiert die folgenden Aktionen.
    • ACTION_DOWN 0, plus 1, MOVE 2
    • ACTION_POINTER_DOWN 5, UP 6
  2. Der Wert von ACTION_POINTER_ID_MASK ist 0xFF00. Es maskierte die Zeiger-ID von folgenden veralteten Konstanten.
    • ACTION_POINTER_1_DOWN 0x0005
    • ACTION_POINTER_2_DOWN 0x0105
    • ACTION_POINTER_3_DOWN 0x0205
    • ...
+0

Ich sehe es noch nicht: Warum sollte ich jemals getActionMasked() verwenden? Hat das jemals einen Vorteil gegenüber getAction()? – peedee

+3

@peedee Mit 'getAction()' müssen Sie bitshift/maskieren, um diese zwei Daten zu trennen. während mit 'getActionMasked()' und 'getActionIndex()' Sie sie separat erhalten (aber wahrscheinlich zu höheren Laufzeitkosten aufgrund zweier getrennter Funktionsaufrufe). Ich könnte mir vorstellen, dass die von 'getAction()' zurückgegebene kombinierte Darstellung intern im Android-Betriebssystem verwendet wird, da die Kombination von zwei Werten auf der mobilen Hardware Speicher- und Cache-effizienter ist, unter Berücksichtigung der Touch-API speichert auch eine Historie der jüngsten Berührungsereignisse, so dass viele dieser Daten gespeichert werden können. –