Urządzenia dotykowe

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

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 i ABS_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 i ABS_Y oraz obecność kodu klucza BTN_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 ioctl EVIOCGPROP ), 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 ioctl EVIOCGPROP ), wówczas typ urządzenia zostanie ustawiony na pointer .

  • Jeśli urządzenie wejściowe zgłosi obecność osi względnych REL_X lub REL_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 na MotionEvent.BUTTON_PRIMARY .

  • BTN_RIGHT : odwzorowane na MotionEvent.BUTTON_SECONDARY .

  • BTN_MIDDLE : odwzorowane na MotionEvent.BUTTON_MIDDLE .

  • BTN_BACK i BTN_SIDE : odwzorowane na MotionEvent.BUTTON_BACK . Naciśnięcie tego przycisku powoduje również syntezę naciśnięcia klawisza z kodem klucza KeyEvent.KEYCODE_BACK .

  • BTN_FORWARD i BTN_EXTRA : odwzorowane na MotionEvent.BUTTON_FORWARD . Naciśnięcie tego przycisku powoduje również syntezę naciśnięcia klawisza z kodem klucza KeyEvent.KEYCODE_FORWARD .

  • BTN_STYLUS : odwzorowane na MotionEvent.BUTTON_SECONDARY .

  • BTN_STYLUS2 : odwzorowane na MotionEvent.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 i MT_TOOL_FINGER : odwzorowane na MotionEvent.TOOL_TYPE_FINGER .

  • BTN_TOOL_PEN i MT_TOOL_PEN : odwzorowane na MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_RUBBER : odwzorowane na MotionEvent.TOOL_TYPE_ERASER .

  • BTN_TOOL_BRUSH : odwzorowane na MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_PENCIL : odwzorowane na MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_AIRBRUSH : odwzorowane na MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_MOUSE : odwzorowane na MotionEvent.TOOL_TYPE_MOUSE .

  • BTN_TOOL_LENS : odwzorowane na MotionEvent.TOOL_TYPE_MOUSE .

  • BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP i BTN_TOOL_QUADTAP : odwzorowane na MotionEvent.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

  1. 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, że BTN_TOUCH będzie zawsze używany do wskazania, czy narzędzie faktycznie dotyka ekranu. Dlatego BTN_TOUCH nie powinien być używany do wskazania, że ​​narzędzie jest jedynie w zasięgu i unosi się w powietrzu.

  2. 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) .

  3. 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śli ABS_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śli ABS_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 jako MT_TOOL_FINGER lub MT_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) .

  4. Jeśli zdefiniowano osie zarówno dla protokołu jednodotykowego, jak i wielodotykowego, zostaną użyte tylko osie wielodotykowe, a osie jednodotykowe zostaną zignorowane.

  5. Minimalne i maksymalne wartości osi ABS_X , ABS_Y , ABS_MT_POSITION_X i ABS_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.

  6. Wartości zgłaszane przez ABS_PRESSURE lub ABS_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.

  7. Wartości zgłaszane przez ABS_TOOL_WIDTH , ABS_MT_TOUCH_MAJOR , ABS_MT_TOUCH_MINOR , ABS_MT_WIDTH_MAJOR lub ABS_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.

  8. Wartości zgłaszane przez ABS_DISTANCE lub ABS_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.

  9. Wartości zgłaszane przez ABS_TILT_X i ABS_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 do PI / 2 radianów oraz płaski kąt orientacji w zakresie od -PI do PI 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.

  10. Jeśli typ narzędzia jest zgłaszany przez ABS_MT_TOOL_TYPE , zastąpi on wszelkie informacje o typie narzędzia zgłaszane przez BTN_TOOL_* . Jeśli w ogóle nie są dostępne żadne informacje o typie narzędzia, domyślnym typem narzędzia jest MotionEvent.TOOL_TYPE_FINGER .

  11. 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 lub BTN_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ć.

  12. 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 lub BTN_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 , a BTN_TOUCH ma wartość zero, oznacza to, że narzędzie unosi się w powietrzu.

  13. InputReader obsługuje protokół multi-touch „A” i „B”. Nowe sterowniki powinny używać protokołu „B”, ale oba będą działać.

  14. 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ępuje SYN_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.

  1. EventHub odczytuje surowe zdarzenia ze sterownika evdev .

  2. 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.

  3. Jeśli przyciski BACK lub FORWARD zostały naciśnięte lub zwolnione, InputReader powiadamia InputDispatcher o kluczowym zdarzeniu.

  4. InputReader określa, czy nastąpiło naciśnięcie klawisza wirtualnego. Jeśli tak, powiadamia InputDispatcher o kluczowym zdarzeniu.

  5. InputReader określa, czy dotyk został zainicjowany w granicach wyświetlacza. Jeśli tak, powiadamia InputDispatcher o zdarzeniu dotykowym.

  6. Jeśli nie ma narzędzi dotykających, ale jest co najmniej jedno narzędzie unoszące się, InputReader powiadamia InputDispatcher o zdarzeniu hover.

  7. Jeśli typem urządzenia dotykowego jest pointer , InputReader wykonuje wykrywanie gestów wskaźnika, odpowiednio przesuwa wskaźnik i wykrywa oraz powiadamia InputDispatcher o zdarzeniu wskaźnika.

  8. InputDispatcher używa WindowManagerPolicy do określenia, czy zdarzenia powinny być wysyłane i czy powinny obudzić urządzenie. Następnie InputDispatcher 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 lub ABS_MT_POSITION_X .
raw.y
Wartość osi ABS_Y lub ABS_MT_POSITION_Y .
raw.pressure
Wartość osi ABS_PRESSURE lub ABS_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 lub raw.touchMajor , jeśli nie jest dostępna.
raw.toolMajor
Wartość osi ABS_TOOL_WIDTH lub ABS_MT_WIDTH_MAJOR lub 0, jeśli nie jest dostępna.
raw.toolMinor
Wartość osi ABS_MT_WIDTH_MINOR lub raw.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 lub ABS_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 kalibracji geometric , jeśli dostępna jest oś raw.touchMajor lub raw.toolMajor , w przeciwnym razie użyje kalibracji none .

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 the physical calibration if the pressure axis available, otherwise uses none .

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 of raw.orientation.min maps to -PI/2 and a raw value of raw.orientation.max maps to PI/2 . The center value of (raw.orientation.min + raw.orientation.max) / 2 maps to 0 .

  • 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 the interpolated calibration if the orientation axis available, otherwise uses none .

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 the scaled calibration if the distance axis available, otherwise uses none .

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 be 0x01 .
  • <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:

  1. Single finger tap: click.

  2. Single finger motion: move the pointer.

  3. Single finger motion plus button presses: drag the pointer.

  4. 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.

  5. 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.

  6. 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 and FLAG_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

  1. 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.

  2. To confirm the fields are set correctly, run:
        $ adb shell getevent -li
    
  3. To enable the feature during runtime, run:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Restart the system_server process.
         $ adb shell stop && adb shell start
        
  5. Confirm that adb shell dumpsys input shows that there are palm rejectors inside UnwantedInteractionBlocker . 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: {}
    
  6. 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
    

Further Reading

  1. Linux multi-touch protocol
  2. ENAC list of available multitouch devices on Linux