Urządzenia z ekranami dotykowymi

Android obsługuje różnorodne ekrany dotykowe i tabliczki dotykowe, w tym tablety z rysikiem i tabletami z wyświetlaczem cyfrowym.

Ekrany dotykowe to urządzenia dotykowe powiązane z wyświetlaczem w taki sposób, że użytkownik ma wrażenie, że bezpośrednio manipuluje elementami na ekranie.

Płytki dotykowe to urządzenia dotykowe, które nie są powiązane z wyświetlaczem, takie jak tablet z digitalizatorem. Płytki dotykowe są zwykle używane do wskazywania lub do bezwzględnego pośredniego pozycjonowania 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 czasami manipulować za pomocą różnych narzędzi, takich jak palce lub rysik, w zależności od technologii czujnika dotykowego.

Urządzenia dotykowe są czasami używane do implementowania kluczy wirtualnych. Na przykład w niektórych urządzeniach z systemem Android obszar czujnika ekranu dotykowego wystaje poza krawędź wyświetlacza i pełni podwójną funkcję jako część klawiatury dotykowej.

Ze względu na dużą różnorodność urządzeń dotykowych, Android opiera się na dużej liczbie właściwości konfiguracyjnych, aby opisać charakterystykę i pożądane zachowanie każdego urządzenia.

Klasyfikacja urządzeń dotykowych

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 absolutnych ABS_MT_POSITION_X i ABS_MT_POSITION_Y .
  • Urządzenie wejściowe nie ma żadnych przycisków gamepada. Ten warunek rozwiązuje niejasność związaną z niektórymi gamepadami, które zgłaszają osie z kodami pokrywającymi się z osiami MT.

Urządzenie wejściowe jest klasyfikowane jako urządzenie jednodotykowe, jeśli spełnione są oba poniższe warunki:

  • Urządzenie wejściowe nie jest klasyfikowane jako urządzenie wielodotykowe. Urządzenie wejściowe jest klasyfikowane jako urządzenie jednodotykowe lub urządzenie wielodotykowe, nigdy jedno i drugie.
  • Urządzenie wejściowe zgłasza obecność osi absolutnych ABS_X i ABS_Y oraz obecność kodu klucza BTN_TOUCH .

