2013-06-29 17 views
25

Jestem zdezorientowany przez dwie metody w systemie Android. Wydaje się, że obie metody informują o tym, jakiego rodzaju jest to zdarzenie, tj. Czy jest to zdarzenie w dół, czy w górę.W Androidzie, jaka jest różnica między getAction() i getActionMasked() w MotionEvent?

Kiedy będę używać?

public void onTouchEvent(MotionEvent e) 

Nie zacytować dokumentację proszę, bo ja ją przeczytać, a ja nie widzę żadnego parametru mogę dostarczyć do jednej z metod, aby dostać coś innego.

public final int getAction() 

i

public final int getActionMasked() 

Odpowiedz

18

Tak, oboje wrócić akcję (góra/dół), ale getAction może powrócić do działania z informacji wskaźnik, w którym to przypadku zdarzenia mogą być nieco inna . getActionMasked zawsze zwróci "proste" akcje z informacją o wskaźniku "Zamaskowane" (otrzymasz?), które następnie wywołasz getPointerIndex na tym samym zdarzeniu, aby uzyskać indeks wskaźnika. Zwróć uwagę, że najczęściej to widzisz na urządzeniach wielodotykowych z wieloma punktami kontaktu (wskaźniki). Indeks wskaźnika jest zasadniczo sposobem dopasowywania zdarzeń do punktów kontaktu, dzięki czemu można je odróżnić.

+0

co jest ta informacja wskaźnik? –

+0

Dodatkowe pola bitowe w zwracanej wartości; akcja i wskaźnik wskaźnika są zwracane w tej samej liczbie całkowitej.Android definiuje zestaw masek bitowych do ich ekstrakcji (co w zasadzie robi getActionMasked). –

29

getAction() zwraca identyfikator wskaźnika i informację o zdarzeniu (tj. W górę, w dół, ruch).

getActionMasked() zwraca tylko informację o zdarzeniu (tj. W górę, w dół, ruch). Pozostałe informacje są zamaskowane.

Na przykład

getAction() powraca 0x0105.
getActionMasked() powróci 0x0005, który 0x0105 & & ACTION_MASK.

  1. Wartość ACTION_MASK to 0xFF. Maskuje następujące działania.
    • ACTION_DOWN 0 UP 1, MOVE 2
    • ACTION_POINTER_DOWN 5, wzrost 6
  2. Wartość ACTION_POINTER_ID_MASK jest 0xFF00. To zamaskowało identyfikator wskaźnika z następujących przestarzałych stałych.
    • ACTION_POINTER_1_DOWN 0x0005
    • ACTION_POINTER_2_DOWN 0x0105
    • ACTION_POINTER_3_DOWN 0x0205
    • ...
+0

Nie widzę tego jeszcze: dlaczego miałbym kiedykolwiek chcieć użyć getActionMasked()? czy kiedykolwiek ma jakąkolwiek przewagę nad getAction()? – peedee

+3

@peedee Z 'getAction()', musisz bitshift/mask, aby oddzielić te dwie części danych; natomiast z 'getActionMasked()' i 'getActionIndex()' dostajesz je oddzielnie (ale prawdopodobnie przy wyższym koszcie runtime, z powodu dwóch oddzielnych wywołań funkcji). Mogę sobie wyobrazić, że połączona reprezentacja zwrócona przez 'getAction()' jest używana wewnętrznie w systemie operacyjnym Android, ponieważ połączenie dwóch wartości w ten sposób zapewnia większą pojemność pamięci podręcznej i pamięci podręcznej na urządzeniach mobilnych, mając na uwadze, że interfejs dotykowy API również przechowuje historię ostatnich zdarzeń dotyku, więc może być wiele z tych danych, które mają być przechowywane. –