Urządzenia z ekranami dotykowymi

Android obsługuje różne ekrany dotykowe i touchpady, w tym tablety z digitizerem obsługiwanym za pomocą rysika.

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

Pętle dotykowe to urządzenia dotykowe, które nie są powiązane z ekranem, np. tablety dotykowe. Touchpady są zwykle używane do wskazywania lub sterowania interfejsem za pomocą gestów lub pozycjonowania bezwzględnego.

Urządzenia dotykowe mogą mieć przyciski, których działanie jest podobne do przycisków myszy.

Urządzeniami dotykowymi można czasami sterować za pomocą różnych narzędzi, takich jak palce czy rysik, w zależności od używanej technologii czujnika dotykowego.

Klawisze wirtualne są czasami implementowane na urządzeniach dotykowych. Na przykład na niektórych urządzeniach z Androidem obszar czujnika ekranu dotykowego wykracza poza krawędź wyświetlacza i pełni podwójną funkcję jako część klawiatury dotykowej.

Ze względu na dużą różnorodność urządzeń dotykowych Android korzysta z dużej liczby właściwości konfiguracji, aby opisywać właściwości i pożądane zachowanie poszczególnych urządzeń.

Klasyfikacja urządzeń z ekranem dotykowym

Urządzenie wejściowe jest klasyfikowane jako urządzenie wielodotykowe, jeśli są spełnione oba te warunki:

  • Urządzenie wejściowe zgłasza obecność osi bezwzględnych ABS_MT_POSITION_XABS_MT_POSITION_Y.
  • Urządzenie wejściowe nie ma żadnych przycisków pada do gier. Ten warunek eliminuje niejasność w przypadku niektórych padów do gier, które zgłaszają osie z kodami, które nakładają się na te osie MT.

Urządzenie wejściowe jest klasyfikowane jako urządzenie z jednym dotykiem, jeśli są spełnione oba te warunki:

  • Urządzenie wejściowe nie jest sklasyfikowane jako urządzenie wielodotykowe. Urządzenie wejściowe jest klasyfikowane jako urządzenie jednodotykowe lub urządzenie wielodotykowe, nigdy nie jako jedno i drugie.
  • Urządzenie wejściowe zgłasza obecność osi bezwzględnych ABS_XABS_Y oraz kod klawisza BTN_TOUCH.