Kiedy urządzenie wejściowe jest klasyfikowane jako urządzenie dotykowe, obecność kluczy wirtualnych jest określana poprzez próbę załadowania pliku mapy klawiszy wirtualnych dla tego urządzenia. Jeśli dostępna jest wirtualna mapa klawiszy, ładowany jest również plik układu klawiszy dla urządzenia. Informacje na temat lokalizacji i formatu tych plików znajdziesz w [Pliki wirtualnej mapy klawiszy](#virtual-key-map-files).

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 wybiera domyślną konfigurację, odpowiednią dla dotykowych urządzeń peryferyjnych ogólnego przeznaczenia, takich jak zewnętrzne ekrany dotykowe USB lub Bluetooth HID lub tabliczki dotykowe. Te ustawienia domyślne nie są przeznaczone dla wbudowanych ekranów dotykowych i mogą powodować nieprawidłowe działanie.

Po załadowaniu konfiguracji urządzenia wejściowego system klasyfikuje 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. Użytkownik bezpośrednio dotyka ekranu, dzięki czemu system nie wymaga żadnych dodatkowych afordancji wskazujących, którymi obiektami manipuluje.
  • Urządzenie touchpad służy do dostarczania aplikacji informacji o bezwzględnym położeniu w przypadku dotknięcia danego obszaru czujnika. Może się przydać w przypadku tabletów z digitalizatorem.
  • Urządzenie wskazujące służy do pośredniego manipulowania obiektami na ekranie za pomocą kursora. Palce są interpretowane jako gesty wskaźnika wielodotykowego. 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 jest ustawiany zgodnie ze wskazaniami.
  • Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej INPUT_PROP_DIRECT (poprzez ioctl EVIOCGPROP ), wówczas typem urządzenia jest ustawiony na ekran dotykowy . W tym warunku zakłada się, że urządzenia dotykowe z bezpośrednim wejściem są podłączone do wyświetlacza, który również jest podłączony.
  • Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej INPUT_PROP_POINTER (poprzez ioctl EVIOCGPROP ), wówczas typ urządzenia jest ustawiony na pointer .
  • Jeżeli urządzenie wejściowe zgłosi obecność osi względnych REL_X lub REL_Y , wówczas typem urządzenia jest ustawiony na touchpad . Ten warunek rozwiązuje niejednoznaczność dotyczącą urządzeń wejściowych składających się zarówno z myszy, jak i panelu dotykowego. W tym przypadku touchpad nie jest używany do sterowania wskaźnikiem, ponieważ mysz już nim steruje.
  • W przeciwnym razie typ urządzenia jest ustawiony na pointer . To ustawienie domyślne zapewnia, że ​​tabliczki dotykowe, które nie zostały wyznaczone do żadnego innego specjalnego przeznaczenia, sterują 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 można ich używać głównie z urządzeniami dotykowymi ze wskaźnikiem lub rysikiem.

Obsługiwane są następujące przyciski:

  • BTN_LEFT : Mapowane do MotionEvent.BUTTON_PRIMARY .
  • BTN_RIGHT : Mapowane do MotionEvent.BUTTON_SECONDARY .
  • BTN_MIDDLE : Mapowane do MotionEvent.BUTTON_MIDDLE .
  • BTN_BACK i BTN_SIDE : Mapowane do MotionEvent.BUTTON_BACK . Naciśnięcie tego przycisku powoduje także syntezę naciśnięcia klawisza z kodem klawisza KeyEvent.KEYCODE_BACK .
  • BTN_FORWARD i BTN_EXTRA : Mapowane do MotionEvent.BUTTON_FORWARD . Naciśnięcie tego przycisku powoduje także syntezę naciśnięcia klawisza z kodem klawisza KeyEvent.KEYCODE_FORWARD .
  • BTN_STYLUS : Mapowane do MotionEvent.BUTTON_SECONDARY .
  • BTN_STYLUS2 : Mapowane do MotionEvent.BUTTON_TERTIARY .

Narzędzia i typy narzędzi

Narzędzie to palec, rysik lub inne urządzenie używane do interakcji z urządzeniem dotykowym. Niektóre urządzenia dotykowe potrafią rozróżnić różne typy narzędzi.

W innych miejscach systemu Android, np. w interfejsie 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 : Mapowane do MotionEvent.TOOL_TYPE_FINGER .
  • BTN_TOOL_PEN i MT_TOOL_PEN : Mapowane do MotionEvent.TOOL_TYPE_STYLUS .
  • BTN_TOOL_RUBBER : Mapowane do MotionEvent.TOOL_TYPE_ERASER .
  • BTN_TOOL_BRUSH : Mapowane do MotionEvent.TOOL_TYPE_STYLUS .
  • BTN_TOOL_PENCIL : Mapowane do MotionEvent.TOOL_TYPE_STYLUS .
  • BTN_TOOL_AIRBRUSH : Mapowane do MotionEvent.TOOL_TYPE_STYLUS .
  • BTN_TOOL_MOUSE : Mapowane do MotionEvent.TOOL_TYPE_MOUSE .
  • BTN_TOOL_LENS : Mapowane do MotionEvent.TOOL_TYPE_MOUSE .
  • BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP i BTN_TOOL_QUADTAP : Mapowane do MotionEvent.TOOL_TYPE_FINGER .

Utrzymywanie kursora a dotykanie narzędzi

Narzędzia mogą stykać się z urządzeniem dotykowym lub znajdować się w jego zasięgu i unosić się nad nim. Nie wszystkie urządzenia dotykowe mogą wykryć obecność narzędzia unoszącego się nad urządzeniem dotykowym. Te, które to robią, takie jak digitalizatory rysikowe oparte na częstotliwości radiowej, często potrafią wykryć, kiedy narzędzie znajduje się w ograniczonym zasięgu digitalizatora.

Komponent InputReader odróżnia narzędzia dotykające od narzędzi przesuwanych. Podobnie narzędzia dotykowe i narzędzia po najechaniu myszką są zgłaszane aplikacjom na różne sposoby.

Narzędzia dotykowe są zgłaszane aplikacjom jako zdarzenia dotykowe przy użyciu funkcji MotionEvent.ACTION_DOWN , MotionEvent.ACTION_MOVE , MotionEvent.ACTION_DOWN , MotionEvent.ACTION_POINTER_DOWN i MotionEvent.ACTION_POINTER_UP .

Narzędzia do przesuwania są zgłaszane aplikacjom jako ogólne zdarzenia ruchu przy użyciu MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVE i MotionEvent.ACTION_HOVER_EXIT .

Wymagania sterownika urządzenia dotykowego

  • Sterowniki urządzeń dotykowych powinny rejestrować tylko osie i kody klawiszy dla osi i przycisków, które obsługują. Zarejestrowanie nieobsługiwanych osi lub kodów klawiszy może zmylić algorytm klasyfikacji urządzenia lub spowodować, że system błędnie wykryje możliwości urządzenia. Na przykład, jeśli urządzenie zgłasza kod klucza BTN_TOUCH , system zakłada, że BTN_TOUCH jest zawsze używany do wskazania, czy narzędzie dotyka ekranu. Dlatego BTN_TOUCH nie powinien być używany do wskazania, że ​​narzędzie znajduje się jedynie w zasięgu i unosi się w powietrzu.
  • Urządzenia obsługujące jeden dotyk korzystają z 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 przyłożony do końcówki 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 : (opcjonalne) Raportuje nachylenie narzędzia od powierzchni urządzenia dotykowego wzdłuż osi X.
    • ABS_TILT_Y : (opcjonalnie) Raportuje nachylenie narzędzia od 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) Podaje typ narzędzia .
  • Urządzenia wielodotykowe korzystają z 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 przyłożony do końcówki narzędzia lub siłę sygnału kontaktu dotykowego.
    • ABS_MT_TOUCH_MAJOR : (opcjonalnie) Podaje pole przekroju poprzecznego kontaktu dotykowego lub długość dłuższego wymiaru kontaktu dotykowego.
    • ABS_MT_TOUCH_MINOR : (opcjonalnie) Podaje długość krótszego wymiaru kontaktu dotykowego. Oś ta nie powinna być używana, jeśli ABS_MT_TOUCH_MAJOR raportuje pomiar powierzchni.
    • ABS_MT_WIDTH_MAJOR : (opcjonalnie) Podaje pole przekroju poprzecznego samego narzędzia lub długość dłuższego wymiaru samego narzędzia. Nie używaj tej osi, jeśli nie znasz wymiarów samego narzędzia.
    • ABS_MT_WIDTH_MINOR : (opcjonalnie) Podaje długość krótszego wymiaru samego narzędzia. Oś ta nie powinna być używana, jeśli ABS_MT_WIDTH_MAJOR raportuje pomiar powierzchni lub jeśli wymiary samego narzędzia nie są znane.
    • ABS_MT_ORIENTATION : (opcjonalnie) Podaje orientację narzędzia.
    • ABS_MT_DISTANCE : (opcjonalnie) Podaje odległość narzędzia od powierzchni urządzenia dotykowego.
    • ABS_MT_TOOL_TYPE : (opcjonalnie) Podaje 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 używana do niezależnej identyfikacji i śledzenia każdego narzędzia, gdy aktywnych jest wiele narzędzi. Na przykład, gdy urządzenia dotyka wiele palców, każdemu z nich należy przypisać odrębny identyfikator śledzenia, który będzie używany tak długo, jak długo palec pozostanie w kontakcie. Identyfikatory śledzenia można ponownie wykorzystać, gdy powiązane z nimi narzędzia znajdą się poza zasięgiem.
    • ABS_MT_SLOT : (opcjonalnie) Podaje identyfikator gniazda narzędzia, gdy używany jest protokół wielodotykowy systemu Linux „B”. Więcej szczegółów 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) Podaje typ narzędzia .
  • Jeśli zdefiniowano osie zarówno dla protokołu jednodotykowego, jak i wielodotykowego, używane będą tylko osie wielodotykowe, a osie jednodotykowe są ignorowane.
  • Wartości minimalne i maksymalne osi ABS_X , ABS_Y , ABS_MT_POSITION_X i ABS_MT_POSITION_Y definiują 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 raportowanym obszarem aktywnym.

    Dotknięcia inicjowane poza obszarem aktywnym nie są dostarczane do aplikacji, ale można ich używać do kluczy wirtualnych.

    Dotknięcia inicjowane w obszarze aktywnym lub wchodzące i wychodzące z obszaru wyświetlania są dostarczane do aplikacji. W rezultacie, jeśli dotknięcie rozpocznie się w granicach aplikacji, a następnie wyjdzie poza obszar aktywny, aplikacja może otrzymać zdarzenia dotyku ze współrzędnymi wyświetlania, które są ujemne lub wykraczają poza granice wyświetlacza. Jest to oczekiwane zachowanie.

    Urządzenie dotykowe nigdy nie powinno mocować współrzędnych dotykowych do granic obszaru aktywnego. Jeśli dotyk opuści obszar aktywny, powinien zostać zgłoszony jako znajdujący się poza obszarem aktywnym lub w ogóle nie powinien być zgłaszany.

    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 w dalszym ciągu będzie się przesuwał poza aktywny obszar, ekran dotykowy powinien albo rozpocząć zgłaszanie współrzędnych ze składowymi mniejszymi niż minX i minY, np. (minX - 2, minY - 3), albo powinien całkowicie przestać raportować dotyk. Innymi słowy, ekran dotykowy nie powinien raportować (minX, minY), gdy palec użytkownika rzeczywiście dotyka poza obszarem aktywnym.

    Przymocowanie 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 lub wychodzących z obszaru wyświetlania.

  • 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, i zerowe w przeciwnym razie, aby wskazać, że narzędzie się unosi.

    Zgłaszanie informacji o ciśnieniu jest opcjonalne , ale zdecydowanie zalecane. Aplikacje mogą wykorzystywać informacje o ciśnieniu do implementowania rysunków wrażliwych 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 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 kontaktów dotykowych palcem, ale nie kontaktów dotykowych rysikiem.

    Zgłaszanie informacji o rozmiarze jest opcjonalne , ale zdecydowanie zalecane. Aplikacje mogą wykorzystywać informacje o ciśnieniu do implementowania rysunków uwzględniających rozmiar i innych efektów.

  • 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ć niezerowa nawet przy bezpośrednim kontakcie narzędzia. Dokładne raportowane 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ń typu rysik.

  • Wartości raportowane przez ABS_TILT_X i ABS_TILT_Y powinny wynosić zero, gdy narzędzie jest ustawione prostopadle do urządzenia. Niezerowe pochylenie oznacza, że ​​narzędzie jest trzymane pod kątem.

    Zakłada się, że kąty pochylenia wzdłuż osi X i Y są określone w stopniach od prostopadłej. Punkt środkowy (idealnie prostopadły) jest wyznaczany przez (max + min) / 2 dla każdej osi. Wartości mniejsze niż punkt środkowy reprezentują przechylenie w górę lub w lewo, wartości większe niż punkt środkowy oznaczają przechylenie w dół lub w prawo.

    InputReader konwertuje komponenty pochylenia X i Y na prostopadły kąt pochylenia w zakresie od 0 do PI / 2 radianów i płaski kąt orientacji w zakresie od -PI do PI radianów. Ta reprezentacja skutkuje opisem orientacji zgodnym z tym, co jest używane do opisu dotknięć palców.

    Zgłaszanie informacji o pochyleniu jest opcjonalne , ale zalecane w przypadku urządzeń typu rysik.

  • Jeśli typ narzędzia jest zgłaszany przez ABS_MT_TOOL_TYPE , zastępuje to 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 .

  • Narzędzie zostaje uznane za aktywne na podstawie następujących warunków:

    • Podczas korzystania z protokołu pojedynczego dotyku narzędzie jest aktywne, jeśli BTN_TOUCH lub BTN_TOOL_* ma wartość 1.

      Warunek ten oznacza, że InputReader musi posiadać przynajmniej pewne informacje o naturze narzędzia, czy jest ono dotykające, czy przynajmniej o jego typie. Jeśli nie są dostępne żadne informacje, przyjmuje się, że narzędzie jest nieaktywne (poza zakresem).

    • W przypadku korzystania z protokołu wielodotyku „A” narzędzie jest aktywne zawsze, gdy pojawia się w najnowszym raporcie synchronizacji. Kiedy narzędzie przestaje pojawiać się w raportach synchronizacji, przestaje istnieć.
    • W przypadku korzystania z protokołu wielodotyku „B” narzędzie jest aktywne tak długo, jak długo ma aktywne gniazdo. Po wyczyszczeniu gniazda narzędzie przestaje istnieć.
  • O tym, że narzędzie unosi się w powietrzu, decyduje się na podstawie następujących warunków:
    • Jeśli narzędziem jest BTN_TOOL_MOUSE lub BTN_TOOL_LENS , narzędzie nie unosi się w powietrzu, nawet jeśli spełniony jest którykolwiek z poniższych warunków.
    • Jeśli narzędzie jest aktywne i kierowca zgłasza informacje o ciśnieniu, a zgłaszane ciśnienie wynosi zero, wówczas narzędzie się unosi.
    • Jeśli narzędzie jest aktywne i sterownik obsługuje kod klucza BTN_TOUCH , a BTN_TOUCH ma wartość zero, to narzędzie się znajduje.
  • InputReader obsługuje zarówno protokół wielodotykowy „A”, jak i „B”. Nowe sterowniki powinny używać protokołu „B”, ale którykolwiek z nich działa.
  • Począwszy od wersji Androida 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:

    • Gdy narzędzie stanie się nieaktywne (palec pójdzie „w górę”), powinno przestać pojawiać się w kolejnych raportach synchronizacji wielodotykowej. Kiedy wszystkie narzędzia staną się nieaktywne (wszystkie palce podniosą się do góry), 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 raportowania zdarzeń „up” poprzez 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 zgłaszać 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, system 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.

