2012-12-04 13 views
8

Mam kilka małych pytań związanych z maskowaniem zdarzeń dotykowych. Czytałem wiele rzeczy tutaj i gdzie indziej, ale wciąż jestem trochę zmieszany z częściami.Android multitouch i getActionMasked()

1) Czy event.getActionMasked() samo jak event.getAction() & MotionEvent.ACTION_MASK (wydają się być na Samsung S2 i HTC Desire)

2) Czy oba powyższe polecenia podać wszystkie informacje i więcej niż event.getAction() sam będzie, czy jest to inna .

3) Napisałem kawałek kodu, który mówi, gdzie jest dotyk, a za pomocą którego wskaźnik jest nieużywany (tylko w przypadku dwóch dotknięć w danym momencie). Wygląda na to, że działa poprawnie na wymienionych wyżej urządzeniach, ale wiem, jak niektóre urządzenia mogą działać zupełnie inaczej, jeśli nie są absolutnie poprawne. Zastanawiam się więc, czy poniższe informacje są poprawne i będą się zachowywać na wszystkich urządzeniach.

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; 
} 

Odpowiedz

16

Niektóre tła -

całkowita zwrócona od getAction jest zapakowany całkowitą, która koduje zarówno kod działania (np ACTION_DOWN) i wskaźnik wskaźnik (np który palec).

W przypadku pojedynczego dotknięcia, ponieważ istnieje tylko jeden palec, nie ma potrzeby przechowywania indeksu wskaźnika, więc wartość jest tylko kodem czynności. W związku z tym można bezpiecznie wykonać operację podobną do tej, jaką można wykonać, np. W trybie multi-touch, to porównanie jest niepoprawne b/c, masz dodatkowy wskaźnik wskaźnika w spakowanej liczbie całkowitej. Można wyodrębnić kod akcji, wykonując getAction() & ACTION_MASK i wyciąg z indeksu wskaźnik wykonując getAction() & ACTION_POINTER_INDEX_MASK

Teraz na pytanie -

1: TAK. pomyśl o getActionMasked jako metodzie pomocnika, która wyodrębnia bity kodu akcji. Aby wyodrębnić indeks wskaźnika, należy użyć równoważnej metody pomocniczej: getActionIndex. Obie te metody będą działać dla jednego lub wielu dotknięć, dlatego są "najbezpieczniejsze".

2: Jak wyjaśniono powyżej, getAction koduje również wskaźnik indeksu dla multitouch

3: jest to błąd w kodzie. event.getPointerId((event.getActionIndex() & MotionEvent.ACTION_MASK)) jest technicznie niepoprawna. Zamiast tego powinieneś robić event.getPointerId(event.getActionIndex()). Otrzymujesz bardzo szczęśliwy z nieprawidłowym logicznym i operacyjnym na getActionIndex, który okazuje się być 2 bajty i sama maska ​​2 bajty (0xff) :)

+0

Doskonałe wyjaśnienie! – George