Gdy urządzenie wejściowe jest klasyfikowane jako urządzenie dotykowe, obecność klawiszy wirtualnych jest określana przez próbę załadowania pliku mapy klawiszy wirtualnych dla tego urządzenia. Jeśli dostępna jest mapa klawiszy wirtualnych, wczytywane jest też plik z układem klawiszy na urządzeniu. Informacje o lokalizacji i formacie tych plików znajdziesz w sekcji [Pliki mapy klucza wirtualnego](#virtual-key-map-files).

Następnie system wczytuje plik konfiguracji urządzenia wejściowego dla urządzenia dotykowego.

Wszystkie wbudowane urządzenia dotykowe powinny mieć pliki konfiguracji urządzenia wejściowego. Jeśli nie ma pliku konfiguracji urządzenia wejściowego, system wybierze domyślną konfigurację odpowiednią dla urządzeń peryferyjnych dotykowych ogólnego przeznaczenia, takich jak zewnętrzne ekrany dotykowe USB lub Bluetooth HID lub panele dotykowe. Te ustawienia domyślne nie są przeznaczone do wbudowanych ekranów dotykowych i mogą powodować nieprawidłowe działanie.

Po załadowaniu konfiguracji urządzenia wejściowego system zaklasyfikuje urządzenie jako ekran dotykowy, panel dotykowy lub wskaźnik.

  • Ekran dotykowy służy do bezpośredniego manipulowania obiektami na ekranie. Użytkownik dotyka ekranu bezpośrednio, więc system nie wymaga żadnych dodatkowych elementów, które wskazywałyby obiekty podlegające manipulacji.
  • Urządzenie z touchpadem dostarcza aplikacji informacje o dotknięciu danego obszaru czujnika. Może to być przydatne w przypadku tabletów do digitalizacji.
  • Wskaźnik służy do pośredniego manipulowania obiektami na ekranie za pomocą kursora. Palce są interpretowane jako gesty wielodotykowe wskaźnika. Inne narzędzia, takie jak rysiki, są interpretowane na podstawie pozycji bezwzględnych. Więcej informacji znajdziesz w artykule Gesty sterowania pośredniego za pomocą wskaźnika wielodotykowego.

Do klasyfikowania urządzenia wejściowego jako ekranu dotykowego, touchpada lub urządzenia wskazującego służą te reguły.

  • Jeśli właściwość touch.deviceType jest ustawiona, typ urządzenia jest ustawiony zgodnie z wspomnianym.
  • Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej INPUT_PROP_DIRECT (za pomocą ioctl EVIOCGPROP), typ urządzenia jest ustawiany na ekran dotykowy. To założenie zakłada, że urządzenia z dostępem bezpośrednim są podłączone do wyświetlacza, który jest również połączony.
  • Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej INPUT_PROP_POINTER (za pomocą ioctl EVIOCGPROP), typ urządzenia jest ustawiony na wskaźnik.
  • Jeśli urządzenie wejściowe zgłasza obecność osi względnych REL_X lub REL_Y, typ urządzenia jest ustawiany jako panel dotykowy. Ten warunek rozwiązuje niejednoznaczność w przypadku urządzeń wejściowych, które zawierają zarówno mysz, jak i touchpad. W tym przypadku pad dotykowy nie służy do sterowania wskaźnikiem, ponieważ mysz już nim steruje.
  • W przeciwnym razie typ urządzenia jest ustawiony na wskaźnik. Dzięki temu domyślnemu ustawieniu panele dotykowe, które nie mają przypisanego innego specjalnego celu, sterują kursorem.

Przyciski

Przyciski to opcjonalne elementy sterujące, których aplikacje mogą używać do wykonywania dodatkowych funkcji. Przyciski na urządzeniach dotykowych działają podobnie jak przyciski myszy i są używane głównie w przypadku urządzeń dotykowych typu wskaźnik lub rysików.

Obsługiwane są te przyciski:

  • BTN_LEFT: przypisane do MotionEvent.BUTTON_PRIMARY.
  • BTN_RIGHT: przypisane do MotionEvent.BUTTON_SECONDARY.
  • BTN_MIDDLE: przypisane do MotionEvent.BUTTON_MIDDLE.
  • BTN_BACK i BTN_SIDE: mapowano do: MotionEvent.BUTTON_BACK. Naciśnięcie przycisku powoduje też wygenerowanie syntetyzowania klawisza z kodem KeyEvent.KEYCODE_BACK.
  • BTN_FORWARDBTN_EXTRA: zmapowane na MotionEvent.BUTTON_FORWARD. Naciśnięcie klawisza powoduje też wygenerowanie syntetyzowania klawisza z kodem KeyEvent.KEYCODE_FORWARD.
  • BTN_STYLUS: mapowano na: MotionEvent.BUTTON_SECONDARY.
  • BTN_STYLUS2: przypisane do MotionEvent.BUTTON_TERTIARY.

Narzędzia i typy 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.

W innych miejscach w Androidzie, podobnie jak w interfejsie API MotionEvent, narzędzie jest często nazywane wskaźnikiem.

Obsługiwane są te typy narzędzi:

  • BTN_TOOL_FINGERMT_TOOL_FINGER: zmapowane na MotionEvent.TOOL_TYPE_FINGER.
  • BTN_TOOL_PEN i MT_TOOL_PEN: zamapowano na MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_RUBBER: przypisane do MotionEvent.TOOL_TYPE_ERASER.
  • BTN_TOOL_BRUSH: przypisane do MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_PENCIL: przypisane do MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_AIRBRUSH: przypisane do MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_MOUSE: mapowano na: MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_LENS: przypisane do MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP i BTN_TOOL_QUADTAP: zamapowano na MotionEvent.TOOL_TYPE_FINGER.

Nawigowanie kursorem i dotknięcie narzędzi

Narzędzia mogą być w kontaktie z urządzeniem dotykowym lub znajdować się w zasięgu i unosić się nad nim. Nie wszystkie urządzenia dotykowe mogą wykrywać obecność narzędzia unoszonego nad urządzeniem dotykowym. Te, które to umożliwiają, np. urządzenia cyfrowe na podstawie sygnału radiowego, często wykrywają, kiedy narzędzie znajduje się w ograniczonym zasięgu urządzenia cyfrowego.

Komponent InputReader odróżnia narzędzia dotykowe od narzędzi do nawigacji. Podobnie narzędzia dotykowe i wskaźniki są zgłaszane do aplikacji na różne sposoby.

Narzędzia dotykowe są zgłaszane aplikacjom jako zdarzenia dotykowe za pomocą MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWNMotionEvent.ACTION_POINTER_UP.

Narzędzia do nawigacji są zgłaszane aplikacjom jako zdarzenia ruchu za pomocą MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE i MotionEvent.ACTION_HOVER_EXIT.

Wymagania dotyczące sterownika urządzenia dotykowego

  • Sterowniki urządzeń dotykowych powinny rejestrować tylko osie i klucze kodów dla osi oraz przycisków, które obsługują. Rejestrowanie nieobsługiwanych osi lub kodów klawiszy może dezorientować algorytm klasyfikacji urządzenia lub spowodować, że system nieprawidłowo wykryje możliwości urządzenia. Jeśli na przykład urządzenie zgłasza kod klawisza BTN_TOUCH, system zakłada, że BTN_TOUCH jest zawsze używane do wskazywania, czy narzędzie dotyka ekranu. Dlatego nie należy używać BTN_TOUCH, aby wskazać, że narzędzie znajduje się w zakresie i jest tylko najeżdżane.
  • Urządzenia jednodotykowe używają tych zdarzeń wejściowych w systemie Linux:
    • ABS_X: (WYMAGANE) zwraca współrzędną X narzędzia.
    • ABS_Y: (WYMAGANE) podaje współrzędną Y narzędzia.
    • ABS_PRESSURE: (opcjonalnie) podaje siłę fizycznego nacisku wywieranego na końcówkę narzędzia lub siłę sygnału kontaktu dotykowego.
    • ABS_TOOL_WIDTH: (opcjonalnie) zwraca pole przekroju lub szerokość punktu styczności z dotykiem lub samego narzędzia.
    • ABS_DISTANCE: (opcjonalnie) podaje odległość narzędzia od powierzchni urządzenia dotykowego.
    • ABS_TILT_X: (opcjonalnie) zwraca pochylenie narzędzia względem powierzchni urządzenia dotykowego wzdłuż osi X.
    • ABS_TILT_Y: (opcjonalnie) zwraca pochylenie narzędzia względem powierzchni urządzenia dotykowego wzdłuż osi Y.
    • BTN_TOUCH: (WYMAGANE) wskazuje, czy narzędzie dotyka urządzenia.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (opcjonalnie) stany przycisku w raportach.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (opcjonalnie) raportuje typ narzędzia.
  • Urządzenia wielodotykowe używają tych zdarzeń wejściowych w systemie Linux:
    • ABS_MT_POSITION_X: (WYMAGANE) zwraca współrzędną X narzędzia.
    • ABS_MT_POSITION_Y: (WYMAGANE) zwraca współrzędną Y narzędzia.
    • ABS_MT_PRESSURE: (opcjonalnie) podaje siłę fizycznego nacisku wywieranego na końcówkę narzędzia lub siłę sygnału kontaktu dotykowego.
    • ABS_MT_TOUCH_MAJOR: (opcjonalnie) zwraca pole przekroju powierzchni dotykowej lub długość dłuższego wymiaru powierzchni dotykowej.
    • ABS_MT_TOUCH_MINOR: (opcjonalnie) zwraca długość krótszego wymiaru punktu styczności. Nie należy używać tej osi, jeśli funkcja ABS_MT_TOUCH_MAJOR raportuje pomiar obszaru.
    • ABS_MT_WIDTH_MAJOR (opcjonalnie) podaje obszar przekroju poprzecznego samego narzędzia lub długość dłuższego wymiaru samego narzędzia. Nie używaj tej osi, chyba że znasz wymiary samego narzędzia.
    • ABS_MT_WIDTH_MINOR: (opcjonalnie) raportuje długość krótszego wymiaru narzędzia. Nie należy używać tej osi, jeśli ABS_MT_WIDTH_MAJOR podaje pomiar powierzchni lub jeśli wymiary narzędzia są nieznane.
    • ABS_MT_ORIENTATION: (opcjonalnie) podaje orientację narzędzia.
    • ABS_MT_DISTANCE: (opcjonalnie) zwraca 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) zwraca identyfikator śledzenia narzędzia. Identyfikator śledzenia to dowolna nieujemna liczba całkowita, która służy do identyfikowania i śledzenia każdego narzędzia niezależnie, gdy aktywne jest kilka narzędzi. Jeśli na przykład kilka palców dotyka ekranu, każdemu z nich należy przypisać osobny identyfikator śledzenia, który jest używany, dopóki palec pozostaje w kontaktie z urządzeniem. Identyfikatory śledzenia można ponownie użyć, gdy powiązane z nimi narzędzia znajdą się poza zasięgiem.
    • ABS_MT_SLOT: (opcjonalnie) raportuje identyfikator boksu narzędzia, gdy używasz protokołu multi-touch „B” w systemie Linux. Więcej informacji znajdziesz w dokumentacji protokołu Multi-touch w systemie 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) stany przycisku w raportach.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (opcjonalnie) Raportuje typ narzędzia.
  • Jeśli zdefiniowano osie zarówno protokołu pojedynczego dotknięcia, jak i wielotouch, używane są tylko osie tego typu, a osie pojedynczego dotknięcia są ignorowane.
  • Minimalne i maksymalne wartości osi ABS_X, ABS_Y, ABS_MT_POSITION_X i ABS_MT_POSITION_Y określają granice aktywnego obszaru urządzenia w jednostkach powierzchniowych danego urządzenia. Na ekranie dotykowym aktywny obszar opisuje część urządzenia, która faktycznie zasłania wyświetlacz.

    W przypadku ekranu dotykowego system automatycznie interpoluje zgłoszone położenie dotyku w jednostkach powierzchni, aby uzyskać położenie dotyku w pikselach wyświetlacza, zgodnie z tym obliczeniem:

        displayX = (x - minX) * displayWidth / (maxX - minX + 1)
        displayY = (y - minY) * displayHeight / (maxY - minY + 1)
        

    Ekran dotykowy może rejestrować dotknięcia poza obszarem zgłoszonym jako aktywny.

    Dotknięcia rozpoczęte poza obszarem aktywnym nie są przesyłane do aplikacji, ale można ich używać do obsługi klawiszy wirtualnych.

    Dotknięcia rozpoczęte w aktywnej części ekranu lub wchodzące w obszar wyświetlania i z niego wychodzące są przesyłane do aplikacji. W konsekwencji, jeśli dotyk rozpoczyna się w ograniczeniach aplikacji, a potem przenosi się poza aktywny obszar, aplikacja może odbierać zdarzenia dotyku z współrzędnymi wyświetlacza o ujemnych wartościach lub wykraczające poza granice wyświetlacza. Jest to prawidłowe działanie.

    Urządzenie dotykowe nie powinno nigdy ograniczać współrzędnych dotykowych do granic aktywnego obszaru. Jeśli dotyk wykracza poza aktywny obszar, powinien być zgłoszony jako wykraczający poza aktywny obszar lub nie powinien być zgłaszany wcale.

    Jeśli na przykład palec użytkownika dotyka ekranu dotykowego w pobliżu lewego górnego rogu, współrzędne mogą być podawane jako (minX, minY). Jeśli palec będzie się nadal oddalać od aktywnego obszaru, ekran dotykowy powinien zacząć raportować współrzędne z wartościami mniejszymi niż minX i minY, np. (minX – 2, minY – 3), albo całkowicie przestać raportować dotyk. Inaczej mówiąc, ekran dotykowy nie powinien zgłaszać (minX, minY), gdy użytkownik dotyka palcem poza obszarem aktywnym.

    Przycinanie 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, które wchodzą lub wychodzą poza obszar wyświetlacza.

  • Wartości ABS_PRESSURE lub ABS_MT_PRESSURE, jeśli są zgłaszane, muszą być różne od 0, gdy narzędzie dotyka urządzenia, a w przeciwnym razie muszą być równe 0, co oznacza, że narzędzie unosi się nad urządzeniem.

    Raportowanie informacji o ciśnieniu jest opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą używać informacji o ciśnieniu do implementacji rysowania wrażliwego na nacisk i innych efektów.

  • Wartości zgłoszone przez funkcję ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR lub ABS_MT_WIDTH_MINOR powinny być różne, gdy narzędzie dotyka urządzenia, i 0 w przeciwnym razie, ale nie jest to wymagane. Na przykład urządzenie może zmierzyć rozmiar kontaktów dotykowych, a nie rysika.

    Raportowanie informacji o rozmiarze jest opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą używać informacji o ciśnieniu do implementowania rysowania zależnego od rozmiaru i innych efektów.

  • Wartości zwracane przez ABS_DISTANCE lub ABS_MT_DISTANCE powinny zbliżać się do zera, gdy narzędzie dotyka urządzenia. Odległość może być niezerowa nawet wtedy, gdy narzędzie jest w bezpośrednim kontakcie. Dokładne wartości zależą od sposobu pomiaru odległości przez sprzęt.

    Raportowanie informacji o odległości jest opcjonalne, ale zalecane w przypadku urządzeń ze stycznym.

  • Wartości zwracane przez ABS_TILT_XABS_TILT_Y powinny być równe zeru, gdy narzędzie jest prostopadłe do urządzenia. Nachylenie inne niż zero oznacza, że narzędzie jest trzymane pod kątem.

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

    InputReader przekształca komponenty pochylenia X i Y w prostopadłe kąt pochylenia w zakresie od 0 do PI / 2 radianów oraz kąt orientacji w planie w zakresie od -PI do PI radianów. Takie przedstawienie powoduje, że opis orientacji jest zgodny z tym, co jest używane do opisu dotyku palcem.

    Raportowanie informacji o przechyleniu jest opcjonalne, ale zalecane w przypadku urządzeń z rysikiem.

  • Jeśli typ narzędzia jest zgłaszany przez funkcję ABS_MT_TOOL_TYPE, zastępuje wszystkie informacje o typie narzędzia zgłoszone przez funkcję BTN_TOOL_*. Jeśli nie ma żadnych informacji o typie narzędzia, domyślnie jest toMotionEvent.TOOL_TYPE_FINGER.

  • Aktywność narzędzia określana jest na podstawie tych warunków:

    • W przypadku protokołu jednodotykowego narzędzie jest aktywne, jeśli BTN_TOUCH lub BTN_TOOL_* ma wartość 1.

      To założenie zakłada, że InputReader musi mieć co najmniej pewne informacje o charakterze narzędzia, na przykład o tym, czy jest ono dotykane, lub przynajmniej o jego typie. Jeśli nie ma żadnych informacji, narzędzie jest uważane za nieaktywne (poza zakresem).

    • Jeśli używany jest protokół wielodotykowy „A”, narzędzie jest aktywne za każdym razem, gdy pojawia się w najnowszym raporcie synchronizacji. Gdy narzędzie przestanie się pojawiać w raportach synchronizacji, przestanie istnieć.
    • Gdy używasz protokołu wielodotykowego „B”, narzędzie jest aktywne, dopóki ma aktywny slot. Po wyczyszczeniu boksu narzędzie przestaje istnieć.
  • Na podstawie tych warunków określa się, że kursor znajduje się nad elementem:
    • Jeśli narzędzie to BTN_TOOL_MOUSE lub BTN_TOOL_LENS, narzędzie nie wyświetla się po najechaniu kursorem, nawet gdy jest spełniony jeden z tych warunków.
    • Jeśli narzędzie jest aktywne i przekazuje informacje o ciśnieniu, a przekazywany nacisk wynosi 0, oznacza to, że narzędzie unosi się w powietrzu.
    • Jeśli narzędzie jest aktywne i sterownik obsługuje kod klucza BTN_TOUCH, a wartość BTN_TOUCH wynosi 0, oznacza to, że narzędzie jest najeżdżane.
  • InputReader obsługuje protokół wielodotykowy „A” i „B”. Nowe sterowniki powinny używać protokołu „B”, ale oba działają.
  • Od Androida 4.0 sterowniki ekranu dotykowego mogą wymagać zmiany, aby były zgodne ze specyfikacją protokołu wejściowego Linuxa.

    Może być konieczne wprowadzenie tych zmian:

    • Gdy narzędzie stanie się nieaktywne (palec jest „podniesiony”), nie powinno się już pojawiać w kolejnych raportach synchronizacji wielodotykowej. Gdy wszystkie narzędzia są nieaktywne (wszystkie palce są „w górze”), kierowca powinien wysłać pusty pakiet raportu synchronizacji, na przykład SYN_MT_REPORT, a potem SYN_REPORT.

      W poprzednich wersjach Androida zdarzenie „w górę” było zgłaszane przez wysłanie wartości ciśnienia 0. Stare zachowanie było niezgodne ze specyfikacją protokołu wejściowego Linuxa i nie jest już obsługiwane.

    • Informacje o fizycznym nacisku lub sile sygnału należy zgłaszać za pomocą elementu ABS_MT_PRESSURE.

      W poprzednich wersjach Androida informacje o ciśnieniu były pobierane z ABS_MT_TOUCH_MAJOR. Poprzednie działanie było niezgodne ze specyfikacją protokołu wejściowego w systemie Linux i nie jest już obsługiwane.

    • Informacje o rozmiarze dotyku należy zgłaszać za pomocą funkcji ABS_MT_TOUCH_MAJOR.

      W poprzednich wersjach Androida informacje o rozmiarze były pobierane z plików ABS_MT_TOOL_MAJOR. Stare zachowanie było niezgodne ze specyfikacją protokołu wejściowego Linuxa i nie jest już obsługiwane.

    Sterowniki urządzeń dotykowych nie wymagają już dostosowań związanych z Androidem. Dzięki korzystaniu ze standardowego protokołu wejściowego Linuxa Android może obsługiwać więcej urządzeń peryferyjnych z wyświetlaczem dotykowym, takich jak zewnętrzne ekrany dotykowe HID z wielopunktowym interfejsem dotykowym, przy użyciu niezmodyfikowanych sterowników.