Obsługa urządzenia dotykowego

Poniżej znajduje się krótkie podsumowanie obsługi urządzenia dotykowego w systemie Android.

  1. EventHub odczytuje surowe zdarzenia ze sterownika evdev .
  2. InputReader wykorzystuje nieprzetworzone zdarzenia i aktualizuje stan wewnętrzny dotyczący pozycji i innych cech każdego narzędzia. Śledzi także stany przycisków.
  3. Jeżeli naciśnięto lub puszczono przycisk BACK lub FORWARD , InputReader powiadamia InputDispatcher o kluczowym zdarzeniu.
  4. InputReader sprawdza, 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 żadnych narzędzi dotykających, ale istnieje co najmniej jedno narzędzie przesuwające, InputReader powiadamia InputDispatcher o zdarzeniu najechania.
  7. Jeśli typem urządzenia dotykowego jest pointer , InputReader wykrywa gest wskaźnika, odpowiednio przesuwa wskaźnik i plamki oraz powiadamia InputDispatcher o zdarzeniu wskaźnika.
  8. InputDispatcher używa WindowManagerPolicy do określenia, czy zdarzenia powinny zostać wywołane i czy powinny obudzić urządzenie. Następnie InputDispatcher dostarcza zdarzenia do odpowiednich aplikacji.

