2012-12-04 9 views
8

Ich habe ein paar kleine Fragen mit der Maskierung von Berührungsereignissen zu tun. Ich habe viele Dinge hier und anderswo gelesen, bin aber immer noch ein wenig verwirrt mit Teilen.Android Multitouch und getActionMasked()

1) Ist event.getActionMasked() gleiche wie event.getAction() & MotionEvent.ACTION_MASK (sie auf Samsung S2 und HTC Desire zu sein scheinen)

2) Werden die beiden oben genannten Befehle geben alle Informationen, und mehr als das event.getAction() allein, oder ist es anders .

3) Ich habe ein Stück Code geschrieben, der einfach sagt, wo und mit welcher pointerId die Berührung ist, oder ob der Zeiger nicht benutzt wird (nur für zwei Berührungen im Moment geschrieben). Es scheint auf den oben genannten Geräten korrekt zu funktionieren, aber ich weiß, wie manche Geräte sehr unterschiedlich funktionieren können, wenn sie nicht absolut korrekt ausgeführt werden. Ich frage mich daher, ob das Folgende stimmt und sich auf allen Geräten verhält.

boolean pointer0down=false, pointer1down=false; 
String st="", str0 ="", str1 =""; 

public boolean onTouchEvent(MotionEvent event) 
{ 

    if (event.getActionMasked()==MotionEvent.ACTION_UP 
     ||event.getActionMasked()==MotionEvent.ACTION_POINTER_UP 
     ||event.getActionMasked()==MotionEvent.ACTION_CANCEL) 
    { 
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==0) 
     pointer0down=false; 
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==1) 
     pointer1down=false; 
    } 

    if (event.getActionMasked()==MotionEvent.ACTION_DOWN 
    ||event.getActionMasked()==MotionEvent.ACTION_POINTER_DOWN) 
    { 
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==0) 
     pointer0down=true; 
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==1) 
     pointer1down=true; 
    } 

if (pointer0down) 
    str0="\tx: " + event.getX(0) + "\ty: "+event.getY(0); 
else 
    str0="\tNot down"; 

if (pointer1down) 
    str1="\tx: " + event.getX(1) + "\ty: "+event.getY(1); 
else 
    str1="\tNot down"; 

st="pointer0:"+str0+"\npointer1:"+str1; 

    return true; 
} 

Antwort

16

Einige Hintergrundinformationen -

Die ganze Zahl von zurück getAction ist eine ganze Zahl gepackt, die sowohl den Aktionscode (z.B. ACTION_DOWN) und Zeigerindex (beispielsweise die Finger) kodiert.

Bei einer Berührung, da nur ein Finger vorhanden ist, muss der Zeigerindex nicht gespeichert werden, so dass der Wert nur der Aktionscode ist. Daher ist es sicher, etwas zu tun wie getAction() == ACTION_DOWN

Bei Multi-Touch ist dieser Vergleich falsch b/c Sie haben den zusätzlichen Zeigerindex in der verpackten Ganzzahl. Sie können den Aktionscode extrahieren, indem getAction() & ACTION_MASK tun und den Zeiger Index extrahieren, indem getAction() & ACTION_POINTER_INDEX_MASK

Nun zu Ihrer Frage zu tun -

1: Ja. Denken Sie an getActionMasked als eine Hilfsmethode, die die Action-Code-Bits extrahieren. Um den Zeigerindex zu extrahieren, haben Sie die entsprechende getActionIndex Hilfsmethode. Beide Methoden funktionieren für Single oder Multi Touch, daher sind sie die "sichersten".

2: Wie oben erläutert, getAction kodiert auch Zeigerindex für Multi-Touch-

3: gibt es einen Fehler im Code. event.getPointerId((event.getActionIndex() & MotionEvent.ACTION_MASK)) ist technisch falsch. Stattdessen sollten Sie event.getPointerId(event.getActionIndex()) tun. Sie bekommen sehr glücklich mit dem falschen logischen und Operator auf getActionIndex, die sich herausstellt, um 2 Bytes und die Maske ist selbst 2 Bytes (0xff) :)

+0

Ausgezeichnete Erklärung! – George