Obsługa urządzenia dotykowego

Poniżej znajdziesz krótkie podsumowanie obsługi urządzenia dotykowego na Androidzie.

  1. Funkcja EventHub odczytuje nieprzetworzone zdarzenia ze sterownika evdev.
  2. InputReader pobiera nieprzetworzone zdarzenia i aktualizuje stan wewnętrzny dotyczący pozycji oraz innych właściwości każdego narzędzia. Sprawdza też stany przycisków.
  3. Jeśli naciśniesz lub zwolnisz BACK lub FORWARD, InputReader powiadomi InputDispatcher o kluczowym zdarzeniu.
  4. InputReader określa, czy nastąpiło naciśnięcie wirtualnego klawisza. Jeśli tak, powiadamia InputDispatcher o kluczowym zdarzeniu.
  5. InputReader określa, czy dotknięcie zostało zainicjowane w ramach wyświetlacza. Jeśli tak, wysyła powiadomienie InputDispatcher o zdarzeniu dotknięcia.
  6. Jeśli nie ma narzędzi dotykowych, ale jest co najmniej 1 narzędzie do nawigacji, InputReader powiadamia InputDispatcher o zdarzeniu nawigacji.
  7. Jeśli typem urządzenia dotykowego jest wskaźnik, InputReader wykrywa gesty wskaźnika, przenosi wskaźnik i odpowiednie miejsce i powiadamia InputDispatcher o zdarzeniu wskaźnika.
  8. InputDispatcher używa metody WindowManagerPolicy do określenia, czy zdarzenia powinny zostać wywołane i czy powinny wybudzić urządzenie. Następnie InputDispatcher przekazuje zdarzenia do odpowiednich aplikacji.