Dotknij konfiguracji urządzenia

Zachowanie urządzenia dotykowego zależy od osi urządzenia, przycisków, właściwości wejściowych, konfiguracji urządzenia wejściowego, mapy klawiszy wirtualnych i układu klawiszy.

Więcej szczegółów na temat plików biorących udział w konfiguracji klawiatury można znaleźć w poniższych sekcjach:

Nieruchomości

System wykorzystuje wiele właściwości konfiguracyjnych urządzenia wejściowego do konfiguracji i kalibracji zachowania urządzenia dotykowego.

Jednym z powodów jest to, że sterowniki urządzeń dotykowych często zgłaszają charakterystykę dotknięć za pomocą jednostek specyficznych dla urządzenia.

Na przykład wiele urządzeń dotykowych mierzy obszar kontaktu dotykowego za pomocą wewnętrznej skali specyficznej dla urządzenia, takiej jak całkowita liczba węzłów czujnikowych, które zostały wyzwolone przez dotyk. Ta nieprzetworzona wartość rozmiaru nie byłaby istotna dla aplikacji, ponieważ musiałyby znać rozmiar fizyczny 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 normalizowania wartości zgłaszanych przez urządzenie dotykowe w prostszą standardową reprezentację zrozumiałą dla aplikacji.

Konwencje dokumentacyjne

Dla celów dokumentacyjnych stosujemy poniższe konwencje opisujące wartości stosowane 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ępne.
raw.touchMajor
Wartość osi ABS_MT_TOUCH_MAJOR lub 0 jeżeli nie jest dostępne.
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ępne.
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ępne.
raw.tiltX
Wartość osi ABS_TILT_X lub 0 jeśli nie jest dostępne.
raw.tiltY
Wartość osi ABS_TILT_Y lub 0 jeśli nie jest dostępna.

Surowe zakresy osi

Poniższe wyrażenia oznaczają granice wartości surowych. Uzyskuje się je poprzez wywołanie EVIOCGABS ioctl dla każdej osi.

raw.*.min
Włączająca minimalna wartość surowej osi.
raw.*.max
Łączna maksymalna wartość nieprzetworzonej osi.
raw.*.range
Odpowiednik raw.*.max - raw.*.min .
raw.*.fuzz
Dokładność surowej osi. np. fuzz = 1 oznacza, że ​​wartości są z dokładnością do +/- 1 jednostki.
raw.width
Łączna szerokość obszaru dotykowego, równoważna raw.x.range + 1 .
raw.height
Łączna wysokość obszaru dotykowego, równoważna raw.y.range + 1 .

Zakresy wyjściowe

Poniższe wyrażenia oznaczają charakterystykę wyjściowego układu współrzędnych. System wykorzystuje interpolację liniową do tłumaczenia informacji o położeniu dotyku z jednostek powierzchni używanych przez urządzenie dotykowe na jednostki wyjściowe zgłaszane 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 płytek dotykowych (niepowiązanych z wyświetlaczem) szerokość wyjściowa jest równa raw.width , co oznacza, że ​​nie jest wykonywana żadna interpolacja.
output.height
Wysokość wyjściowa. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to wysokość wyświetlacza w pikselach. W przypadku płytek dotykowych (niepowiązanych z wyświetlaczem) wysokość wyjściowa jest równa raw.height , co oznacza, że ​​nie jest wykonywana żadna interpolacja.
output.diag
Długość przekątnej wyjściowego układu współrzędnych, równoważna sqrt(output.width ^2 + output.height ^2) .

