Android obsługuje różne ekrany dotykowe i pady dotykowe, w tym tablety digitizera z rysikiem.
Ekrany dotykowe to urządzenia dotykowe powiązane z wyświetlaczem. użytkownik ma wrażenie, że bezpośrednio manipuluje elementami na ekranie.
Pętle dotykowe to urządzenia dotykowe, które nie są powiązane z ekranem, np. tablety dotykowe. Touchpady są zwykle używane do wskazywania bez pośredniego pozycjonowania lub sterowania za pomocą gestów.
Urządzenia dotykowe mogą mieć przyciski, których działanie jest podobne do przycisków myszy.
Urządzeniami dotykowymi można czasami obsługiwać za pomocą różnych narzędzi np. palcami lub rysikiem w zależności od technologii czujnika dotykowego.
Klawisze wirtualne są czasem implementowane na urządzeniach dotykowych. Na przykład na niektórych urządzeniach z Androidem obszar czujnika ekranu dotykowego wykracza poza krawędź wyświetlacza i pełni podwójną funkcję jako część klawiatury dotykowej.
Ze względu na dużą różnorodność urządzeń dotykowych Android korzysta z dużej liczby właściwości konfiguracji, aby opisywać właściwości i pożądane zachowanie poszczególnych urządzeń.
Klasyfikacja urządzenia dotykowego
Urządzenie wejściowe jest klasyfikowane jako urządzenie z obsługą wielodotykową, jeśli: spełnione są następujące warunki:
- Urządzenie wejściowe zgłasza obecność elementów
ABS_MT_POSITION_X
i Osie bezwzględne:ABS_MT_POSITION_Y
. - Urządzenie wejściowe nie ma żadnych przycisków kontrolera. Ten warunek rozwiązuje problem z określonymi padami do gier, które zgłaszają osie z kodami; który nakłada się na osie MT.
Urządzenie wejściowe jest klasyfikowane jako urządzenie jednokrotnego dotknięcia, jeśli spełnione są następujące warunki:
- Urządzenie wejściowe nie jest klasyfikowane jako urządzenie wielodotykowe. Urządzenie wejściowe jest klasyfikowana jako urządzenie wielodotykowe lub wielodotykowe, ani jedno, i drugie.
- Urządzenie wejściowe zgłasza obecność osi bezwzględnych
ABS_X
iABS_Y
oraz kod klawiszaBTN_TOUCH
.
Gdy urządzenie wejściowe zostanie sklasyfikowane jako urządzenie dotykowe, obecność klawiszy wirtualnych jest określana przez próbę załadowania pliku mapy klawiszy wirtualnych dla tego urządzenia. Jeśli dostępna jest mapa klawiszy wirtualnych, wczytywane jest też plik z układem klawiszy dla urządzenia. Zapoznaj się z [plikami mapy kluczy wirtualnych](#virtual-key-map-files) .
Następnie system wczytuje plik konfiguracji urządzenia wejściowego dla urządzenia dotykowego.
Wszystkie wbudowane urządzenia dotykowe powinny mieć pliki konfiguracji urządzenia wejściowego. Jeśli nie ma pliku konfiguracji urządzenia wejściowego, system wybierze domyślną konfigurację odpowiednią dla urządzeń peryferyjnych dotykowych ogólnego przeznaczenia, takich jak zewnętrzne ekrany dotykowe USB lub Bluetooth HID lub panele dotykowe. Te domyślne ustawienia nie są przeznaczone do wbudowanych ekranów dotykowych i mogą powodować nieprawidłowe działanie.
Po załadowaniu konfiguracji urządzenia wejściowego system zaklasyfikuje to urządzenie jako ekran dotykowy, panel dotykowy lub wskaźnik.
- Urządzenie z ekranem dotykowym służy do bezpośredniego manipulacji obiektami na ekranu. Użytkownik dotyka ekranu bezpośrednio, dzięki czemu system wymaga dodatkowych afordancji, aby wskazać obiekty, które są zmanipulowane.
- Pad dotykowy służy do przekazywania aplikacji informacji o bezwzględnym położeniu dotyku w danym obszarze czujnika. Może to być przydatne w przypadku tabletów do digitalizacji.
- Wskaźnik służy do pośredniego manipulowania obiektami na ekranie za pomocą kursora. Palce są interpretowane jako wskaźnik wielodotykowy gestami. Inne narzędzia, takie jak rysiki, są interpretowane przy użyciu pozycji bezwzględnych. Więcej informacji znajdziesz w artykule Gesty sterowania pośredniego za pomocą wskaźnika wielodotykowego.
Do klasyfikowania urządzenia wejściowego jako ekranu dotykowego, touchpada lub urządzenia wskazującego służą te reguły.
- Jeśli właściwość
touch.deviceType
jest ustawiona, typ urządzenia jest ustawiony zgodnie z wspomnianym. - Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej
INPUT_PROP_DIRECT
(za pomocą ioctlEVIOCGPROP
), typ urządzenia jest ustawiany na ekran dotykowy. Ten warunek zakłada, że dotyk bezpośredniego wprowadzania danych a urządzenia są podłączone do wyświetlacza, który również jest podłączony. - Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej
INPUT_PROP_POINTER
(za pomocą ioctlEVIOCGPROP
), typ urządzenia jest ustawiony na wskaźnik. - Jeśli urządzenie wejściowe zgłasza obecność osi względnych
REL_X
lubREL_Y
, typ urządzenia jest ustawiany jako panel dotykowy. Ten warunek niejednoznaczne w przypadku urządzeń wejściowych, które składają się z myszy na touchpadzie. W tym przypadku pad dotykowy nie służy do sterowania wskaźnik, bo mysz już nim steruje. - W przeciwnym razie typ urządzenia jest ustawiony na wskaźnik. To ustawienie domyślne zapewnia które nie służą do żadnych innych zastosowań specjalnych. sterować wskaźnikiem.
Przyciski
Przyciski to opcjonalne ustawienia, których mogą używać aplikacje. z dodatkowymi funkcjami. Przyciski na urządzeniach dotykowych działają podobnie jak mysz są używane głównie w przypadku urządzeń dotykowych z wskaźnikiem oraz rysik.
Obsługiwane są te przyciski:
BTN_LEFT
: mapowano na:MotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: przypisane doMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: mapowano na:MotionEvent.BUTTON_MIDDLE
.BTN_BACK
iBTN_SIDE
: zmapowane naMotionEvent.BUTTON_BACK
. Naciśnięcie tego przycisku spowoduje również syntezę naciśnięcia klawisza z kodem klawiszaKeyEvent.KEYCODE_BACK
.BTN_FORWARD
iBTN_EXTRA
: zmapowane naMotionEvent.BUTTON_FORWARD
. Naciśnięcie tego przycisku powoduje również syntezę naciśnięcia klawisza z kodem klawiszaKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: przypisane doMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: przypisane doMotionEvent.BUTTON_TERTIARY
.
Narzędzia i ich typy
Narzędzie to palec, rysik lub inne urządzenie służące do interakcji z nim. urządzenia dotykowego. Niektóre urządzenia dotykowe rozróżniają różnych typów narzędzi.
W innych miejscach w Androidzie, podobnie jak w interfejsie API MotionEvent
, narzędzie jest często nazywane wskaźnikiem.
Obsługiwane są te typy narzędzi:
BTN_TOOL_FINGER
iMT_TOOL_FINGER
: mapowano naMotionEvent.TOOL_TYPE_FINGER
BTN_TOOL_PEN
iMT_TOOL_PEN
: mapowano naMotionEvent.TOOL_TYPE_STYLUS
BTN_TOOL_RUBBER
: przypisane doMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: mapowano na:MotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: mapowano na:MotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: mapowano na:MotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: mapowano na:MotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: mapowano na:MotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
iBTN_TOOL_QUADTAP
: mapowano na:MotionEvent.TOOL_TYPE_FINGER
.
Narzędzia dotykowe i najeżdżanie kursorem
Narzędzia mogą mieć kontakt z urządzeniem dotykowym lub znajdować się w zasięgu i najeżdżać kursorem nad nim. Nie wszystkie urządzenia dotykowe mogą wykrywać obecność narzędzia unoszonego nad urządzeniem dotykowym. Funkcje obsługiwane, takie jak cyfrowe cyfrowy rysiki oparte na częstotliwości radiowej, często wykrywają, czy narzędzie znajduje się w ograniczonym zasięgu digitizera.
Komponent InputReader
odróżnia narzędzia dotykowe od narzędzi do nawigacji. Analogicznie aplikacje dotykają narzędzi do dotykania i najeżdżania kursorem.
na różne sposoby.
Narzędzia dotykowe są zgłaszane aplikacjom jako zdarzenia dotykowe za pomocą MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
i MotionEvent.ACTION_POINTER_UP
.
Narzędzia do najeżdżania kursorem są raportowane w aplikacjach jako ogólne zdarzenia ruchu przez
MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
,
i MotionEvent.ACTION_HOVER_EXIT
.
Wymagania dotyczące sterownika urządzenia dotykowego
- Sterowniki urządzeń dotykowych powinny rejestrować tylko osie i klucze kodów dla osi oraz przycisków, które obsługują. Rejestrowanie nieobsługiwanych osi lub kodów klawiszy może dezorientować algorytm klasyfikacji urządzenia lub spowodować, że system nieprawidłowo wykryje możliwości urządzenia. Jeśli na przykład urządzenie zgłasza kod klawisza
BTN_TOUCH
, system zakłada, żeBTN_TOUCH
jest zawsze używany do wskazywania, czy narzędzie dotyka ekranu. Dlatego nie należy używaćBTN_TOUCH
, aby wskazać, że narzędzie znajduje się w zakresie i jest tylko najeżdżane. - Urządzenia jednodotykowe używają tych zdarzeń wejściowych w systemie Linux:
ABS_X
: (WYMAGANE) przekazuje współrzędną X narzędzia.ABS_Y
: (WYMAGANE) podaje współrzędną Y narzędzia.ABS_PRESSURE
: (opcjonalnie) raportuje nacisk fizyczny na końcówkę narzędzia lub siłę sygnału dotyku.ABS_TOOL_WIDTH
: (opcjonalnie) raportuje pole przekroju lub szerokość punktu styczności z dotykiem lub samego narzędzia.ABS_DISTANCE
: (opcjonalnie) podaje odległość narzędzia od powierzchni. urządzenia dotykowego.ABS_TILT_X
: (opcjonalnie) zwraca pochylenie narzędzia względem powierzchni urządzenia dotykowego wzdłuż osi X.ABS_TILT_Y
: (opcjonalnie) zwraca pochylenie narzędzia względem powierzchni urządzenia dotykowego wzdłuż osi Y.BTN_TOUCH
: (WYMAGANE) wskazuje, czy narzędzie dotyka urządzenia.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcjonalnie) stany przycisku w raportach.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (opcjonalnie) Raportuje typ narzędzia.
- Urządzenia z obsługą wielu dotyku używają tych zdarzeń wejściowych w systemie Linux:
ABS_MT_POSITION_X
: (WYMAGANE) przekazuje współrzędną X narzędzia.ABS_MT_POSITION_Y
: (WYMAGANE) podaje współrzędną Y narzędzia.ABS_MT_PRESSURE
: (opcjonalnie) raportuje nacisk fizyczny wywierany na miejsce końcówką narzędzia lub siłę sygnału kontaktu dotykowego.ABS_MT_TOUCH_MAJOR
: (opcjonalnie) zwraca pole przekroju powierzchni dotykowej lub długość dłuższego wymiaru powierzchni dotykowej.ABS_MT_TOUCH_MINOR
: (opcjonalnie) zwraca długość krótszego wymiaru punktu styczności. Tej osi nie należy używać, jeśli parametrABS_MT_TOUCH_MAJOR
raportuje pomiar powierzchni.ABS_MT_WIDTH_MAJOR
: (opcjonalnie) raportuje pole przekroju poprzecznego lub długość dłuższego wymiaru samego narzędzia. Nie używaj tej osi chyba że znasz wymiary samego narzędzia.ABS_MT_WIDTH_MINOR
: (opcjonalnie) raportuje długość krótszego wymiaru narzędzia. Nie należy używać tej osi, jeśliABS_MT_WIDTH_MAJOR
podaje pomiar powierzchni lub jeśli wymiary narzędzia są nieznane.ABS_MT_ORIENTATION
: (opcjonalnie) zwraca orientację narzędzia.ABS_MT_DISTANCE
: (opcjonalnie) podaje odległość narzędzia od powierzchni urządzenia dotykowego.ABS_MT_TOOL_TYPE
: (opcjonalnie) zgłasza tool type,MT_TOOL_FINGER
lubMT_TOOL_PEN
.ABS_MT_TRACKING_ID
: (opcjonalnie) podaje identyfikator śledzenia narzędzia. Identyfikator śledzenia to dowolna nieujemna liczba całkowita, która służy do identyfikowania i śledzić je niezależnie, gdy aktywnych jest wiele narzędzi. Przykład: gdy kilka palców dotyka urządzenia, każdy z nich powinien mieć przypisany identyfikatora śledzenia, który jest używany, gdy palec pozostaje w kontakcie. Identyfikatory śledzenia można ponownie użyć, gdy powiązane z nimi narzędzia znajdą się poza zasięgiem.ABS_MT_SLOT
: (opcjonalnie) raportuje identyfikator boksu narzędzia, gdy używasz parametru Protokół „B” w systemie Linux. Zapoznaj się z dokumentacją protokołu Multi-touch w Linuksie .BTN_TOUCH
: (WYMAGANE) wskazuje, czy narzędzie dotyka urządzenia.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcjonalnie) stany przycisku w raportach.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (optional) Raportuje typ narzędzia.
- Jeśli zdefiniowane są osie dla protokołu jedno- i wielodotykowego, używane są tylko osie wielodotykowe, a osie jednodotykowe są ignorowane.
Minimalne i maksymalne wartości osi
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
iABS_MT_POSITION_Y
określają granice aktywnej powierzchni urządzenia w jednostkach powierzchni specyficznych dla urządzenia. W przypadku ekranu dotykowego aktywny obszar określa część urządzenia dotykowego, która faktycznie pokrywa wyświetlacz.W przypadku ekranu dotykowego system automatycznie interpoluje zgłoszony dotyk położenie w jednostkach powierzchni w celu uzyskania pozycji dotyku w pikselach wyświetlacza zgodnie z w następujący sposób:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Ekran dotykowy może zgłosić dotknięcia poza zgłoszonym obszarem aktywnym.
Dotknięcia rozpoczęte poza obszarem aktywnym nie są przesyłane do aplikacji, ale można ich używać do obsługi klawiszy wirtualnych.
Dotknięcia inicjowane w aktywnym obszarze lub otwierające i zamykające ekran do aplikacji. W konsekwencji, jeśli dotknięcie rozpoczyna się w granicach aplikacji, a potem przenosi się poza aktywny obszar, aplikacja może odbierać zdarzenia dotyku z współrzędnymi wyświetlacza o ujemnych wartościach lub wykraczające poza granice wyświetlacza. To prawidłowy proces.
Urządzenie dotykowe nigdy nie powinno ograniczać współrzędnych dotyku do granic aktywnej w pobliżu. Jeśli dotyk wykracza poza aktywny obszar, powinien być zgłoszony jako wykraczający poza aktywny obszar lub nie powinien być zgłaszany wcale.
Jeśli na przykład palec użytkownika dotknie ekranu dotykowego w pobliżu lewego górnego rogu, współrzędne mogą być podawane jako (minX, minY). Jeśli palec będzie się powtarzał przed wyjściem poza aktywny obszar, ekran dotykowy powinien raportowania współrzędnych z komponentami mniejszymi niż minX i minY, np. (minX – 2, minY – 3) lub powinien całkowicie przestać zgłaszać dotyk. Inaczej mówiąc, ekran dotykowy nie powinien przekazywać wartości (minX, minY), gdy palec użytkownika dotyka obszaru poza obszarem aktywnym.
Dociśnięcie współrzędnych dotyku do krawędzi wyświetlacza powoduje utworzenie sztucznego granicę wokół krawędzi ekranu, która uniemożliwia systemowi płynnie śledzić ruchy rozpoczynające się od granic obszaru wyświetlania.
Wartości zgłaszane przez funkcję
ABS_PRESSURE
lubABS_MT_PRESSURE
, jeśli nie są zgłaszane, musi wynosić zero, gdy narzędzie dotyka urządzenia i 0, aby wskazać, że narzędzie je zatrzymuje.Informacje o częstotliwości raportowania są opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą korzystać z informacji o ciśnieniu, aby zaimplementować rysowanie wrażliwe na nacisk i innych efektów.
Wartości zwracane przez
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
lubABS_MT_WIDTH_MINOR
powinny być różne od 0, gdy narzędzie dotyka urządzenia, a w przeciwnym razie powinny być równe 0. Nie jest to jednak wymagane. Na przykład urządzenie dotykowe może mierzyć rozmiar dotyku palcem, ale nie dotyku rysika.Informacje o rozmiarze raportowania są opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą korzystać z informacji o ciśnieniu, aby zaimplementować rysowanie z uwzględnieniem rozmiaru i innych efektów.
Wartości raportowane przez funkcję
ABS_DISTANCE
lubABS_MT_DISTANCE
powinny gdy narzędzie dotyka urządzenia, zbliża się do zera. Odległość może być niezerowa nawet wtedy, gdy narzędzie jest w bezpośrednim kontakcie. Dokładne raportowane wartości zależą w sposób, w jaki sprzęt mierzy odległość.Raportowanie informacji o odległości jest opcjonalne, ale zalecane w przypadku urządzeń ze stycznym.
Wartości zwracane przez
ABS_TILT_X
iABS_TILT_Y
powinny być równe zeru, gdy narzędzie jest prostopadłe do urządzenia. Nachylenie inne niż zero oznacza, że narzędzie jest trzymane pod kątem.Kąty nachylenia wzdłuż osi X i Y są podawane w stopniach w stosunku do prostopadłości. Punkt środkowy (idealnie prostopadły) jest podany przez
(max + min) / 2
dla każdej osi. Wartości mniejsze niż punkt środkowy reprezentują przechylenie do góry lub w lewo, wartości większe niż punkt środkowy reprezentują przechylenie do dołu lub w prawo.InputReader
przekształca komponenty pochylenia X i Y w prostopadłe kąty nachylenia w zakresie od 0 doPI / 2
radianów oraz kąty orientacji w płaszczyźnie w zakresie od-PI
doPI
radianów. Rezultatem jest opis orientacji zgodny z tym, co jest używane do opisu dotknięć palców.Raportowanie informacji o przechyleniu jest opcjonalne, ale zalecane w przypadku urządzeń ze sterowaniem dotykowym.
Jeśli typ narzędzia jest raportowany przez
ABS_MT_TOOL_TYPE
, zastępuje wszystkie narzędzia – typ informacji zgłoszonych przez:BTN_TOOL_*
. Jeśli nie ma żadnych informacji o typie narzędzia, domyślnie jest toMotionEvent.TOOL_TYPE_FINGER
.Narzędzie jest określane jako aktywne na podstawie tych warunków:
W przypadku korzystania z protokołu jednokrotnego dotknięcia narzędzie jest aktywne, jeśli
BTN_TOUCH
, lubBTN_TOOL_*
to 1.Ten warunek oznacza, że
InputReader
musi mieć co najmniej niektóre informacji na temat charakteru narzędzia – czy jest ono dotykane, a przynajmniej typ narzędzia. Jeśli nie ma dostępnych informacji, Narzędzie jest uznawane za nieaktywne (poza zakresem).- Gdy używasz protokołu wielodotykowego „A”, narzędzie jest aktywne, gdy jest widoczne w najnowszym raporcie synchronizacji. Gdy narzędzie przestanie się pojawiać w raportach synchronizacji, przestanie istnieć.
- Gdy używasz protokołu wielodotykowego „B”, narzędzie jest aktywne, dopóki ma aktywny slot. Gdy slot zostanie zwolniony, narzędzie przestaje istnieć.
- Działanie narzędzia zostaje określone jako najechanie kursorem na podstawie tych warunków:
- Jeśli narzędzie jest
BTN_TOOL_MOUSE
lubBTN_TOOL_LENS
, to nie jest ono najeżdżane, nawet jeśli spełniony jest co najmniej jeden z tych warunków. - Jeśli narzędzie jest aktywne i sterownik przesyła informacje o ciśnieniu, a przesyłane ciśnienie wynosi 0, oznacza to, że narzędzie się unosi.
- Jeśli narzędzie jest aktywne, a sterownik obsługuje kod klucza
BTN_TOUCH
iBTN_TOUCH
ma wartość zero, to znaczy, że narzędzie się znajduje.
- Jeśli narzędzie jest
InputReader
obsługuje zarówno protokół wielodotykowy „A” i „B”. Nowi kierowcy należy użyć funkcji „B” ale oba te rozwiązania działają.W Androidzie 4.0 może być konieczna zmiana sterowników ekranu dotykowego pod kątem zgodności ze specyfikacją protokołu wejściowego systemu Linux.
Może być konieczne wprowadzenie tych zmian:
Gdy narzędzie stanie się nieaktywne (palec jest „podniesiony”), nie powinno już pojawiać się w kolejnych raportach synchronizacji wielodotykowej. Gdy wszystkie narzędzia staną się nieaktywne (wszystkie palce są w górę), sterownik powinien wysłać pusty pakiet raportu o synchronizacji na przykład
SYN_MT_REPORT
, a następnieSYN_REPORT
.W poprzednich wersjach Androida zdarzenie „w górę” było zgłaszane przez wysłanie wartości ciśnienia 0. Stare działanie było niezgodne z Specyfikacja protokołu wejściowego systemu Linux i nie jest już obsługiwana.
Informacje o ciśnieniu fizycznym lub sile sygnału należy zgłaszać za pomocą:
ABS_MT_PRESSURE
W poprzednich wersjach Androida informacje o ciśnieniu były pobierane z
ABS_MT_TOUCH_MAJOR
. Stare działanie było niezgodne z Specyfikacja protokołu wejściowego systemu Linux i nie jest już obsługiwana.- Informacje o rozmiarze dotyku należy zgłaszać za pomocą funkcji
ABS_MT_TOUCH_MAJOR
.Poprzednie wersje Androida pobierały informacje o rozmiarze z:
ABS_MT_TOOL_MAJOR
Stare zachowanie było niezgodne ze specyfikacją protokołu wejściowego Linuxa i nie jest już obsługiwane.
Obsługa urządzenia dotykowego
Poniżej znajdziesz krótkie podsumowanie obsługi urządzenia dotykowego na Androidzie.
- Funkcja
EventHub
odczytuje nieprzetworzone zdarzenia ze sterownikaevdev
. InputReader
pobiera nieprzetworzone zdarzenia i aktualizuje stan wewnętrzny dotyczący pozycji oraz innych właściwości każdego narzędzia. Sprawdza też stany przycisków.- Jeśli naciśniesz lub zwolnisz przycisk BACK lub FORWARD,
InputReader
powiadamia aplikacjęInputDispatcher
o kluczowym zdarzeniu. InputReader
określa, czy naciśnięto klawisz wirtualny. Jeśli tak, powiadamiaInputDispatcher
o kluczowym zdarzeniu.InputReader
określa, czy dotknięcie zostało zainicjowane w ramach wyświetlacza. Jeśli tak, wysyła powiadomienieInputDispatcher
o zdarzeniu dotknięcia.- Jeśli nie ma narzędzi dotykowych, ale jest co najmniej 1 narzędzie do nawigacji,
InputReader
powiadamiaInputDispatcher
o zdarzeniu nawigacji. - Jeśli typem urządzenia dotykowego jest wskaźnik,
InputReader
wykonuje wskaźnik wykrywanie gestów, odpowiednio przesuwa wskaźnik i punkt oraz powiadamiaInputDispatcher
o zdarzeniu wskaźnika. InputDispatcher
używaWindowManagerPolicy
, aby określić, czy zdarzenia mają być wysyłane i czy mają budzić urządzenie. NastępnieInputDispatcher
dostarcza zdarzenia do odpowiednich aplikacji.
Konfiguracja urządzenia dotykowego
Działanie urządzenia dotykowego zależy od osi urządzenia, przycisków, właściwości wprowadzania konfiguracja urządzenia wejściowego, wirtualna mapa klawiszy i układ klawiszy.
W kolejnych sekcjach znajdziesz więcej informacji o plikach, które uczestniczyć w konfiguracji klawiatury:
Właściwości
System korzysta z wielu właściwości wejściowych do konfiguracji urządzenia i kalibrować działanie urządzenia dotykowego.
Jednym z powodów jest to, że sterowniki urządzeń dotykowych często raportują właściwości dotyku, używając jednostek specyficznych dla danego urządzenia.
Na przykład wiele urządzeń dotykowych mierzy obszar dotyku za pomocą wewnętrznej skali urządzenia, takiej jak łączna liczba węzłów czujnika, które zostały wyzwolone przez dotyk. Ta wartość nie ma znaczenia dla aplikacji, ponieważ muszą one znać rozmiar fizyczny i inne cechy węzłów czujników urządzenia dotykowego.
System wykorzystuje parametry kalibracji zakodowane w konfiguracji urządzenia wejściowego pliki do dekodowania, przekształcania i normalizacji wartości zgłaszanych dotykiem urządzenia w prostszy, standardowy sposób, zrozumiały dla aplikacji.
Konwencje dokumentacji
W dokumentach używamy następujących konwencji, aby opisać wartości używane przez system podczas procesu kalibracji.
Nieprzetworzone wartości osi
Poniższe wyrażenia oznaczają nieprzetworzone wartości zgłaszane przez dotknięcie
sterownika urządzenia jako zdarzenia EV_ABS
.
raw.x
- Wartość osi
ABS_X
lubABS_MT_POSITION_X
. raw.y
- Wartość osi
ABS_Y
lubABS_MT_POSITION_Y
. raw.pressure
- Wartość osi
ABS_PRESSURE
lubABS_MT_PRESSURE
albo wartość 0, jeśli niedostępna. raw.touchMajor
- Wartość osi
ABS_MT_TOUCH_MAJOR
lub 0, jeśli nie jest dostępna. raw.touchMinor
- Wartość osi
ABS_MT_TOUCH_MINOR
lubraw.touchMajor
, jeśli ta pierwsza jest niedostępna. raw.toolMajor
- Wartość osi
ABS_TOOL_WIDTH
lubABS_MT_WIDTH_MAJOR
albo 0, jeśli nie jest dostępna. raw.toolMinor
- Wartość osi
ABS_MT_WIDTH_MINOR
lubraw.toolMajor
, jeśli jej nie ma. raw.orientation
- Wartość osi
ABS_MT_ORIENTATION
lub 0, jeśli nie jest dostępna. raw.distance
- Wartość osi
ABS_DISTANCE
lubABS_MT_DISTANCE
albo 0, jeśli nie jest dostępna. raw.tiltX
- Wartość osi
ABS_TILT_X
lub 0, jeśli nie jest dostępna. raw.tiltY
- Wartość osi
ABS_TILT_Y
lub 0, jeśli jest niedostępna.
Zakresy osi surowych
Poniższe wyrażenia określają granice nieprzetworzonych wartości. Są pozyskiwane
wywołując funkcję EVIOCGABS
ioctl dla każdej osi.
raw.*.min
- Obejmująca minimalna wartość nieprzetworzonej osi.
raw.*.max
- Obejmująca maksymalna wartość nieprzetworzonej osi.
raw.*.range
- Odpowiednik:
raw.*.max - raw.*.min
. raw.*.fuzz
- Dokładność osi surowej. Np. fuzz = 1 oznacza, że wartości są dokładne do ± 1.
raw.width
- Obejmująca szerokość obszaru dotykowego odpowiadająca wymiarowi
raw.x.range + 1
. raw.height
- włącznie z wysokością obszaru dotykowego odpowiadającej wartości
raw.y.range + 1
.
Zakresy wyjściowe
Wyrażenia te określają cechy wyjściowego układu współrzędnych. System wykorzystuje interpolację liniową do tłumaczenia informacji o pozycji dotyku jednostkę płaszczyzną używaną przez urządzenie dotykowe do jednostek wyjściowych, i przesyłane do aplikacji, takie jak piksele wyświetlacza.
output.width
- Szerokość danych wyjściowych. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem):
to szerokość wyświetlania w pikselach. W przypadku padów dotykowych (niepowiązanych z wyświetlaczem):
szerokość wyjściowa wynosi
raw.width
, co oznacza, że brak interpolacji . output.height
- Wysokość wyjściowej. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to wysokość wyświetlacza w pikselach. W przypadku paneli dotykowych (niepowiązanych z wyświetlaczem) wysokość wyjściowa wynosi
raw.height
, co oznacza, że nie jest wykonywana żadna interpolacja. output.diag
- Długość przekątnej wyjściowego układu współrzędnych, równa
sqrt(output.width ^2 + output.height ^2)
.
Podstawowa konfiguracja
Mapowanie dotykowe używa wielu właściwości konfiguracyjnych urządzenia wejściowego plik konfiguracji, aby określić wartości kalibracji. W tabeli poniżej opisano niektóre właściwości konfiguracji ogólnego przeznaczenia. Wszystkie pozostałe właściwości są opisane w następnych sekcjach wraz z pola, których używa się do ich kalibracji.
touch.deviceType
Definicja: touch.deviceType
= touchScreen
|
touchPad
| pointer
| default
Określa typ urządzenia dotykowego.
-
Jeśli wartość to
touchScreen
, urządzenie dotykowe jest powiązane z ekranem dotykowym. z wyświetlaczem. -
Jeśli wartość to
touchPad
, urządzenie dotykowe to panel dotykowy niezwiązany z ekranem. -
Jeśli wartość to
pointer
, urządzenie dotykowe to panel dotykowy niekojarzony z ekranem, a jego ruchy są używane do bezpośrednich gestów wielodotykowych wskaźnika. -
Jeśli wartość to
default
, system automatycznie wykrywa typ urządzenia. zgodnie z algorytmem klasyfikacji.
Więcej informacji o tym, jak typ urządzenia wpływa na działanie urządzenia dotykowego, znajdziesz w sekcji Klasyfikacja.
W Androidzie 3 i starszych wersjach wszystkie urządzenia dotykowe były uznawane za ekrany dotykowe.
Touch.orientationAware
Definicja: touch.orientationAware
= 0
| 1
Określa, czy urządzenie dotykowe ma reagować na zmiany orientacji wyświetlacza.
-
Jeśli wartość to
1
, pozycje dotyku zgłaszane przez urządzenie dotykowe są obracane za każdym razem, gdy zmienia się orientacja wyświetlacza. -
Jeśli wartość jest
0
, pozycje dotyku zgłaszane przez urządzenie dotykowe są odporne na zmiany orientacji wyświetlacza.
Wartość domyślna to 1
, jeśli urządzenie jest urządzeniem z ekranem dotykowym. 0
w przeciwnym razie.
System rozróżnia ekrany dotykowe wewnętrzne i zewnętrzne. Orientacja wewnętrznego ekranu dotykowego jest zależna od orientacji wewnętrznego wyświetlacza. Zewnętrzny ekran dotykowy z uwzględnieniem orientacji jest obracany na podstawie orientacji wyświetlacza zewnętrznego.
Znajomość orientacji jest używana do obsługi obracania ekranów dotykowych na urządzeniach. np. Nexus One. Na przykład gdy urządzenie jest obrócone w prawo o 90 stopni. zgodnie z naturalną orientacją, absolutne położenie dotknięć jest zmapowane, że kliknięcie w lewym górnym rogu bezwzględnego układu współrzędnych ekranu dotykowego jest raportowany jako dotknięcie w lewym górnym rogu obróconego układu współrzędnych wyświetlacza. Dzięki temu dotknięcia są zgłaszane w tym samym układzie współrzędnych, używane przez aplikacje do rysowania.
Przed wprowadzeniem Honeycomb wszystkie urządzenia dotykowe miały rozpoznawalność orientacji.
touch.gestureMode
Definicja: touch.gestureMode
= pointer
| spots
|
default
Określa tryb prezentacji gestów wskaźnika. Ta właściwość konfiguracji ma znaczenie tylko wtedy, gdy urządzenie dotykowe ma typ wskaźnik.
-
Jeśli wartość to
pointer
, gesty na touchpadzie są wyświetlane po najechaniu kursorem. jak w przypadku wskaźnika myszy. -
Jeśli wartość to
spots
, gesty na panelu dotykowym są reprezentowane przez punkt kotwiczenia, który reprezentuje środek gestu, oraz zestaw punktów okrągłych, które reprezentują położenie poszczególnych palców.
Wartość domyślna to pointer
, gdy właściwość wejściowa INPUT_PROP_SEMI_MT
jest ustawiona, lub spots
w przeciwnym razie.
Pola X i Y
Pola X i Y zawierają informacje o pozycji środka obszaru kontaktu.
Obliczenia
Obliczenie jest proste: informacje o pozycji ze sterownika dotykowego jest interpolowana liniowo do wyjściowego układu współrzędnych.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
touchpad
Pola touchMajor
i touchMinor
podają przybliżone wymiary
powierzchni kontaktu w jednostkach wyjściowych (w pikselach).
Pola toolMajor
i toolMinor
opisują przybliżone wymiary narzędzia w jednostkach wyjściowych (pikselach).
Pole size
opisuje znormalizowany rozmiar dotyku względem
to największy możliwy dotyk, jaki może wykryć urządzenie dotykowe. Najmniejszy możliwy znormalizowany rozmiar to 0,0 (brak kontaktu lub niemożliwość pomiaru), a największy możliwy znormalizowany rozmiar to 1,0 (obszar czujnika jest nasycony).
Jeśli można zmierzyć zarówno przybliżoną długość, jak i szerokość,
touchMajor
pole
określa dłuższy wymiar, a pole touchMinor
określa krótszy wymiar
obszaru styku. Gdy można zmierzyć tylko przybliżoną średnicę obszaru styku,
pola touchMajor
i touchMinor
są równe.
Analogicznie pole toolMajor
określa dłuższy wymiar, a polecenie
toolMinor
określa krótszy wymiar pola przekroju poprzecznego narzędzia.
Jeśli rozmiar dotyku jest niedostępny, ale rozmiar narzędzia jest dostępny, rozmiar narzędzia jest ustawiany jako równy rozmiarowi dotyku. Jeśli natomiast rozmiar narzędzia jest niedostępny, a rozmiar dotykowy jest dostępny, rozmiar dotykowy jest ustawiany jako równy rozmiarowi narzędzia.
Urządzenia dotykowe mierzą lub raportują rozmiary dotyku i narzędzi na różne sposoby. Obecna implementacja obsługuje 3 różne rodzaje pomiarów: średnicę, powierzchnię i ramkę ograniczającą geometryczną w jednostkach powierzchni.
Definicja: touch.size.calibration
= none
|
geometric
| diameter
| area
| default
Określa rodzaj pomiaru używany przez sterownik dotyku do przekazywania wielkości ekranu dotykowego i rozmiaru narzędzia.
-
Jeśli wartość to
none
, rozmiar jest ustawiany na 0. -
Jeśli wartość to
geometric
, zakłada się, że rozmiar jest określony jednostek powierzchni, więc jest skalowany w taki sam sposób. -
Jeśli wartość to
diameter
, przyjmuje się, że rozmiar jest proporcjonalny do średnicy (szerokości) dotyku lub narzędzia. -
Jeśli wartość to
area
, przyjmuje się, że rozmiar jest proporcjonalny do obszaru dotyku lub narzędzia. -
Jeśli wartość to
default
, system użyje kalibracjigeometric
, jeśli Dostępna jest ośraw.touchMajor
lubraw.toolMajor
; w przeciwnym razie wykorzystuje kalibracjinone
.
touch.size.scale
Definicja: touch.size.scale
= <nieujemna liczba zmiennoprzecinkowa>
Określa stały współczynnik skalowania używany w kalibracji.
Wartość domyślna to 1.0
.
dotyk.rozmiar.bias
Definicja: touch.size.bias
= <dodatnia liczba zmiennoprzecinkowa>
Określa stałą wartość odchylenia używaną podczas kalibracji.
Wartość domyślna to 0.0
.
touch.size.isSummed
Definicja: touch.size.isSummed
= 0
| 1
Określa, czy rozmiar jest raportowany jako suma rozmiarów wszystkich rozmiarów aktywnych kontaktów lub jest raportowana oddzielnie dla każdego kontaktu.
-
Jeśli wartość to
1
, raportowany rozmiar jest dzielony przez liczbę. kontaktów przed użyciem. -
Jeśli wartość to
0
, raportowany rozmiar jest używany w niezmienionej formie.
Wartość domyślna to 0
.
Niektóre urządzenia dotykowe, zwłaszcza MT urządzenia nie potrafią rozróżnić
poszczególnych wymiarów wielu kontaktów, aby raportowały pomiar rozmiaru.
który reprezentuje ich całkowity obszar lub szerokość. Ta właściwość powinna być ustawiona tylko na
1
w przypadku takich urządzeń. W razie wątpliwości ustaw tę wartość na 0
.
Obliczenia
Obliczenie pól touchMajor
, touchMinor
, toolMajor
, toolMinor
i size
zależy od określonych parametrów kalibracji.
If raw.touchMajor and raw.toolMajor are available: touchMajor = raw.touchMajor touchMinor = raw.touchMinor toolMajor = raw.toolMajor toolMinor = raw.toolMinor Else If raw.touchMajor is available: toolMajor = touchMajor = raw.touchMajor toolMinor = touchMinor = raw.touchMinor Else If raw.toolMajor is available: touchMajor = toolMajor = raw.toolMajor touchMinor = toolMinor = raw.toolMinor Else touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 End If size = avg(touchMajor, touchMinor) If touch.size.isSummed == 1: touchMajor = touchMajor / numberOfActiveContacts touchMinor = touchMinor / numberOfActiveContacts toolMajor = toolMajor / numberOfActiveContacts toolMinor = toolMinor / numberOfActiveContacts size = size / numberOfActiveContacts End If If touch.size.calibration == "none": touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 Else If touch.size.calibration == "geometric": outputScale = average(output.width / raw.width, output.height / raw.height) touchMajor = touchMajor * outputScale touchMinor = touchMinor * outputScale toolMajor = toolMajor * outputScale toolMinor = toolMinor * outputScale Else If touch.size.calibration == "area": touchMajor = sqrt(touchMajor) touchMinor = touchMajor toolMajor = sqrt(toolMajor) toolMinor = toolMajor Else If touch.size.calibration == "diameter": touchMinor = touchMajor toolMinor = toolMajor End If If touchMajor != 0: output.touchMajor = touchMajor * touch.size.scale + touch.size.bias Else output.touchMajor = 0 End If If touchMinor != 0: output.touchMinor = touchMinor * touch.size.scale + touch.size.bias Else output.touchMinor = 0 End If If toolMajor != 0: output.toolMajor = toolMajor * touch.size.scale + touch.size.bias Else output.toolMajor = 0 End If If toolMinor != 0: output.toolMinor = toolMinor * touch.size.scale + touch.size.bias Else output.toolMinor = 0 End If output.size = size
pole ciśnienia
Pole pressure
opisuje przybliżony fizyczny nacisk na urządzenie dotykowe jako wartość sformatowaną w zakresie od 0,0 (brak dotyku) do 1,0 (normalny nacisk).
Zerowe ciśnienie oznacza, że narzędzie jest w stanie zawieszenia.
dotyk.ciśnienie.kalibracja
Definicja: touch.pressure.calibration
= none
|
physical
| amplitude
| default
Określa rodzaj pomiaru używany przez sterownik dotyku do zgłaszania ciśnienia.
-
Jeśli wartość to
none
, ciśnienie jest nieznane, więc jest ustawiane na 1,0 podczas dotykania i 0,0 podczas najeżdżania kursorem. -
Jeśli wartość wynosi
physical
, zakłada się, że oś nacisku do pomiaru rzeczywistej wartości siła nacisku na touchpada. -
Jeśli wartość wynosi
amplitude
, do pomiaru sygnału przyjmuje się oś nacisku. amplituda, która odpowiada rozmiarowi styku i wywieranym przez nie ciśnieniu. -
Jeśli wartość to
default
, system użyje kalibracjiphysical
, jeśli dostępna jest oś ciśnienia; w przeciwnym razie używana jest ośnone
.
dotyk.ciśnienie.skala
Definicja: touch.pressure.scale
= <dodatnia liczba zmiennoprzecinkowa>
Określa stały współczynnik skalowania używany w kalibracji.
Wartość domyślna to 1.0 / raw.pressure.max
.
Obliczenia
Obliczanie wartości pola pressure
zależy od określonych parametrów kalibracji.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
pola orientacji i przechylenia;
Pole orientation
opisuje orientację dotyku i narzędzia jako
kątowy. Orientacja 0
wskazuje, że oś główna jest
jest ustawiony w pionie, -PI/2
oznacza, że oś główna jest zorientowana w lewo,
PI/2
oznacza, że oś główna jest skierowana w prawo. Gdy rysik
narzędzie, zakres orientacji można opisać w pełnym zakresie okręgów
od -PI
lub PI
.
Pole tilt
opisuje pochylenie narzędzia jako pomiar kątowy.
Kąt 0
wskazuje, że narzędzie jest prostopadłe do powierzchni.
Kąt PI/2
oznacza, że narzędzie jest płaskie na powierzchni.
dotyk.orientacja.kalibracja
Definicja: touch.orientation.calibration
= none
|
interpolated
| vector
| default
Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania orientacji.
- Jeśli wartość to
none
, orientacja jest nieznana, więc jest ustawiana na 0. - Jeśli wartość to
interpolated
, orientacja jest interpolowana liniowo, tak aby wartość bezwzględnaraw.orientation.min
została przypisana do-PI/2
, a wartość bezwzględnaraw.orientation.max
– doPI/2
. Wartość centralna(raw.orientation.min + raw.orientation.max) / 2
wskazuje na0
. - Jeśli wartość to
vector
, orientacja jest interpretowana jako skompresowany wektor składający się z 2 4-bitowych pól ze znakiem. Ta reprezentacja jest używana w elementach protokołu Atmel Object Based Protocol. Po zdekodowaniu wektor generuje kąt orientacji i poziom ufności magnituda. Wielkość ufności jest używana do skalowania informacji o rozmiarze, chyba że jest to obiekt geometryczny. - Jeśli wartość to
default
, system używa kalibracjiinterpolated
, jeśli oś orientacji jest dostępna, w przeciwnym razie używanone
.
Obliczenia
Obliczenia wartości pól orientation
i tilt
zależą od
określonych parametrów kalibracji i dostępnych danych wejściowych.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
pole „odległość”
Pole distance
podaje odległość między narzędziem a urządzeniem dotykowym
na różnych powierzchniach. Wartość 0,0 oznacza kontakt bezpośredni, a wyższe –
i zwiększa odległość od powierzchni.
touch.distance.calibration
Definicja: touch.distance.calibration
= none
|
scaled
| default
Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania odległości.
-
Jeśli wartość to
none
, odległość jest nieznana, dlatego jest ustawiona na 0. -
Jeśli wartość to
scaled
, zgłaszana odległość jest mnożona przez stały współczynnik skali. -
Jeśli wartość to
default
, system używa kalibracjiscaled
, jeśli oś odległości jest dostępna, w przeciwnym razie używanone
.
touch.distance.scale
Definicja: touch.distance.scale
= <dodatnia liczba zmiennoprzecinkowa>
Określa stały współczynnik skali używany podczas kalibracji.
Wartość domyślna to 1.0
.
Obliczenia
Obliczenie pola distance
zależy od podanych parametrów kalibracji.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Przykład
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Uwagi dotyczące zgodności
Właściwości konfiguracji urządzeń dotykowych znacznie się zmieniły w Android 4.0 (Ice Cream Sandwich) Aby używać nowych właściwości konfiguracji, należy zaktualizować wszystkie pliki konfiguracji urządzeń dotykowych.
Starsze sterowniki urządzeń dotykowych mogą być również wymagane Zaktualizowano.
Pliki mapy kluczy wirtualnych
Klawisze wirtualne można stosować na urządzeniach dotykowych.
Można to zrobić na kilka sposobów, w zależności od możliwości kontrolera dotykowego. Niektóre sterowniki dotykowe można skonfigurować bezpośrednio, aby implementowały klawisze dotykowe przez ustawienie rejestrów oprogramowania układowego. Czasami jednak konieczne jest przekształcenie współrzędnych dotykowych na kody klawiszy w oprogramowaniu.
Gdy klucze wirtualne są implementowane w oprogramowaniu, jądro musi wyeksportować plik mapy klucza wirtualnego o nazwie virtualkeys.<devicename>
jako właściwość płytki. Przykład:
jeśli sterowniki urządzenia z ekranem dotykowym podają nazwę „touchyfeely”. a następnie
plik wirtualnej mapy kluczy musi mieć ścieżkę
/sys/board_properties/virtualkeys.touchyfeely
Plik mapy klawiszy wirtualnych zawiera opis współrzędnych i kodów klawiszy Linuxa dla klawiszy wirtualnych na ekranie dotykowym.
Oprócz pliku mapy klawiszy wirtualnych musisz mieć odpowiedni plik układu klawiszy i plik mapy znaków klawiszy, aby mapować kody klawiszy Linux na kody klawiszy Androida oraz określić typ urządzenia klawiatury (zwykle SPECIAL_FUNCTION
).
Składnia
Plik wirtualnej mapy kluczy to zwykły plik tekstowy zawierający sekwencję klucza wirtualnego opisy układów rozdzielane znakami nowego wiersza lub dwukropkami.
Wiersze komentarza zaczynają się od znaku „#” i kontynuuj do końca wiersza.
Każdy klucz wirtualny jest opisany przez 6 komponentów rozdzielonych dwukropkiem:
0x01
: kod wersji. Musi to być wartość0x01
.- <Linux key code>: kod klucza Linuksa dla klucza wirtualnego.
- <centerX>: współrzędna pikselowa X środka klucza wirtualnego.
- <centerY>: współrzędna piksela Y środka klucza wirtualnego.
- <width>: szerokość klawisza wirtualnego w pikselach.
- <height>: wysokość klucza wirtualnego w pikselach.
Wszystkie współrzędne i rozmiary są określone w systemie współrzędnych wyświetlacza.
Oto plik mapy klucza wirtualnego zapisany w jednym wierszu.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
Ten sam plik mapy klucza wirtualnego może też być zapisany na kilku wierszach.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
W tym przykładzie ekran dotykowy ma rozdzielczość 480 x 800. W związku z powyższym klucze wirtualne mają wartość <centerY> współrzędna 835, czyli nieco niżej w widocznym obszarze ekranu dotykowego.
Pierwszy klucz zawiera kod skanowania systemu Linux: 158
(KEY_BACK
), środekX
55
, środek Y z 835
, szerokość 90
i wysokość
55
Przykład
Plik mapy klucza wirtualnego: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Plik układu klucza: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Plik mapy znaków kluczowych: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Gesty pośrednie z użyciem wskaźnika wielodotykowego
W trybie wskaźnika system interpretuje te gesty:
- Dotknięcie 1 palcem: kliknięcie.
- Ruch jednym palcem: przesuwanie wskaźnika.
- Ruch jednym palcem plus naciśnięcia przycisku: przeciągnij wskaźnik.
- Ruch 2 palcami w tym samym kierunku: przeciągnij obszar pod kursorem w tym kierunku. Wskaźnik się nie porusza.
- Ruch dwoma palcami poruszającymi się w kierunku do siebie lub rozsuwanych w różnych kierunkach: przesuwaj/skaluj/obracaj obszar wokół wskaźnika. Wskaźnik się nie porusza.
- Ruch wieloma palcami: gest swobodny.
Odrzucenie palmy
Od Androida 13 system może automatycznie odrzucać dane wejściowe z dłoni, gdy wbudowany framework jest włączony. Wciąż obsługiwane są rozwiązania niestandardowe, które zostały opracowane wewnętrznie, ale mogą wymagać modyfikacji, aby zwracać flagę TOOL_TYPE_PALM
, gdy wykryto dłoń. Wbudowana platforma działa też w połączeniu z rozwiązaniami niestandardowymi.
Rzeczywisty model analizuje pierwsze 90 ms danych dotyczących gestów według bieżącego wskaźnika i przy
a następnie analizuje, jak daleko od krawędzi wyświetlacza znajdują się dotknięcia.
Następnie na podstawie każdego wskaźnika określa, które wskaźniki są dłoniami. Uwzględnia też
bierz pod uwagę wielkość każdego kontaktu, według raportów touchMajor
i
touchMinor
Następnie framework Androida usuwa z potoku dotyku wskaźniki oznaczone jako dłonie.
Jeśli wskaźnik został już wysłany do aplikacji, system:
- (Jeśli istnieją inne aktywne wskaźniki) anuluje wskaźnik z wskaźnikiem
ACTION_POINTER_UP
. iFLAG_CANCELED
. - (jeśli jest to jedyny wskaźnik) anuluje wskaźnik za pomocą
ACTION_CANCEL
.
Publiczny interfejs API (MotionEvent.FLAG_CANCELED
), wskazuje, że bieżący
nie powinno wywoływać działania użytkownika. Ta flaga jest ustawiona w przypadku zarówno ACTION_CANCEL
, jak i ACTION_POINTER_UP
.
Jeśli wskaźnik dłoni nie został wysłany do aplikacji, system po prostu go porzuci.
Włączanie funkcji odrzucania dłoni
- W sterowniku dotykowym użyj makra
input_abs_set_res
, aby ustawić rozdzielczości dla tych pól (jednostki to piksele na mm):ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
Obsługa funkcji
ABS_MT_TOUCH_MINOR
jest opcjonalna. Jeśli jednak Twoje urządzenie go obsługuje, upewnij się, że rozdzielczość jest ustawiona prawidłowo. - Aby sprawdzić, czy pola są prawidłowo ustawione, uruchom polecenie:
$ adb shell getevent -li
- Aby włączyć tę funkcję w czasie działania aplikacji, uruchom polecenie:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Ponownie uruchom proces
system_server
.$ adb shell stop && adb shell start
- Sprawdź, czy
adb shell dumpsys input
pokazuje, że w środku znajdują się moduły odrzucające dłonieUnwantedInteractionBlocker
Jeśli tak nie jest, sprawdź logi związane z danymi wejściowymi, aby znaleźć wskazówki dotyczące błędów konfiguracji.Zapoznaj się z tym przykładem:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - Aby na stałe włączyć tę funkcję, dodaj odpowiednie polecenie sysprop do polecenia
init**rc
plik:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1