Konfiguracja urządzenia dotykowego

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

Więcej informacji o plikach, które uczestniczą w konfiguracji klawiatury, znajdziesz w tych sekcjach:

Właściwości

System korzysta z wielu właściwości konfiguracji urządzenia wejściowego, aby skonfigurować i skalibrować działanie urządzenia dotykowego.

Jednym z powodów jest to, że sterowniki urządzeń dotykowych często raportują właściwości dotyku, używając jednostek specyficznych dla danego urządzenia.

Na przykład wiele urządzeń dotykowych mierzy obszar dotyku, używając wewnętrznej skali urządzenia, takiej jak łączna liczba węzłów czujnika, które zostały wyzwolone przez dotyk. Ta wartość nie ma znaczenia dla aplikacji, ponieważ muszą one znać rozmiar fizyczny i inne cechy węzłów czujników urządzenia dotykowego.

System używa parametrów kalibracji zakodowanych w plikach konfiguracji urządzenia wejściowego do dekodowania, przekształcania i normalizowania wartości zgłaszanych przez urządzenie dotykowe w prostszą standardową reprezentację, którą mogą odczytać aplikacje.

Konwencje w dokumentacji

W dokumentacji używamy podanych niżej konwencji, aby opisać wartości używane przez system podczas procesu kalibracji.