Podstawowa konfiguracja

Narzędzie do mapowania wejścia dotykowego wykorzystuje wiele właściwości konfiguracyjnych znajdujących się w pliku konfiguracyjnym urządzenia wejściowego w celu określenia wartości kalibracyjnych. W poniższej tabeli opisano niektóre właściwości konfiguracyjne ogólnego przeznaczenia. Wszystkie pozostałe właściwości opisano w poniższych sekcjach wraz z polami, które służą do kalibracji.

typ.urządzenia dotykowego

Definicja: touch.deviceType = touchScreen | touchPad | pointer | default

Określa typ urządzenia dotykowego.

  • Jeśli wartość to touchScreen , urządzeniem dotykowym jest ekran dotykowy powiązany z wyświetlaczem.

  • Jeśli wartością jest touchPad , urządzeniem dotykowym jest panel dotykowy niepowiązany z wyświetlaczem.

  • Jeśli wartością jest pointer , urządzeniem dotykowym jest panel dotykowy niepowiązany z wyświetlaczem, a jego ruchy są wykorzystywane 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 .

W systemie Android 3 i niższych założono, że wszystkie urządzenia dotykowe są ekranami dotykowymi.

orientacja dotykowaŚwiadomy

Definicja: touch.orientationAware = 0 | 1

Określa, czy urządzenie dotykowe powinno reagować na zmiany orientacji wyświetlacza.

  • Jeśli wartość wynosi 1 , pozycje dotykowe zgłaszane przez urządzenie dotykowe są obracane za każdym razem, gdy zmienia się orientacja wyświetlacza.

  • Jeśli wartość wynosi 0 , pozycje dotykowe 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 i wyświetlacze dotykowe. Wewnętrzny ekran dotykowy obsługujący orientację jest obracany w zależności od orientacji wyświetlacza wewnętrznego. Zewnętrzny ekran dotykowy obsługujący orientację jest obracany w zależności od orientacji wyświetlacza zewnętrznego.

Funkcja świadomości orientacji umożliwia obracanie ekranów dotykowych na urządzeniach takich jak Nexus One. Na przykład, gdy urządzenie zostanie obrócone w kierunku zgodnym z ruchem wskazówek zegara o 90 stopni w stosunku do 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 będzie zgłaszane jako dotknięcie w lewym górnym rogu róg obróconego układu współrzędnych wyświetlacza. Dzieje się tak, aby dotknięcia były zgłaszane w tym samym układzie współrzędnych, którego używają aplikacje do rysowania elementów wizualnych.

Przed wprowadzeniem Honeycomb zakładano, że wszystkie urządzenia dotykowe rozpoznają orientację.

tryb dotykowy.gest

Definicja: touch.gestureMode = pointer | spots | default

Określa tryb prezentacji gestów wskaźnika. Ta właściwość konfiguracyjna ma zastosowanie tylko wtedy, gdy urządzenie dotykowe jest typu pointer .

  • Jeśli wartością jest pointer , gesty panelu dotykowego są prezentowane za pomocą kursora podobnego do wskaźnika myszy.

  • Jeśli wartością są spots , gesty panelu dotykowego są przedstawiane za pomocą kotwicy reprezentującej środek ciężkości gestu oraz zestawu okrągłych plamek 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 inny sposób.

Pola X i Y

Pola X i Y dostarczają informacji o położeniu środka obszaru styku.

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, pola rozmiaru

Pola touchMajor i touchMinor opisują przybliżone wymiary powierzchni 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 w odniesieniu do największego możliwego dotyku, jaki może wyczuć urządzenie dotykowe. Najmniejszy możliwy znormalizowany rozmiar to 0,0 (brak kontaktu lub niemożliwy do zmierzenia), a największy możliwy znormalizowany rozmiar 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ć jedynie przybliżoną średnicę powierzchni styku, wówczas pola touchMajor i touchMinor są sobie równe.

Podobnie pole toolMajor określa dłuższy wymiar, a pole toolMinor określa krótszy wymiar pola przekroju poprzecznego narzędzia.

Jeśli rozmiar dotykowy jest niedostępny, ale rozmiar narzędzia jest dostępny, wówczas rozmiar narzędzia jest ustawiany na równy rozmiarowi dotykowemu. I odwrotnie, jeśli rozmiar narzędzia jest niedostępny, ale rozmiar dotyku jest dostępny, wówczas rozmiar dotyku jest ustawiany na równy rozmiarowi narzędzia.

Urządzenia dotykowe mierzą lub zgłaszają rozmiar dotyku i rozmiar narzędzia na różne sposoby. Obecna implementacja obsługuje trzy różne rodzaje pomiarów: średnicę, powierzchnię i geometryczną ramkę ograniczającą w jednostkach powierzchni.

Definicja: touch.size.calibration = none | geometric | diameter | area | default

Określa rodzaj pomiaru używany przez sterownik dotyku do raportowania rozmiaru dotyku i rozmiaru narzędzia.

  • Jeśli wartość wynosi none , rozmiar jest ustawiany na zero.

  • Jeśli wartość jest geometric , zakłada się, że rozmiar jest określony w tych samych jednostkach powierzchni co pozycja, dlatego 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ść jest default , system zastosuje kalibrację geometric , jeśli dostępna jest oś raw.touchMajor lub raw.toolMajor , w przeciwnym razie zastosuje kalibrację none .

dotykowy.rozmiar.skala

Definicja: touch.size.scale = <nieujemna liczba zmiennoprzecinkowa>

Określa stały współczynnik skali używany w kalibracji.

Wartość domyślna to 1.0 .

