Android obsługuje różne ekrany dotykowe i tabliczki dotykowe, w tym tablety digitizer z rysikiem.
Ekrany dotykowe to urządzenia dotykowe, które są powiązane z wyświetlaczem w taki sposób, że użytkownik ma wrażenie, że bezpośrednio manipuluje elementami na ekranie.
Panele dotykowe to urządzenia dotykowe, które nie są powiązane z wyświetlaczem, takim jak tablet digitizer. Panele dotykowe są zwykle używane do wskazywania lub bezwzględnego pozycjonowania pośredniego lub sterowania interfejsem użytkownika za pomocą gestów.
Urządzenia dotykowe mogą mieć przyciski, których funkcje są podobne do przycisków myszy.
Urządzeniami dotykowymi można czasem manipulować za pomocą różnych narzędzi, takich jak palce lub rysik, w zależności od zastosowanej technologii czujnika dotykowego.
Urządzenia dotykowe są czasami używane do implementacji kluczy wirtualnych. Na przykład na niektórych urządzeniach z systemem Android obszar czujnika ekranu dotykowego wystaje poza krawędź wyświetlacza i służy dwóm celom jako część klawiatury dotykowej.
Ze względu na dużą różnorodność urządzeń dotykowych system Android opiera się na dużej liczbie właściwości konfiguracyjnych, aby opisać charakterystykę i pożądane zachowanie każdego urządzenia.
Kliknij Klasyfikacja urządzeń
Urządzenie wejściowe jest klasyfikowane jako urządzenie wielodotykowe , jeśli spełnione są oba poniższe warunki:
Urządzenie wejściowe zgłasza obecność osi bezwzględnych
ABS_MT_POSITION_X
iABS_MT_POSITION_Y
.Urządzenie wejściowe nie ma żadnych przycisków gamepada. Ten warunek rozwiązuje niejednoznaczność niektórych gamepadów, które zgłaszają osie z kodami, które pokrywają się z osiami MT.
Urządzenie wejściowe jest klasyfikowane jako jednodotykowe , jeśli spełnione są oba poniższe warunki:
Urządzenie wejściowe nie jest sklasyfikowane jako urządzenie wielodotykowe. Urządzenie wejściowe jest klasyfikowane jako jednodotykowe lub wielodotykowe, nigdy jednocześnie.
Urządzenie wejściowe zgłasza obecność osi absolutnych
ABS_X
iABS_Y
oraz obecność kodu kluczaBTN_TOUCH
.
Po sklasyfikowaniu urządzenia wejściowego jako urządzenia dotykowego obecność kluczy wirtualnych jest określana poprzez próbę załadowania pliku mapy klawiszy wirtualnych dla urządzenia. Jeśli dostępna jest mapa klawiszy wirtualnych, ładowany jest również plik układu klawiszy dla urządzenia.
Zapoznaj się z poniższą sekcją dotyczącą lokalizacji i formatu plików mapy klucza wirtualnego.
Następnie system ładuje plik konfiguracyjny urządzenia wejściowego dla urządzenia dotykowego.
Wszystkie wbudowane urządzenia dotykowe powinny mieć pliki konfiguracyjne urządzeń wejściowych. Jeśli nie ma pliku konfiguracyjnego urządzenia wejściowego, system wybierze domyślną konfigurację odpowiednią dla typowych dotykowych urządzeń peryferyjnych ogólnego przeznaczenia, takich jak zewnętrzne ekrany dotykowe USB lub Bluetooth HID lub panele dotykowe. Te ustawienia domyślne nie są przeznaczone dla wbudowanych ekranów dotykowych i najprawdopodobniej spowodują nieprawidłowe działanie.
Po załadowaniu konfiguracji urządzenia wejściowego system zaklasyfikuje urządzenie wejściowe jako ekran dotykowy, panel dotykowy lub urządzenie wskazujące .
Urządzenie z ekranem dotykowym służy do bezpośredniej manipulacji obiektami na ekranie. Ponieważ użytkownik bezpośrednio dotyka ekranu, system nie wymaga żadnych dodatkowych afordancji wskazujących manipulowane obiekty.
Urządzenie dotykowe służy do dostarczania do aplikacji informacji o położeniu bezwzględnym na temat dotknięć danego obszaru czujnika. Może to być przydatne w przypadku tabletów digitizerów.
Urządzenie wskazujące służy do pośredniego manipulowania obiektami na ekranie za pomocą kursora . Palce są interpretowane jako wielodotykowe gesty wskaźnika. Inne narzędzia, takie jak rysiki, są interpretowane przy użyciu pozycji bezwzględnych.
Aby uzyskać więcej informacji, zobacz Pośrednie gesty wskaźnika wielodotykowego .
Poniższe zasady służą do klasyfikacji urządzenia wejściowego jako ekranu dotykowego, panelu dotykowego lub urządzenia wskazującego .
Jeśli właściwość
touch.deviceType
jest ustawiona, typ urządzenia zostanie ustawiony zgodnie ze wskazaniem.Jeśli urządzenie wejściowe zgłosi obecność właściwości wejściowej
INPUT_PROP_DIRECT
(poprzez ioctlEVIOCGPROP
), wówczas typ urządzenia zostanie ustawiony na ekran dotykowy . Ten warunek zakłada, że urządzenia dotykowe z bezpośrednim wejściem są podłączone do wyświetlacza, który jest również podłączony.Jeśli urządzenie wejściowe zgłosi obecność właściwości wejściowej
INPUT_PROP_POINTER
(poprzez ioctlEVIOCGPROP
), wówczas typ urządzenia zostanie ustawiony na pointer .Jeśli urządzenie wejściowe zgłosi obecność osi względnych
REL_X
lubREL_Y
, wówczas typ urządzenia zostanie ustawiony na touchpad . Ten warunek rozwiązuje niejednoznaczność urządzeń wejściowych, które składają się zarówno z myszy, jak i panelu dotykowego. W takim przypadku panel dotykowy nie będzie używany do sterowania wskaźnikiem, ponieważ kontroluje go już mysz.W przeciwnym razie typ urządzenia zostanie ustawiony na pointer . Ta wartość domyślna zapewnia, że panele dotykowe, które nie zostały wyznaczone do innych celów specjalnych, będą służyć do sterowania wskaźnikiem.
guziki
Przyciski to opcjonalne elementy sterujące, których aplikacje mogą używać do wykonywania dodatkowych funkcji. Przyciski na urządzeniach dotykowych zachowują się podobnie do przycisków myszy i są używane głównie z urządzeniami dotykowymi typu wskaźnik lub rysikiem.
Obsługiwane są następujące przyciski:
BTN_LEFT
: odwzorowane naMotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: odwzorowane naMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: odwzorowane naMotionEvent.BUTTON_MIDDLE
.BTN_BACK
iBTN_SIDE
: odwzorowane naMotionEvent.BUTTON_BACK
. Naciśnięcie tego przycisku powoduje również syntezę naciśnięcia klawisza z kodem kluczaKeyEvent.KEYCODE_BACK
.BTN_FORWARD
iBTN_EXTRA
: odwzorowane naMotionEvent.BUTTON_FORWARD
. Naciśnięcie tego przycisku powoduje również syntezę naciśnięcia klawisza z kodem kluczaKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: odwzorowane naMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: odwzorowane naMotionEvent.BUTTON_TERTIARY
.
Narzędzia i rodzaje narzędzi
Narzędzie to palec, rysik lub inne urządzenie służące do interakcji z urządzeniem dotykowym. Niektóre urządzenia dotykowe potrafią rozróżniać różne typy narzędzi.
Gdzie indziej w Androidzie, jak w API MotionEvent
, narzędzie jest często określane jako wskaźnik .
Obsługiwane są następujące typy narzędzi:
BTN_TOOL_FINGER
iMT_TOOL_FINGER
: odwzorowane naMotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
iMT_TOOL_PEN
: odwzorowane naMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_RUBBER
: odwzorowane naMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: odwzorowane naMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: odwzorowane naMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: odwzorowane naMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: odwzorowane naMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: odwzorowane naMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
iBTN_TOOL_QUADTAP
: odwzorowane naMotionEvent.TOOL_TYPE_FINGER
.
Najechanie a dotykanie narzędzi
Narzędzia mogą być w kontakcie z urządzeniem dotykowym lub w zasięgu i unosić się nad nim. Nie wszystkie urządzenia dotykowe są w stanie wykryć obecność narzędzia unoszącego się nad urządzeniem dotykowym. Te, które to robią, takie jak digitizery z rysikiem oparte na częstotliwości radiowej, często potrafią wykryć, kiedy narzędzie znajduje się w ograniczonym zasięgu digitizera.
Komponent InputReader
rozróżnia narzędzia dotykające i unoszące się w powietrzu. Podobnie narzędzia dotykające i narzędzia po najechaniu kursorem są zgłaszane aplikacjom na różne sposoby.
Narzędzia dotykające są zgłaszane do aplikacji jako zdarzenia dotykowe przy użyciu MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
i MotionEvent.ACTION_POINTER_UP
.
Narzędzia unoszące się są zgłaszane do aplikacji jako ogólne zdarzenia ruchu przy użyciu MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
i MotionEvent.ACTION_HOVER_EXIT
.
Dotknij Wymagania sterownika urządzenia
Sterowniki urządzeń dotykowych powinny rejestrować tylko osie i kody klawiszy dla osi i przycisków, które faktycznie obsługują. Zarejestrowanie nadmiarowych osi lub kodów klawiszy może zakłócić działanie algorytmu klasyfikacji urządzenia lub spowodować, że system nieprawidłowo wykryje możliwości urządzenia.
Na przykład, jeśli urządzenie zgłosi kod klucza
BTN_TOUCH
, system przyjmie, żeBTN_TOUCH
będzie zawsze używany do wskazania, czy narzędzie faktycznie dotyka ekranu. DlategoBTN_TOUCH
nie powinien być używany do wskazania, że narzędzie jest jedynie w zasięgu i unosi się w powietrzu.Urządzenia jednodotykowe używają następujących zdarzeń wejściowych systemu Linux:
ABS_X
: (WYMAGANE) Podaje współrzędną X narzędzia.ABS_Y
: (WYMAGANE) Podaje współrzędną Y narzędzia.ABS_PRESSURE
: (opcjonalnie) Podaje fizyczny nacisk wywierany na końcówkę narzędzia lub siłę sygnału kontaktu dotykowego.ABS_TOOL_WIDTH
: (opcjonalnie) Podaje pole przekroju poprzecznego lub szerokość kontaktu dotykowego lub samego narzędzia.ABS_DISTANCE
: (opcjonalnie) Podaje odległość narzędzia od powierzchni urządzenia dotykowego.ABS_TILT_X
: (opcjonalnie) Podaje nachylenie narzędzia względem powierzchni urządzenia dotykowego wzdłuż osi X.ABS_TILT_Y
: (opcjonalnie) Raportuje 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) Raportuje stany przycisków .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) .
Urządzenia wielodotykowe używają następujących zdarzeń wejściowych systemu Linux:
ABS_MT_POSITION_X
: (WYMAGANE) Podaje współrzędną X narzędzia.ABS_MT_POSITION_Y
: (WYMAGANE) Podaje współrzędną Y narzędzia.ABS_MT_PRESSURE
: (opcjonalnie) Podaje fizyczny nacisk wywierany na końcówkę narzędzia lub siłę sygnału kontaktu dotykowego.ABS_MT_TOUCH_MAJOR
: (opcjonalnie) Podaje pole przekroju poprzecznego styku dotykowego lub długość dłuższego wymiaru styku dotykowego.ABS_MT_TOUCH_MINOR
: (opcjonalnie) Podaje długość krótszego wymiaru kontaktu dotykowego. Tej osi nie należy używać, jeśliABS_MT_TOUCH_MAJOR
zgłasza pomiar powierzchni.ABS_MT_WIDTH_MAJOR
: (opcjonalnie) Podaje pole przekroju poprzecznego samego narzędzia lub długość dłuższego wymiaru samego narzędzia. Tej osi nie należy używać, jeśli wymiary samego narzędzia są nieznane.ABS_MT_WIDTH_MINOR
: (opcjonalne) Podaje długość krótszego wymiaru samego narzędzia. Tej osi nie należy używać, jeśliABS_MT_WIDTH_MAJOR
zgłasza pomiar powierzchni lub jeśli wymiary samego narzędzia są nieznane.ABS_MT_ORIENTATION
: (opcjonalne) Podaje orientację narzędzia.ABS_MT_DISTANCE
: (opcjonalnie) Podaje odległość narzędzia od powierzchni urządzenia dotykowego.ABS_MT_TOOL_TYPE
: (opcjonalnie) Raportuje typ narzędzia jakoMT_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 jest używana do identyfikowania i śledzenia każdego narzędzia niezależnie, gdy aktywnych jest wiele narzędzi. Na przykład, gdy wiele palców dotyka urządzenia, każdemu palcowi należy przypisać odrębny identyfikator śledzenia, który jest używany tak długo, jak palec pozostaje w kontakcie. Identyfikatory śledzenia mogą być ponownie użyte, gdy powiązane z nimi narzędzia przesuną się poza zasięg.ABS_MT_SLOT
: (opcjonalnie) Podaje identyfikator gniazda narzędzia, gdy używany jest protokół multi-touch systemu Linux „B”. Więcej informacji można znaleźć w dokumentacji protokołu wielodotykowego systemu Linux.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) Raportuje stany przycisków .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) .
Jeśli zdefiniowano osie zarówno dla protokołu jednodotykowego, jak i wielodotykowego, zostaną użyte tylko osie wielodotykowe, a osie jednodotykowe zostaną zignorowane.
Minimalne i maksymalne wartości osi
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
iABS_MT_POSITION_Y
określają granice obszaru aktywnego urządzenia w jednostkach powierzchni specyficznych dla urządzenia. W przypadku ekranu dotykowego obszar aktywny opisuje część urządzenia dotykowego, która faktycznie zakrywa wyświetlacz.W przypadku ekranu dotykowego system automatycznie interpoluje zgłoszone pozycje dotyku w jednostkach powierzchni, aby uzyskać pozycje dotyku w pikselach wyświetlacza zgodnie z następującym obliczeniem:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Ekran dotykowy może zgłaszać dotknięcia poza zgłaszanym obszarem aktywnym.
Dotknięcia inicjowane poza obszarem aktywnym nie są dostarczane do aplikacji, ale mogą być używane w przypadku klawiszy wirtualnych.
Dotknięcia, które są inicjowane w obszarze aktywnym lub które wchodzą i wychodzą z obszaru wyświetlania, są dostarczane do aplikacji. W związku z tym, jeśli dotyk rozpocznie się w granicach aplikacji, a następnie przesunie się poza obszar aktywny, aplikacja może odbierać zdarzenia dotykowe ze współrzędnymi wyświetlania, które są ujemne lub wykraczają poza granice ekranu. Jest to oczekiwane zachowanie.
Urządzenie dotykowe nigdy nie powinno ograniczać współrzędnych dotyku do granic obszaru aktywnego. Jeśli dotknięcie opuści obszar aktywny, powinno zostać zgłoszone jako poza obszarem aktywnym lub w ogóle nie powinno być zgłaszane.
Na przykład, jeśli palec użytkownika dotyka lewego górnego rogu ekranu dotykowego, może zgłosić współrzędne (minX, minY). Jeśli palec nadal przesuwa się dalej poza obszar aktywny, ekran dotykowy powinien albo zacząć zgłaszać współrzędne ze składnikami mniejszymi niż minX i minY, na przykład (minX - 2, minY - 3), albo powinien całkowicie przestać zgłaszać dotyk. Innymi słowy, ekran dotykowy nie powinien zgłaszać (minX, minY), kiedy palec użytkownika rzeczywiście dotyka poza obszarem aktywnym.
Dociśnięcie współrzędnych dotykowych do krawędzi wyświetlacza tworzy sztuczną twardą granicę wokół krawędzi ekranu, która uniemożliwia systemowi płynne śledzenie ruchów wchodzących i wychodzących z obszaru wyświetlania.
Wartości zgłaszane przez
ABS_PRESSURE
lubABS_MT_PRESSURE
, jeśli w ogóle są zgłaszane, muszą być niezerowe, gdy narzędzie dotyka urządzenia, a zero w przeciwnym razie, aby wskazać, że narzędzie unosi się w powietrzu.Podawanie informacji o ciśnieniu jest opcjonalne , ale zdecydowanie zalecane. Aplikacje mogą wykorzystywać informacje o nacisku do implementacji rysowania czułego na nacisk i innych efektów.
Wartości zgłaszane przez
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
lubABS_MT_WIDTH_MINOR
powinny być niezerowe, gdy narzędzie dotyka urządzenia i zerowe w przeciwnym razie, ale nie jest to wymagane. Na przykład urządzenie dotykowe może mierzyć rozmiar styków dotykowych palców, ale nie styków dotykowych rysika.Podawanie informacji o rozmiarze jest opcjonalne , ale zdecydowanie zalecane. Aplikacje mogą wykorzystywać informacje o nacisku do implementowania rysowania zależnego od rozmiaru i innych efektów.
Wartości zgłaszane przez
ABS_DISTANCE
lubABS_MT_DISTANCE
powinny zbliżać się do zera, gdy narzędzie dotyka urządzenia. Odległość może pozostać różna od zera, nawet gdy narzędzie jest w bezpośrednim kontakcie. Dokładne podawane wartości zależą od sposobu, w jaki sprzęt mierzy odległość.Zgłaszanie informacji o odległości jest opcjonalne , ale zalecane w przypadku urządzeń z rysikiem.
Wartości zgłaszane przez
ABS_TILT_X
iABS_TILT_Y
powinny wynosić zero, gdy narzędzie jest ustawione prostopadle do urządzenia. Niezerowe pochylenie jest traktowane jako wskazówka, że narzędzie jest trzymane pod kątem.Zakłada się, że kąty nachylenia wzdłuż osi X i Y są określone w stopniach od pionu. Punkt środkowy (idealnie prostopadły) jest określony przez
(max + min) / 2
dla każdej osi. Wartości mniejsze niż punkt środkowy oznaczają pochylenie w górę lub w lewo, wartości większe niż punkt środkowy oznaczają pochylenie w dół lub w prawo.InputReader
konwertuje składowe nachylenia X i Y na prostopadły kąt nachylenia w zakresie od 0 doPI / 2
radianów oraz płaski kąt orientacji w zakresie od-PI
doPI
radianów. Ta reprezentacja skutkuje opisem orientacji, który jest zgodny z tym, co jest używane do opisu dotknięć palców.Zgłaszanie informacji o pochyleniu jest opcjonalne , ale zalecane w przypadku urządzeń z rysikiem.
Jeśli typ narzędzia jest zgłaszany przez
ABS_MT_TOOL_TYPE
, zastąpi on wszelkie informacje o typie narzędzia zgłaszane przezBTN_TOOL_*
. Jeśli w ogóle nie są dostępne żadne informacje o typie narzędzia, domyślnym typem narzędzia jestMotionEvent.TOOL_TYPE_FINGER
.Narzędzie jest określane jako aktywne na podstawie następujących warunków:
Podczas korzystania z protokołu jednodotykowego narzędzie jest aktywne, jeśli
BTN_TOUCH
lubBTN_TOOL_*
wynosi 1.Ten warunek implikuje, że
InputReader
musi mieć przynajmniej trochę informacji o naturze narzędzia, czy to dotyka, czy przynajmniej jego typie narzędzia. W przypadku braku dostępnych informacji zakłada się, że narzędzie jest nieaktywne (poza zasięgiem).W przypadku korzystania z protokołu multi-touch „A” narzędzie jest aktywne zawsze, gdy pojawia się w ostatnim raporcie synchronizacji. Kiedy narzędzie przestaje pojawiać się w raportach synchronizacji, przestaje istnieć.
W przypadku korzystania z protokołu multi-touch „B” narzędzie jest aktywne tak długo, jak długo ma aktywne gniazdo. Po wyczyszczeniu gniazda narzędzie przestaje istnieć.
Narzędzie jest określane jako unoszące się w powietrzu na podstawie następujących warunków:
Jeśli narzędziem jest
BTN_TOOL_MOUSE
lubBTN_TOOL_LENS
, to narzędzie nie unosi się, nawet jeśli spełniony jest jeden z poniższych warunków.Jeśli narzędzie jest aktywne, a sterownik zgłasza informacje o ciśnieniu, a zgłaszane ciśnienie wynosi zero, oznacza to, że narzędzie unosi się w powietrzu.
Jeśli narzędzie jest aktywne, a sterownik obsługuje kod klucza
BTN_TOUCH
, aBTN_TOUCH
ma wartość zero, oznacza to, że narzędzie unosi się w powietrzu.
InputReader
obsługuje protokół multi-touch „A” i „B”. Nowe sterowniki powinny używać protokołu „B”, ale oba będą działać.Od wersji Android Ice Cream Sandwich 4.0 może być konieczna zmiana sterowników ekranu dotykowego, aby były zgodne ze specyfikacją protokołu wejściowego systemu Linux.
Mogą być wymagane następujące zmiany:
Kiedy narzędzie staje się nieaktywne (palec idzie „w górę”), powinno przestać pojawiać się w kolejnych raportach synchronizacji wielodotykowej. Gdy wszystkie narzędzia staną się nieaktywne (wszystkie palce uniosą się w górę), sterownik powinien wysłać pusty pakiet raportu synchronizacji, taki jak
SYN_MT_REPORT
, po którym następujeSYN_REPORT
.Poprzednie wersje Androida oczekiwały, że zdarzenia „w górę” będą zgłaszane przez wysłanie wartości ciśnienia równej 0. Stare zachowanie było niezgodne ze specyfikacją protokołu wejściowego systemu Linux i nie jest już obsługiwane.
Informacje o ciśnieniu fizycznym lub sile sygnału należy podawać za pomocą
ABS_MT_PRESSURE
.Poprzednie wersje Androida pobierały informacje o ciśnieniu z
ABS_MT_TOUCH_MAJOR
. Stare zachowanie było niezgodne ze specyfikacją protokołu wejściowego systemu Linux i nie jest już obsługiwane.Informacje o rozmiarze dotyku należy zgłaszać za pomocą
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 systemu Linux i nie jest już obsługiwane.
Sterowniki urządzeń dotykowych nie wymagają już dostosowań specyficznych dla systemu Android. Opierając się na standardowym protokole wejściowym systemu Linux, Android może obsługiwać szerszą gamę dotykowych urządzeń peryferyjnych, takich jak zewnętrzne wielodotykowe ekrany dotykowe HID, przy użyciu niezmodyfikowanych sterowników.
Dotknij Obsługa urządzenia
Poniżej znajduje się krótkie podsumowanie działania urządzenia dotykowego w systemie Android.
EventHub
odczytuje surowe zdarzenia ze sterownikaevdev
.InputReader
zużywa nieprzetworzone zdarzenia i aktualizuje stan wewnętrzny dotyczący pozycji i innych cech każdego narzędzia. Śledzi również stany przycisków.Jeśli przyciski BACK lub FORWARD zostały naciśnięte lub zwolnione,
InputReader
powiadamiaInputDispatcher
o kluczowym zdarzeniu.InputReader
określa, czy nastąpiło naciśnięcie klawisza wirtualnego. Jeśli tak, powiadamiaInputDispatcher
o kluczowym zdarzeniu.InputReader
określa, czy dotyk został zainicjowany w granicach wyświetlacza. Jeśli tak, powiadamiaInputDispatcher
o zdarzeniu dotykowym.Jeśli nie ma narzędzi dotykających, ale jest co najmniej jedno narzędzie unoszące się,
InputReader
powiadamiaInputDispatcher
o zdarzeniu hover.Jeśli typem urządzenia dotykowego jest pointer ,
InputReader
wykonuje wykrywanie gestów wskaźnika, odpowiednio przesuwa wskaźnik i wykrywa oraz powiadamiaInputDispatcher
o zdarzeniu wskaźnika.InputDispatcher
używaWindowManagerPolicy
do określenia, czy zdarzenia powinny być wysyłane i czy powinny obudzić urządzenie. NastępnieInputDispatcher
dostarcza zdarzenia do odpowiednich aplikacji.
Dotknij opcji Konfiguracja urządzenia
Zachowanie urządzenia dotykowego jest określane przez osie urządzenia, przyciski, właściwości wejściowe, konfigurację urządzenia wejściowego, mapę klawiszy wirtualnych i układ klawiszy.
Więcej informacji o plikach uczestniczących w konfiguracji klawiatury można znaleźć w poniższych sekcjach:
Nieruchomości
System opiera się na wielu właściwościach konfiguracji urządzenia wejściowego w celu skonfigurowania i skalibrowania zachowania urządzenia dotykowego.
Jednym z powodów jest to, że sterowniki urządzeń dotykowych często podają charakterystykę dotknięć za pomocą jednostek specyficznych dla urządzenia.
Na przykład wiele urządzeń dotykowych mierzy powierzchnię kontaktu dotykowego za pomocą wewnętrznej skali specyficznej dla urządzenia, takiej jak całkowita liczba węzłów czujników, które zostały uruchomione przez dotyk. Ta surowa wartość rozmiaru nie miałaby znaczenia dla aplikacji, ponieważ musiałyby one znać fizyczny rozmiar i inne cechy węzłów czujnika urządzenia dotykowego.
System wykorzystuje parametry kalibracji zakodowane w plikach konfiguracyjnych urządzenia wejściowego do dekodowania, przekształcania i normalizacji wartości zgłaszanych przez urządzenie dotykowe w prostszą standardową reprezentację zrozumiałą dla aplikacji.
Konwencje dotyczące dokumentacji
W celach dokumentacyjnych użyjemy następujących konwencji do opisania wartości używanych przez system podczas procesu kalibracji.
Surowe wartości osi
Poniższe wyrażenia oznaczają nieprzetworzone wartości zgłaszane przez sterownik urządzenia dotykowego 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
lub 0 jeśli nie jest dostę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 nie jest dostępna. -
raw.toolMajor
- Wartość osi
ABS_TOOL_WIDTH
lubABS_MT_WIDTH_MAJOR
lub 0, jeśli nie jest dostępna. -
raw.toolMinor
- Wartość osi
ABS_MT_WIDTH_MINOR
lubraw.toolMajor
, jeśli nie jest dostępna. -
raw.orientation
- Wartość osi
ABS_MT_ORIENTATION
lub 0, jeśli nie jest dostępna. -
raw.distance
- Wartość osi
ABS_DISTANCE
lubABS_MT_DISTANCE
lub 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 nie jest dostępna.
Surowe zakresy osi
Następujące wyrażenia oznaczają granice wartości nieprzetworzonych. Uzyskuje się je przez wywołanie EVIOCGABS
ioctl dla każdej osi.
-
raw.*.min
- Włącznie z minimalną wartością surowej osi.
-
raw.*.max
- Maksymalna wartość włącznie nieprzetworzonej osi.
-
raw.*.range
- Odpowiednik
raw.*.max - raw.*.min
. -
raw.*.fuzz
- Dokładność surowej osi. np. fuzz = 1 oznacza, że wartości są dokładne do +/- 1 jednostki.
-
raw.width
- Łączna szerokość obszaru dotykowego, odpowiadająca
raw.x.range + 1
. -
raw.height
- Łączna wysokość obszaru dotykowego, odpowiadająca
raw.y.range + 1
.
Zakresy wyjściowe
Następujące wyrażenia opisują charakterystykę wyjściowego układu współrzędnych. System wykorzystuje interpolację liniową do przekształcania informacji o położeniu dotyku z jednostek powierzchni używanych przez urządzenie dotykowe na jednostki wyjściowe, które będą przekazywane aplikacjom, takim jak piksele wyświetlacza.
-
output.width
- Szerokość wyjściowa. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to szerokość wyświetlacza w pikselach. W przypadku paneli dotykowych (niepowiązanych z wyświetlaczem) szerokość wyjściowa jest równa
raw.width
, co wskazuje, że interpolacja nie zostanie przeprowadzona. -
output.height
- Wysokość wyjściowa. 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 jest równa
raw.height
, co wskazuje, że nie zostanie wykonana interpolacja. -
output.diag
- Długość przekątnej wyjściowego układu współrzędnych, odpowiadająca funkcji
sqrt(output.width ^2 + output.height ^2)
.
Podstawowa konfiguracja
Mapper wprowadzania dotykowego używa wielu właściwości konfiguracyjnych w pliku konfiguracyjnym urządzenia wejściowego, aby określić wartości kalibracji. W poniższej tabeli opisano niektóre właściwości konfiguracyjne ogólnego przeznaczenia. Wszystkie inne właściwości zostały opisane w poniższych sekcjach wraz z polami, które służą do kalibracji.
touch.deviceType
Definicja: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Określa typ urządzenia dotykowego.
Jeśli wartością jest
touchScreen
, urządzenie dotykowe jest ekranem dotykowym powiązanym z wyświetlaczem.Jeśli wartością jest
touchPad
, urządzenie dotykowe jest tabliczką dotykową niezwiązaną z wyświetlaczem.Jeśli wartością jest
pointer
, urządzenie dotykowe jest tabliczką dotykową niezwiązaną z wyświetlaczem, a jego ruchy są używane do pośrednich gestów wskaźnika wielodotykowego .Jeśli wartość jest
default
, system automatycznie wykrywa typ urządzenia zgodnie z algorytmem klasyfikacji.
Więcej informacji na temat wpływu typu urządzenia na zachowanie urządzenia dotykowego można znaleźć w sekcji Klasyfikacja .
Przed Honeycomb zakładano, że wszystkie urządzenia dotykowe są ekranami dotykowymi.
touch.orientationAware
Definicja: touch.orientationAware
= 0
| 1
Określa, czy urządzenie dotykowe powinno reagować na zmiany orientacji wyświetlacza.
Jeśli wartość wynosi
1
, pozycje dotyku zgłaszane przez urządzenie dotykowe są obracane za każdym razem, gdy zmienia się orientacja wyświetlacza.Jeśli wartość wynosi
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 ekranem dotykowym, 0
w przeciwnym razie.
System rozróżnia wewnętrzne i zewnętrzne ekrany dotykowe i wyświetlacze. Wewnętrzny ekran dotykowy rozpoznający orientację jest obracany w zależności od orientacji wewnętrznego wyświetlacza. Zewnętrzny ekran dotykowy rozpoznający orientację jest obracany w zależności od orientacji zewnętrznego wyświetlacza.
Świadomość orientacji jest używana do obsługi obracania ekranów dotykowych na urządzeniach takich jak Nexus One. Na przykład, gdy urządzenie zostanie obrócone zgodnie z ruchem wskazówek zegara o 90 stopni od jego naturalnej orientacji, bezwzględne pozycje dotknięć zostaną ponownie odwzorowane w taki sposób, że dotknięcie w lewym górnym rogu bezwzględnego układu współrzędnych ekranu dotykowego zostanie zgłoszone jako dotknięcie w lewym górnym rogu rogu obróconego układu współrzędnych wyświetlacza. Dzieje się tak, aby dotknięcia były zgłaszane z tym samym układem współrzędnych, którego aplikacje używają do rysowania swoich elementów wizualnych.
Przed Honeycomb zakładano, że wszystkie urządzenia dotykowe rozpoznają orientację.
touch.gestureMode
Definicja: touch.gestureMode
= pointer
| spots
| default
Określa tryb prezentacji dla gestów wskaźnika. Ta właściwość konfiguracyjna ma znaczenie tylko wtedy, gdy urządzenie dotykowe jest typu pointer .
Jeśli wartość to
pointer
, gesty panelu dotykowego są prezentowane za pomocą kursora podobnego do wskaźnika myszy.Jeśli wartością są
spots
, gesty tabliczki dotykowej są przedstawiane przez kotwicę reprezentującą środek ciężkości gestu oraz zestaw okrągłych kropek reprezentujących położenie poszczególnych palców.
Wartością domyślną jest pointer
, gdy ustawiona jest właściwość wejściowa INPUT_PROP_SEMI_MT
lub spots
w przeciwnym razie.
Pola X
i Y
Pola X i Y dostarczają informacji o położeniu środka obszaru kontaktu.
Obliczenie
Obliczenia są proste: informacje o położeniu ze sterownika dotykowego są interpolowane 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
TouchMajor
, TouchMinor
, ToolMajor
, ToolMinor
, Size
pól
Pola TouchMajor
i TouchMinor
opisują przybliżone wymiary obszaru styku w jednostkach wyjściowych (pikselach).
Pola ToolMajor
i ToolMinor
opisują przybliżone wymiary samego narzędzia w jednostkach wyjściowych (pikselach).
Pole Size
opisuje znormalizowany rozmiar dotyku względem największego możliwego dotyku, jaki może wykryć urządzenie dotykowe. Najmniejszy możliwy rozmiar znormalizowany to 0,0 (brak kontaktu lub jest niemierzalny), a największy możliwy rozmiar znormalizowany to 1,0 (obszar czujnika jest nasycony).
Gdy można zmierzyć zarówno przybliżoną długość, jak i szerokość, wówczas pole TouchMajor
określa dłuższy wymiar, a pole TouchMinor
określa krótszy wymiar powierzchni styku. Gdy można zmierzyć tylko przybliżoną średnicę powierzchni styku, wówczas pola TouchMajor
i TouchMinor
będą równe.
Podobnie pole ToolMajor
określa dłuższy wymiar, a pole ToolMinor
określa krótszy wymiar pola przekroju narzędzia.
Jeśli rozmiar dotykowy jest niedostępny, ale dostępny jest rozmiar narzędzia, wówczas rozmiar narzędzia zostanie ustawiony na równy rozmiarowi dotykowemu. I odwrotnie, jeśli rozmiar narzędzia jest niedostępny, ale dostępny jest rozmiar dotyku, wówczas rozmiar dotyku zostanie ustawiony na równy rozmiarowi narzędzia.
Urządzenia dotykowe mierzą lub zgłaszają rozmiar dotyku i rozmiar narzędzia na różne sposoby. Bieżąca implementacja obsługuje trzy różne rodzaje pomiarów: średnicę, powierzchnię i geometryczną ramkę ograniczającą w jednostkach powierzchni.
touch.size.calibration
Definicja: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Określa rodzaj pomiaru używanego przez sterownik dotyku do zgłaszania rozmiaru dotyku i rozmiaru narzędzia.
Jeśli wartość to
none
, rozmiar jest ustawiony na zero.Jeśli wartość jest
geometric
, zakłada się, że rozmiar jest określony w tych samych jednostkach powierzchni co położenie, więc jest skalowany w ten sam sposób.Jeśli wartością jest
diameter
, przyjmuje się, że rozmiar jest proporcjonalny do średnicy (szerokości) dotyku lub narzędzia.Jeśli wartością jest
area
, zakłada się, że rozmiar jest proporcjonalny do obszaru dotyku lub narzędzia.Jeśli wartością jest
default
, system użyje kalibracjigeometric
, jeśli dostępna jest ośraw.touchMajor
lubraw.toolMajor
, w przeciwnym razie użyje kalibracjinone
.
touch.size.scale
Definicja: touch.size.scale
= <nieujemna liczba zmiennoprzecinkowa>
Określa stały współczynnik skali używany w kalibracji.
Wartość domyślna to 1.0
.
touch.size.bias
Definicja: touch.size.bias
= <nieujemna liczba zmiennoprzecinkowa>
Określa stałą wartość odchylenia używaną w 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 aktywnych kontaktów, czy jest raportowany indywidualnie dla każdego kontaktu.
Jeśli wartość wynosi
1
, zgłoszony rozmiar zostanie podzielony przez liczbę kontaktów przed użyciem.Jeśli wartość wynosi
0
, zgłoszony rozmiar zostanie użyty bez zmian.
Wartość domyślna to 0
.
Niektóre urządzenia dotykowe, w szczególności urządzenia „Semi-MT”, nie są w stanie rozróżnić poszczególnych wymiarów wielu kontaktów, dlatego zgłaszają pomiar rozmiaru reprezentujący ich całkowitą powierzchnię lub szerokość. Ta właściwość powinna być ustawiona tylko na 1
dla takich urządzeń. W razie wątpliwości ustaw tę wartość na 0
.
Obliczenie
Obliczenie 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 Pressure
Pole Pressure
opisuje przybliżony nacisk fizyczny wywierany na urządzenie dotykowe jako znormalizowaną wartość z przedziału od 0,0 (brak dotyku) do 1,0 (pełna siła).
Zerowy nacisk wskazuje, że narzędzie unosi się.
touch.pressure.calibration
Definicja: touch.pressure.calibration
= none
| physical
| amplitude
| default
Określa rodzaj pomiaru używanego przez sterownik dotykowy do zgłaszania ciśnienia.
Jeśli wartość to
none
, ciśnienie jest nieznane, więc jest ustawione na 1,0 podczas dotykania i 0,0 podczas unoszenia się.Jeśli wartość jest
physical
, zakłada się, że oś nacisku mierzy rzeczywistą fizyczną intensywność nacisku wywieranego na tabliczkę dotykową.If the value is
amplitude
, the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.If the value is
default
, the system uses thephysical
calibration if the pressure axis available, otherwise usesnone
.
touch.pressure.scale
Definition: touch.pressure.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0 / raw.pressure.max
.
Calculation
The calculation of the Pressure
field depends on the specified calibration parameters.
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
Orientation
and Tilt
Fields
The Orientation
field describes the orientation of the touch and tool as an angular measurement. An orientation of 0
indicates that the major axis is oriented vertically, -PI/2
indicates that the major axis is oriented to the left, PI/2
indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range may be described in a full circle range from -PI
or PI
.
The Tilt
field describes the inclination of the tool as an angular measurement. A tilt of 0
indicates that the tool is perpendicular to the surface. A tilt of PI/2
indicates that the tool is flat on the surface.
touch.orientation.calibration
Definition: touch.orientation.calibration
= none
| interpolated
| vector
| default
Specifies the kind of measurement used by the touch driver to report the orientation.
If the value is
none
, the orientation is unknown so it is set to 0.If the value is
interpolated
, the orientation is linearly interpolated such that a raw value ofraw.orientation.min
maps to-PI/2
and a raw value ofraw.orientation.max
maps toPI/2
. The center value of(raw.orientation.min + raw.orientation.max) / 2
maps to0
.If the value is
vector
, the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.If the value is
default
, the system uses theinterpolated
calibration if the orientation axis available, otherwise usesnone
.
Calculation
The calculation of the Orientation
and Tilt
fields depends on the specified calibration parameters and available input.
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
Distance
Field
The Distance
field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.
touch.distance.calibration
Definition: touch.distance.calibration
= none
| scaled
| default
Specifies the kind of measurement used by the touch driver to report the distance.
If the value is
none
, the distance is unknown so it is set to 0.If the value is
scaled
, the reported distance is multiplied by a constant scale factor.If the value is
default
, the system uses thescaled
calibration if the distance axis available, otherwise usesnone
.
touch.distance.scale
Definition: touch.distance.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
Calculation
The calculation of the Distance
field depends on the specified calibration parameters.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Example
# 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 will 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
Compatibility Notes
The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.
Older touch device drivers may also need to be updated.
Virtual Key Map Files
Touch devices are often used to implement virtual keys.
There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.
When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename>
as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely
.
A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.
In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION
).
Syntax
A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.
Comment lines begin with '#' and continue to the end of the line.
Each virtual key is described by 6 colon-delimited components:
-
0x01
: A version code. Must always be0x01
. - <Linux key code>: The Linux key code of the virtual key.
- <centerX>: The X pixel coordinate of the center of the virtual key.
- <centerY>: The Y pixel coordinate of the center of the virtual key.
- <width>: The width of the virtual key in pixels.
- <height>: The height of the virtual key in pixels.
All coordinates and sizes are specified in terms of the display coordinate system.
Here is a virtual key map file all written on one line.
# 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
The same virtual key map file can also be written on multiple lines.
# 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
In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.
The first key has a Linux scan code of 158
( KEY_BACK
), centerX of 55
, centerY of 835
, width of 90
and height of 55
.
Example
Virtual key map file: /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
Key layout file: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Key character map file: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Indirect Multi-touch Pointer Gestures
In pointer mode, the system interprets the following gestures:
Single finger tap: click.
Single finger motion: move the pointer.
Single finger motion plus button presses: drag the pointer.
Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
Multiple finger motion: freeform gesture.
Palm rejection
As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM
flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.
The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the edge of the display the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by TouchMajor
and TouchMinor
. The Android framework then removes the pointers that are marked as palms from the touch stream.
If a pointer was already sent to the apps, then the system either:
- (If there are other active pointers) Cancels the pointer with
ACTION_POINTER_UP
andFLAG_CANCELED
set. - (If this is the only pointer) Cancels the pointer with
ACTION_CANCEL
.
A public API, MotionEvent.FLAG_CANCELED
, indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL
and ACTION_POINTER_UP
.
If the palm pointer wasn't sent to apps, then the system simply drops the pointer.
Enable palm rejection
- In your touch driver, use the
input_abs_set_res
macro to set the resolutions for the following fields (units are pixels per mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Support for
ABS_MT_TOUCH_MINOR
is optional. However, if your device does support it, make sure the resolution is set correctly. -
- To confirm the fields are set correctly, run:
$ adb shell getevent -li
- To enable the feature during runtime, run:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Restart the
system_server
process.$ adb shell stop && adb shell start
- Confirm that
adb shell dumpsys input
shows that there are palm rejectors insideUnwantedInteractionBlocker
. If it doesn't, check the input-related logs to find clues on what might be misconfigured.See the following example for reference:
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: {} - To permanently enable the feature, add the corresponding sysprop command in your
init**rc
file:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1