Nieprzetworzone wartości osi

Wyrażenia te oznaczają wartości nieprzetworzone przesyłane 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 albo 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 jest niedostępna.
raw.toolMajor
Wartość osi ABS_TOOL_WIDTH lub ABS_MT_WIDTH_MAJOR albo wartość 0, jeśli jest niedostępna.
raw.toolMinor
Wartość osi ABS_MT_WIDTH_MINOR lub raw.toolMajor, jeśli ta pierwsza jest niedostę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 albo 0, jeśli nie jest dostępna.
raw.tiltX
Wartość osi ABS_TILT_X lub 0, jeśli nie jest dostępna.
raw.tiltY
Wartość osi ABS_TILT_Y lub 0, jeśli jest niedostępna.

Zakresy osi surowych

Wyrażenia te wskazują granice wartości nieprzetworzonych. Można je uzyskać, wywołując ioctl EVIOCGABS dla każdej osi.

raw.*.min
Wartość minimalna osi nieprzetworzonej z uwzględnieniem zakresu.
raw.*.max
Maksymalna wartość osi nieprzetworzonej włącznie.
raw.*.range
Odpowiednik: raw.*.max - raw.*.min.
raw.*.fuzz
Dokładność osi surowej. Np. fuzz = 1 oznacza, że wartości są dokładne do ± 1.
raw.width
Szerokość obszaru dotykowego, która obejmuje raw.x.range + 1.
raw.height
Wysokość obszaru dotykowego, równa raw.y.range + 1.

Zakresy wyjściowe

Wyrażenia poniżej określają właściwości wyjściowego układu współrzędnych. System wykorzystuje interpolację liniową, by przekładać informacje o pozycji dotyku z jednostek powierzchniowych używanych przez urządzenie dotykowe na jednostki wyjściowe przesyłane do aplikacji, takich jak piksele wyświetlacza.

output.width
Szerokość danych wyjściowych. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to szerokość wyświetlacza w pikselach. W przypadku paneli dotykowych (niepowiązanych z ekranem) szerokość wyjściowa jest równa raw.width, co oznacza, że nie jest wykonywana żadna interpolacja.
output.height
Wysokość danych wyjściowych. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to wysokość wyświetlacza w pikselach. W przypadku padów dotykowych (niepowiązanych z wyświetlaczem) wysokość wyjściowa wynosi raw.height, co oznacza, że nie jest wykonywana interpolacja.
output.diag
Długość przekątnej wyjściowego układu współrzędnych, równa sqrt(output.width ^2 + output.height ^2).