odchylenie.rozmiaru dotyku

Definicja: touch.size.bias = <nieujemna liczba zmiennoprzecinkowa>

Określa stałą wartość odchylenia używaną w kalibracji.

Wartość domyślna to 0.0 .

touch.size.issumed

Definicja: touch.size.isSummed = 0 | 1

Określa, czy rozmiar ma być raportowany jako suma rozmiarów wszystkich aktywnych kontaktów, czy też indywidualnie dla każdego kontaktu.

  • Jeśli wartość wynosi 1 , raportowany rozmiar jest dzielony przez liczbę kontaktów przed użyciem.

  • Jeśli wartość wynosi 0 , raportowany rozmiar jest używany 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ć indywidualnych wymiarów wielu styków, dlatego zgłaszają pomiar rozmiaru reprezentujący ich całkowitą powierzchnię lub szerokość. W przypadku takich urządzeń tę właściwość należy ustawić tylko na 1 . W razie wątpliwości ustaw tę wartość na 0 .

Obliczenie

Obliczenia pól touchMajor , touchMinor , toolMajor , toolMinor i size zależą od określonych parametrów kalibracji.

If raw.touchMajor and raw.toolMajor are available:
    touchMajor = raw.touchMajor
    touchMinor = raw.touchMinor
    toolMajor = raw.toolMajor
    toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
    toolMajor = touchMajor = raw.touchMajor
    toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
    touchMajor = toolMajor = raw.toolMajor
    touchMinor = toolMinor = raw.toolMinor
Else
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
End If

size = avg(touchMajor, touchMinor)

If touch.size.isSummed == 1:
    touchMajor = touchMajor / numberOfActiveContacts
    touchMinor = touchMinor / numberOfActiveContacts
    toolMajor = toolMajor / numberOfActiveContacts
    toolMinor = toolMinor / numberOfActiveContacts
    size = size / numberOfActiveContacts
End If

If touch.size.calibration == "none":
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
Else If touch.size.calibration == "geometric":
    outputScale = average(output.width / raw.width, output.height / raw.height)
    touchMajor = touchMajor * outputScale
    touchMinor = touchMinor * outputScale
    toolMajor = toolMajor * outputScale
    toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
    touchMajor = sqrt(touchMajor)
    touchMinor = touchMajor
    toolMajor = sqrt(toolMajor)
    toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
    touchMinor = touchMajor
    toolMinor = toolMajor
End If

If touchMajor != 0:
    output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
    output.touchMajor = 0
End If

If touchMinor != 0:
    output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
    output.touchMinor = 0
End If

If toolMajor != 0:
    output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
    output.toolMajor = 0
End If

If toolMinor != 0:
    output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
    output.toolMinor = 0
End If

output.size = size

pole ciśnienia

Pole pressure opisuje przybliżony nacisk fizyczny wywierany na urządzenie dotykowe jako znormalizowaną wartość z zakresu od 0,0 (brak dotyku) do 1,0 (pełna siła).

Zerowe ciśnienie wskazuje, że narzędzie unosi się w powietrzu.

kalibracja.ciśnienia dotykowego

Definicja: touch.pressure.calibration = none | physical | amplitude | default

Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania ciśnienia.

  • Jeśli wartość wynosi none , ciśnienie jest nieznane, dlatego jest ustawiane na 1,0 w przypadku dotknięcia i 0,0 w przypadku najechania myszką.

  • Jeśli wartość jest physical , zakłada się, że oś nacisku mierzy rzeczywistą fizyczną intensywność nacisku wywieranego na tabliczkę dotykową.

  • Jeżeli wartością jest amplitude , zakłada się, że oś ciśnienia mierzy amplitudę sygnału, która jest powiązana z rozmiarem styku i przyłożonym naciskiem.

  • Jeśli wartość jest default , system zastosuje kalibrację physical , jeśli dostępna jest oś ciśnienia, w przeciwnym razie nie zastosuje none .

skala.dotyku.ciśnienia

Definicja: touch.pressure.scale = <nieujemna liczba zmiennoprzecinkowa>

Określa stały współczynnik skali stosowany w kalibracji.

Wartość domyślna to 1.0 / raw.pressure.max .

Obliczenie

Obliczenie pola pressure zależy od określonych parametrów kalibracji.

If touch.pressure.calibration == "physical" or "amplitude":
    output.pressure = raw.pressure * touch.pressure.scale
Else
    If hovering:
        output.pressure = 0
    Else
        output.pressure = 1
    End If
End If

Orientacja i pochylenie

Pole orientation opisuje orientację dotyku i narzędzia jako pomiar kątowy. Orientacja 0 wskazuje, że główna oś jest zorientowana pionowo, -PI/2 wskazuje, że oś główna jest zorientowana na lewą, PI/2 wskazuje, że osi głównej jest zorientowana na prawą. Gdy jest obecne narzędzie rysika, zakres orientacji można opisać w pełnym zakresie koła od -PI lub PI .

Pole tilt opisuje pochylenie narzędzia jako pomiar kątowy. Pochylenie 0 wskazuje, że narzędzie jest prostopadłe do powierzchni. Pochylenie PI/2 wskazuje, że narzędzie jest płaskie na powierzchni.

Touch.orientation.Calibracja

Definicja: touch.orientation.calibration = none | interpolated | vector | default