Podstawowa konfiguracja

Do określania wartości kalibracji używa wielu właściwości konfiguracyjnych w pliku konfiguracji urządzenia wejściowego. W tabeli poniżej opisano niektóre właściwości konfiguracji ogólnego przeznaczenia. Wszystkie pozostałe właściwości są opisane w następnych sekcjach wraz z pola, których używa się do ich kalibracji.

touch.deviceType

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

Określa typ urządzenia dotykowego.

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

  • Jeśli wartość to touchPad, urządzenie dotykowego jest touchpadem, który nie jest powiązany z wyświetlaczem.

  • Jeśli wartość to pointer, urządzenie dotykowe to panel dotykowy niekojarzony z ekranem, a jego ruchy są używane do bezpośrednich gestów wielodotykowych wskaźnika.

  • Jeśli wartość to default, system automatycznie wykrywa typ urządzenia na podstawie algorytmu klasyfikacji.

Więcej informacji o tym, jak typ urządzenia wpływa na działanie urządzenia dotykowego znajdziesz w sekcji Klasyfikacja.

W Androidzie 3 i starszych wersjach wszystkie urządzenia dotykowe były uznawane za ekrany dotykowe.

touch.orientationAware

Definicja: touch.orientationAware = 0 | 1

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

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

  • Jeśli wartość to 0, pozycje dotyku zgłaszane przez urządzenie dotykowe nie reagują na zmiany orientacji wyświetlacza.

Wartością domyślną jest 1, jeśli urządzenie ma ekran dotykowy, a w przeciwnym razie – 0.

System rozróżnia ekrany dotykowe wewnętrzne i zewnętrzne. Orientacja wewnętrznego ekranu dotykowego jest zależna od orientacji wewnętrznego wyświetlacza. Zewnętrzny ekran dotykowy z uwzględnieniem orientacji jest obracany na podstawie orientacji wyświetlacza zewnętrznego.

Orientacja jest wykorzystywana do obsługi obracania ekranów dotykowych na urządzeniach takich jak Nexus One. Na przykład po obróceniu urządzenia o 90 stopni zgodnie z kierunkiem wskazówek zegara względem jego naturalnej orientacji, bezwzględne pozycje dotyku są przemapowywane w taki sposób, że dotyk w lewym górnym rogu bezwzględnego układu współrzędnych ekranu dotykowego jest rejestrowany jako dotyk w lewym górnym rogu obranego układu współrzędnych wyświetlacza. Dzięki temu dotknięcia są raportowane w tym samym układzie współrzędnych, którego aplikacje używają do wyświetlania elementów wizualnych.

Przed wersją Honeycomb założenie było takie, że wszystkie urządzenia dotykowe są świadome orientacji.

tryb dotykowy

Definicja: touch.gestureMode = pointer | spots | default

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

  • Jeśli wartość to pointer, gesty na panelu dotykowym są wyświetlane za pomocą kursora podobnego do wskaźnika myszy.

  • Jeśli wartość to spots, gesty na panelu dotykowym są reprezentowane przez punkt kotwiczenia, który reprezentuje środek gestu, oraz zestaw punktów okrągłych, które reprezentują położenie poszczególnych palców.

Wartość domyślna to pointer, gdy właściwość wejściowa INPUT_PROP_SEMI_MT jest ustawiona, lub spots w przeciwnym razie.

Pola X i Y

Pola X i Y zawierają informacje o pozycji środka obszaru kontaktu.

Obliczenia

Obliczenie jest proste: informacje o pozycji z sterownika dotykowego są interpolowane liniowo w systemie współrzędnych wyjściowych.

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, wartość narzędziaMajor, NarzędzieMnie, pola rozmiaru

Pola touchMajortouchMinor opisują przybliżone wymiary obszaru styku w jednostkach wyjściowych (pikselach).

Pola toolMajor i toolMinor podają przybliżone wymiary narzędzia w jednostkach wyjściowych (w pikselach).

Pole size opisuje znormalizowany rozmiar dotyku w stosunku do największego możliwego dotyku, jaki może wykryć urządzenie dotykowe. Najmniejszy możliwy znormalizowany rozmiar to 0,0 (brak kontaktu lub niemożliwość pomiaru), a największy możliwy znormalizowany rozmiar to 1,0 (obszar czujnika jest nasycony).

Jeśli można zmierzyć przybliżoną długość i szerokość, pole touchMajor określa dłuższy wymiar, a pole touchMinor krótszy wymiar pola styczności. Jeśli można zmierzyć tylko przybliżony średnicę pola styku, pola touchMajortouchMinor są równe.

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

Jeśli rozmiar dotyku jest niedostępny, ale dostępny jest rozmiar narzędzia, rozmiar narzędzia jest równy rozmiarowi ekranu dotykowego. Jeśli natomiast nie ma dostępnego rozmiaru narzędzia, ale jest dostępny rozmiar dotyku, rozmiar dotyku jest równy rozmiarowi narzędzia.

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

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

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

  • Jeśli wartość to none, rozmiar jest ustawiany na 0.

  • Jeśli wartość to geometric, zakłada się, że rozmiar jest określony w tej samej jednostce powierzchni co pozycja, więc jest skalowana w ten sam sposób.

  • Jeśli wartość to diameter, zakłada się, że rozmiar jest proporcjonalny do średnicy (szerokości) dotyku lub narzędzia.

  • Jeśli wartość to area, przyjmuje się, że rozmiar jest proporcjonalny do obszaru dotyku lub narzędzia.

  • Jeśli wartość to default, system użyje kalibracji geometric, o ile oś raw.touchMajor lub raw.toolMajor jest dostępna. W przeciwnym razie korzysta z kalibracji none.

touch.size.scale

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

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

Wartość domyślna to 1.0.

touch.size.bias

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

Określa stałą wartość przesunięcia 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 też jest raportowany osobno dla każdego kontaktu.

  • Jeśli wartość to 1, zgłoszony rozmiar jest dzielony przez liczbę kontaktów przed użyciem.

  • Jeśli wartością jest 0, podany rozmiar jest używany bez zmian.

Wartość domyślna to 0.

Niektóre urządzenia dotykowe, zwłaszcza urządzenia „Semi-MT”, nie mogą rozróżniać poszczególnych wymiarów wielu kontaktów, więc podają rozmiar, który reprezentuje ich łączną powierzchnię lub szerokość. Ta właściwość powinna być ustawiona na 1 tylko w przypadku takich urządzeń. W razie wątpliwości ustaw tę wartość na 0.

Obliczenia

Obliczanie pól touchMajor, touchMinor, toolMajor, toolMinorsize zależy od określonych parametrów kalibracji.

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

size = avg(touchMajor, touchMinor)

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

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

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

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

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

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

output.size = size

pole ciśnienia

Pole pressure opisuje przybliżony fizyczny nacisk na urządzenie dotykowe jako wartość sformatowaną w zakresie od 0,0 (brak dotyku) do 1,0 (normalny nacisk).

Zerowe ciśnienie oznacza, że narzędzie jest w stanie zawieszenia.

touch.pressure.calibration

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

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

  • Jeśli wartość to none, ciśnienie jest nieznane, więc jest ustawiane na 1,0 podczas dotykania i 0,0 podczas najeżdżania kursorem.

  • Jeśli wartość to physical, przyjmuje się, że oś nacisku mierzy rzeczywistą intensywność nacisku fizycznego na panel dotykowy.

  • Jeśli wartość to amplitude, przyjmuje się, że oś ciśnienia służy do pomiaru amplitudy sygnału, która jest powiązana z wielkością kontaktu i zastosowanego ciśnienia.

  • Jeśli wartość to default, system użyje kalibracji physical, jeśli dostępna jest oś nacisku. W przeciwnym razie użyje wartości none.

dotyk.ciśnienie.skala

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

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

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

Obliczenia

Obliczenie pola pressure zależy od podanych parametrów kalibracji.

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

pola orientacji i przechylenia;

Pole orientation opisuje orientację dotyku i narzędzie jako kąt. Orientacja 0 oznacza, że główna oś jest zorientowana pionowo, -PI/2 oznacza, że główna oś jest zorientowana w lewo, a PI/2 oznacza, że główna oś jest zorientowana w prawo. Gdy używany jest rysik, zakres orientacji można opisać w zakresie pełnego koła od -PI do PI.

Pole tilt określa nachylenie narzędzia jako pomiar kątowy. Kąt 0 wskazuje, że narzędzie jest prostopadłe do powierzchni. Kąt PI/2 oznacza, że narzędzie jest płaskie na powierzchni.

dotyk.orientacja.kalibracja

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

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

  • Jeśli wartość to none, orientacja jest nieznana, więc jest ustawiona na 0.
  • Jeśli wartość to interpolated, orientacja jest interpolowana liniowo, tak aby wartość bezwzględna raw.orientation.min została odwzorowana jako -PI/2, a wartość bezwzględna raw.orientation.max jako PI/2. Wartość środkowa (raw.orientation.min + raw.orientation.max) / 2 jest mapowana na wartość 0.
  • Jeśli wartość to vector, orientacja jest interpretowana jako skompresowany wektor składający się z 2 4-bitowych pól ze znakiem. Ta reprezentacja jest używana w elementach protokołu Atmel Object Based Protocol. Po dekodowaniu wektora uzyskuje się kąt orientacji i poziom ufności. Współczynnik wiarygodności służy do skalowania informacji o rozmiarze, chyba że jest on geometryczny.
  • Jeśli wartość to default, system używa kalibracji interpolated, jeśli oś orientacji jest dostępna, w przeciwnym razie używa none.

Obliczenia

Obliczenie pól orientationtilt zależy od określonych parametrów kalibracji i dostępnego wejścia.

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

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

        output.orientation = angle

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

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

pole „odległość”

Pole distance określa odległość między narzędziem a powierzchnią urządzenia dotykowego. Wartość 0,0 oznacza bezpośredni kontakt, a większe wartości – coraz większą odległość od powierzchni.

touch.distance.calibration

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

Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania odległości.

  • Jeśli wartość to none, odległość jest nieznana, dlatego jest ustawiona na 0.

  • Jeśli wartość to scaled, podana odległość jest mnożona przez stały współczynnik skali.

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

touch.distance.scale

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

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

Wartość domyślna to 1.0.

Obliczenia

Obliczenie pola distance zależy od podanych parametrów kalibracji.

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

Przykład

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

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

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

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

# Orientation
touch.orientation.calibration = vector

Uwagi dotyczące zgodności

Właściwości konfiguracji urządzeń dotykowych zostały znacznie zmienione w Androidzie Ice Cream Sandwich 4.0. Aby używać nowych właściwości konfiguracji, należy zaktualizować wszystkie pliki konfiguracji urządzeń dotykowych.

Konieczne może być też zaktualizowanie sterowników starszych urządzeń dotykowych.

Pliki wirtualnych map klawiszy

Do obsługi klawiszy wirtualnych można używać urządzeń dotykowych.