Określa rodzaj pomiaru stosowanego przez sterownik dotykowy do zgłoszenia orientacji.

  • Jeśli wartość none , orientacja jest nieznana, więc jest ustawiona na 0.
  • Jeśli PI/2 jest interpolated , orientacja jest liniowo raw.orientation.max w taki sposób -PI/2 że surowa wartość raw.orientation.min Wartość środka (raw.orientation.min + raw.orientation.max) / 2 mapy do 0 .
  • Jeśli wartość to vector , orientacja jest interpretowana jako zapakowany wektor konserwujący dwa podpisane 4-bitowe pól. Ta reprezentacja jest używana w częściach protokołu opartych na obiektach Atmel. Po dekodowaniu wektor daje kąt orientacji i wielkość pewności siebie. Wielkość ufności służy do skalowania informacji o wielkości, chyba że jest ona geometryczna.
  • Jeśli wartość jest default , system wykorzystuje interpolated kalibrację, jeśli dostępna oś orientacyjna, w przeciwnym razie nie używa none .

Obliczenie

Obliczenie pól orientation i tilt zależy od określonych parametrów kalibracji i dostępnych danych wejściowych.

If touch.tiltX and touch.tiltY are available:
    tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
    tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
    tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
    tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
    output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
    output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
    center = average(raw.orientation.min, raw.orientation.max)
    output.orientation = PI / (raw.orientation.max - raw.orientation.min)
    output.tilt = 0
Else If touch.orientation.calibration == "vector":
    c1 = (raw.orientation & 0xF0) >> 4
    c2 = raw.orientation & 0x0F

    If c1 != 0 or c2 != 0:
        If c1 >= 8 Then c1 = c1 - 16
        If c2 >= 8 Then c2 = c2 - 16
        angle = atan2(c1, c2) / 2
        confidence = sqrt(c1*c1 + c2*c2)

        output.orientation = angle

        If touch.size.calibration == "diameter" or "area":
            scale = 1.0 + confidence / 16
            output.touchMajor *= scale
            output.touchMinor /= scale
            output.toolMajor *= scale
            output.toolMinor /= scale
        End If
    Else
        output.orientation = 0
    End If
    output.tilt = 0
Else
    output.orientation = 0
    output.tilt = 0
End If

If orientation aware:
    If screen rotation is 90 degrees:
        output.orientation = output.orientation - PI / 2
    Else If screen rotation is 270 degrees:
        output.orientation = output.orientation + PI / 2
    End If
End If

pole odległości

Pole distance opisuje odległość między narzędziem a powierzchnią urządzenia dotykowego. Wartość 0,0 oznacza bezpośredni kontakt, a większe wartości wskazują na rosnącą odległość od powierzchni.

Touch.distance.Calibracja

Definicja: touch.distance.calibration = none | scaled | default

Określa rodzaj pomiaru stosowanego przez sterownik dotykowy do zgłoszenia odległości.

  • Jeśli wartość none , odległość jest nieznana, więc jest ustawiona na 0.

  • Jeśli wartość jest scaled , zgłoszona odległość jest mnożona przez współczynnik skali stałej.

  • Jeśli wartość jest default , system wykorzystuje scaled kalibrację, jeśli dostępna oś odległości, w przeciwnym razie nie używa none .

Touch.distance.scale

Definicja: touch.distance.scale = <a nie wymagający liczb zmiennoprzecinkowy>

Określa stały współczynnik skali stosowany w kalibracji.

Wartość domyślna to 1.0 .

Obliczenie

Obliczenie pola distance zależy od określonych parametrów kalibracji.

If touch.distance.calibration == "scaled":
    output.distance = raw.distance * touch.distance.scale
Else
    output.distance = 0
End If

Przykład

# Input device configuration file for a touch screen that supports pressure,
# size and orientation. The pressure and size scale factors were obtained
# by measuring the characteristics of the device itself and deriving
# useful approximations based on the resolution of the touch sensor and the
# display.
#
# Note that these parameters are specific to a particular device model.
# Different parameters need to be used for other devices.

# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1

# Size
# Based on empirical measurements, we estimate the size of the contact
# using size = sqrt(area) * 28 + 0.
touch.size.calibration = area
touch.size.scale = 28
touch.size.bias = 0
touch.size.isSummed = 0

# Pressure
# Driver reports signal strength as pressure.
#
# A normal index finger touch typically registers about 80 signal strength
# units although we don't expect these values to be accurate.
touch.pressure.calibration = amplitude
touch.pressure.scale = 0.0125

# Orientation
touch.orientation.calibration = vector

Uwagi do kompatybilności

Właściwości konfiguracyjne dla urządzeń dotykowych zmieniły się znacznie w Android Ice Cream Sandwich 4.0. Wszystkie pliki konfiguracyjne urządzeń wejściowych dla urządzeń dotykowych muszą zostać zaktualizowane, aby użyć nowych właściwości konfiguracji.

Starsze sterowniki urządzeń dotykowych mogą być również wymagane.

Wirtualne pliki map kluczy

Urządzenia dotykowe są często używane do implementacji kluczy wirtualnych.

Istnieje kilka sposobów na to, w zależności od możliwości kontrolera dotykowego. Niektóre kontrolery dotykowe można bezpośrednio skonfigurować do implementacji klawiszy miękkich poprzez ustawianie rejestrów oprogramowania układowego. Innym razem pożądane jest wykonanie mapowania od współrzędnych dotykowych po kody kluczowe w oprogramowaniu.

Gdy klucze wirtualne są wdrażane w oprogramowaniu, jądro musi wyeksportować wirtualny plik mapy klucza o nazwie virtualkeys.<devicename> jako właściwość planszy. Na przykład, jeśli sterowniki urządzeń dotykowych zgłaszają swoją nazwę jako „Toustyfeely”, plik wirtualnej mapy klucza musi mieć ścieżkę /sys/board_properties/virtualkeys.touchyfeely .

Plik mapy klucza wirtualnego opisuje współrzędne i kody kluczy Linuksa wirtualnych na ekranie dotykowym.

Oprócz pliku mapy klucza wirtualnego musi istnieć odpowiedni plik układu klawisza i plik mapy znaków kluczowych, aby zmapować kody kluczy Linux na kody kluczy Androida i określić typ urządzenia klawiatury (zwykle SPECIAL_FUNCTION ).