Można to zrobić na kilka sposobów, w zależności od możliwości kontrolera dotykowego. Niektóre sterowniki dotykowe można skonfigurować bezpośrednio, aby implementowały klawisze dotykowe, ustawiając rejestry oprogramowania układowego. Innym razem wskazane jest zmapowanie ze współrzędnymi dotyku na kody klawiszy w oprogramowaniu.

Gdy w oprogramowaniu są zaimplementowane klucze wirtualne, jądro musi wyeksportować jako właściwość tablicy plik mapy kluczy wirtualnych o nazwie virtualkeys.<devicename>. Jeśli na przykład sterowniki urządzenia z ekranem dotykowym podają nazwę „touchyfeely”, to plik mapy klawiszy wirtualnych musi mieć ścieżkę/sys/board_properties/virtualkeys.touchyfeely.

Plik mapy klawiszy wirtualnych zawiera opis współrzędnych i kodów klawiszy Linuxa dla klawiszy wirtualnych na ekranie dotykowym.

Oprócz pliku mapy klawiszy wirtualnych musisz mieć odpowiedni plik układu klawiszy i plik mapy znaków klawiszy, aby mapować kody klawiszy Linux na kody klawiszy Androida oraz określić typ urządzenia klawiatury (zwykle SPECIAL_FUNCTION).

Składnia

Plik mapy kluczy wirtualnych to zwykły plik tekstowy zawierający sekwencję opisów układu klucza wirtualnego, oddzielonych znakami końca wiersza lub dwukropkami.

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

Każdy klucz wirtualny jest opisany przez 6 komponentów rozdzielonych dwukropkiem:

  • 0x01: kod wersji. Wymagana jest zawsze wartość 0x01.
  • <Linux key code>: kod klucza Linuksa dla klucza wirtualnego.
  • <centerX>: współrzędna X środka klucza wirtualnego.
  • <centerY>: współrzędna Y środka klawisza wirtualnego.
  • <width>: szerokość klucza wirtualnego w pikselach.
  • <height>: wysokość klucza wirtualnego w pikselach.

Wszystkie współrzędne i rozmiary są określone w systemie współrzędnych wyświetlacza.

Oto plik mapy klucza wirtualnego zapisany w jednym wierszu.

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

Ten sam plik mapy klucza wirtualnego może też być zapisany na kilku wierszach.

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

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

Pierwszy klucz ma kod skanowania Linuxa 158 (KEY_BACK), współrzędną centerX 55, współrzędną 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

Plik układu klawiszy: /system/usr/keylayout/touchyfeely.kl.

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

Plik mapy kluczowych znaków: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

Gesty pośrednie z użyciem wskaźnika wielodotykowego

W trybie wskaźnika system interpretuje te gesty:

  • Kliknięcie 1 palcem: kliknięcie.
  • Ruch 1 palcem: przesuń wskaźnik.
  • Ruch jednym palcem plus naciśnięcia przycisku: przeciągnij wskaźnik.
  • Ruch dwoma palcami poruszającymi się w tym samym kierunku: przeciągnij w tym kierunku obszar pod wskaźnikiem pod wskaźnikiem. Sam wskaźnik się nie porusza.
  • Ruch 2 palcami zbliżającymi się do siebie lub oddalającymi się od siebie w różne strony: przesuwanie, powiększanie lub obracanie obszaru wokół wskaźnika. Sam wskaźnik się nie porusza.
  • Ruch wieloma palcami: gest swobodny.

Odrzucenie palmy

Od Androida 13 system może automatycznie odrzucać dane wejściowe z dłoni, gdy wbudowany framework jest włączony. Wciąż obsługiwane są rozwiązania niestandardowe, które zostały opracowane wewnętrznie, ale może być konieczne ich zmodyfikowanie, aby zwracały flagę TOOL_TYPE_PALM, gdy wykryto dłoń. Wbudowana platforma działa też w połączeniu z rozwiązaniami niestandardowymi.

Rzeczywisty model analizuje pierwsze 90 ms danych dotyczących gestów, bieżący wskaźnik oraz wskaźniki otaczające, a następnie sprawdza, jak daleko od krawędzi wyświetlacza znajdują się dotykowe punkty. Następnie określa, które z wskaźników są dłońmi. Uwzględnia ona też rozmiar każdego kontaktu, jak podają wymiary touchMajortouchMinor. Następnie framework Androida usuwa z potoku dotyku wskaźniki oznaczone jako dłonie.

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

  • (jeśli są inne aktywne wskaźniki) anuluje wskaźnik z ustawionymi wartościami ACTION_POINTER_UPFLAG_CANCELED.
  • (jeśli jest to jedyny wskaźnik) anuluje wskaźnik za pomocą ACTION_CANCEL.

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

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

Włączanie odrzucania dłoni

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

    Obsługa ABS_MT_TOUCH_MINOR jest opcjonalna. Jeśli jednak Twoje urządzenie obsługuje tę funkcję, sprawdź, czy rozdzielczość jest ustawiona prawidłowo.

  2. Aby sprawdzić, czy pola są prawidłowo ustawione, uruchom polecenie:
        $ adb shell getevent -li
    
  3. Aby włączyć tę funkcję w czasie działania, uruchom:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Ponownie uruchom proces system_server.
         $ adb shell stop && adb shell start
        
  5. Sprawdź, czy adb shell dumpsys input pokazuje, że w UnwantedInteractionBlocker są odrzucacze dotykowe. Jeśli tak się nie stanie, sprawdź dzienniki związane z danymi wejściowymi, aby znaleźć wskazówki dotyczące możliwej nieprawidłowej konfiguracji.

    Przykład:

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

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Więcej materiałów