Składnia

Wirtualny plik mapy klucza to zwykły plik tekstowy składający się z sekwencji opisów układu wirtualnego klawisza oddzielonego przez nowe linie lub kolonami.

Linie komentarzy zaczynają się od „#” i przechodzą do końca linii.

Każdy klucz wirtualny jest opisany przez 6 komponentów podłączonych do okrężnicy:

  • 0x01 : Kod wersji. Musi zawsze być 0x01 .
  • <Linux Key Code>: Kod klucza Linux klucza wirtualnego.
  • <CenterX>: Współrzędna X Pixel środka klucza wirtualnego.
  • <entery>: Współrzędna piksela w środku klucza wirtualnego.
  • <szerokość>: szerokość klucza wirtualnego w pikselach.
  • <Hight>: Wysokość klucza wirtualnego w pikselach.

Wszystkie współrzędne i rozmiary są określone w kategoriach układu współrzędnych wyświetlania.

Oto wirtualny plik mapy klucza, wszystko zapisane na jednym wierszu.

# All on one line
0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55

Ten sam plik mapy klucza wirtualnego można również zapisać na wielu wierszach.

# One key per line
0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

W powyższym przykładzie ekran dotykowy ma rozdzielczość 480x800. W związku z tym wszystkie klucze wirtualne mają współrzędną <entery> 835, która jest nieco poniżej widocznego obszaru ekranu dotykowego.

Pierwszy klucz ma kod skanowania Linux 158 ( KEY_BACK ), Centerx 55 , centery 835 , szerokość 90 i wysokość 55 .

Przykład

Plik mapy klucza wirtualnego: /sys/board_properties/virtualkeys.touchyfeely .

0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

Kluczowy plik układu: /system/usr/keylayout/touchyfeely.kl .

key 158 BACK
key 139 MENU
key 172 HOME
key 217 SEARCH

Kluczowy plik mapy znaków: /system/usr/keychars/touchyfeely.kcm .

type SPECIAL_FUNCTION

Pośrednie gesty wskaźnika wielokrotnego wskaźnika

W trybie wskaźnika system interpretuje następujące gesty:

  • STAT PIĄTEK: kliknij.
  • Ruch pojedynczy palcem: przesuń wskaźnik.
  • Przycisk ruchu jednego palca Plus naciska: przeciągnij wskaźnik.
  • Dwa palce oba palce poruszające się w tym samym kierunku: przeciągają obszar pod wskaźnikiem w tym kierunku. Sam wskaźnik nie porusza się.
  • Dwa palce oba palce poruszające się w kierunku siebie lub w różnych kierunkach: Skal/skala/obracaj obszar otaczający wskaźnik. Sam wskaźnik nie porusza się.
  • Wiele palców: gest swobodny.

Odrzucenie palmy

Od Androida 13 system może automatycznie odrzucić dane wejściowe z Palms po włączeniu wbudowanej struktury. Wciąż obsługiwane są wewnętrzne, niestandardowe rozwiązania, choć mogą być wymagane modyfikowane, aby zwrócić flagę TOOL_TYPE_PALM po wykryciu dłoni. Wbudowana framework działa również w połączeniu z niestandardowymi rozwiązaniami.

Rzeczywisty model analizuje pierwsze 90 ms danych gestów, na bieżącym wskaźniku i na otaczających wskaźnikach, a następnie rozważa, jak daleko od krawędzi wyświetlacza są dotyk. Następnie określa, na podstawie punktu, który z wskaźników ma dłonie. Uwzględnia również rozmiar każdego kontaktu, jak donosi touchMajor i touchMinor . Framework Android usuwa następnie wskaźniki oznaczone jako dłonie ze strumienia dotykowego.

Jeśli wskaźnik został już wysłany do aplikacji, to system:

  • (Jeśli istnieją inne aktywne wskaźniki) anuluje wskaźnik z zestawem ACTION_POINTER_UP i FLAG_CANCELED .
  • (Jeśli jest to jedyny wskaźnik) anuluje wskaźnik za pomocą ACTION_CANCEL .

Publiczny interfejs API, MotionEvent.FLAG_CANCELED , wskazuje, że bieżące zdarzenie nie powinno wywoływać działania użytkownika. Ta flaga jest ustawiona zarówno dla ACTION_CANCEL , jak i ACTION_POINTER_UP .

Jeśli wskaźnik dłoni nie został wysłany do aplikacji, system po prostu upuszcza wskaźnik.

Włącz odrzucenie dłoni

  1. W sterowniku dotykowym użyj makro input_abs_set_res , aby ustawić rozdzielczości dla następujących pól (jednostki to piksele na mm ):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    Obsługa ABS_MT_TOUCH_MINOR jest opcjonalna. Jeśli jednak urządzenie go obsługuje, upewnij się, że rozdzielczość jest ustawiona poprawnie.

  2. Aby potwierdzić, że pola są ustawione poprawnie, uruchom:
        $ adb shell getevent -li
    
  3. Aby włączyć tę funkcję w czasie wykonywania, uruchom:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Uruchom ponownie proces system_server .
         $ adb shell stop && adb shell start
        
  5. Potwierdź, że adb shell dumpsys input pokazuje, że wewnątrz UnwantedInteractionBlocker insteractionblocker znajdują się odrzuty dłoni. Jeśli nie, sprawdź dzienniki związane z wejściem, aby znaleźć wskazówki na temat tego, co może być źle skonfigurowane.

    Zobacz następujący przykład odniesienia:

    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. Aby na stałe włączyć tę funkcję, dodaj odpowiednie polecenie SYSPROP w swoim pliku init**rc :

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Dalsze czytanie