Urządzenia z ekranami dotykowymi

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

Ekrany dotykowe to urządzenia dotykowe powiązane z wyświetlaczem, dzięki czemu użytkownik ma wrażenie, że bezpośrednio manipuluje elementami na ekranie.

Touchpady to urządzenia dotykowe, które nie są powiązane z wyświetlaczem, np. tablet graficzny. Touchpady są zwykle używane do wskazywania lub do bezwzględnego pośredniego pozycjonowania albo sterowania interfejsem użytkownika za pomocą gestów.

Urządzenia dotykowe mogą mieć przyciski o funkcjach podobnych do przycisków myszy.

Urządzenia dotykowe można czasami obsługiwać 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 klawiszy wirtualnych. Na przykład w przypadku niektórych urządzeń 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 wielu właściwości konfiguracyjnych, aby opisać charakterystykę i pożądane działanie każdego urządzenia.

Klasyfikacja urządzeń z ekranem dotykowym

Urządzenie wejściowe jest klasyfikowane jako urządzenie wielodotykowe, jeśli spełnia 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 przycisków gamepada. Ten warunek rozwiązuje niejednoznaczność w przypadku niektórych gamepadów, które zgłaszają osie z kodami pokrywającymi się z kodami osi MT.

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

  • Urządzenie wejściowe nie jest klasyfikowane jako urządzenie wielodotykowe. Urządzenie wejściowe jest klasyfikowane jako urządzenie obsługujące 1 lub wiele punktów dotyku, ale nigdy jako oba rodzaje.
  • Urządzenie wejściowe zgłasza obecność osi bezwzględnych ABS_XABS_Y oraz kodu klucza BTN_TOUCH.

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

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

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

Po wczytaniu konfiguracji urządzenia wejściowego system klasyfikuje je jako ekran dotykowy, touchpad lub wskaźnik.

  • Urządzenie z ekranem dotykowym 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 wskazujących obiekty, którymi się posługuje.
  • Touchpad służy do przekazywania aplikacji informacji o bezwzględnym położeniu dotknięć w danym obszarze czujnika. Może być przydatne w przypadku tabletów z digitizerem.
  • 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 na podstawie pozycji bezwzględnych. Więcej informacji znajdziesz w sekcji Gesty wskaźnika wielodotykowego pośredniego.

Do klasyfikowania urządzenia wejściowego jako ekranu dotykowego, touchpada lub urządzenia wskazującego stosuje się te reguły:

  • Jeśli właściwość touch.deviceType jest ustawiona, typ urządzenia jest ustawiany zgodnie z wskazaniem.
  • 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. Ten warunek zakłada, że urządzenia wejściowe z bezpośrednim dotykiem są podłączone do wyświetlacza, który również jest 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 pointer.
  • Jeśli urządzenie wejściowe zgłasza obecność osi względnych REL_X lub REL_Y, typ urządzenia jest ustawiany na touch pad (touchpad). Ten warunek rozwiązuje problem z niejednoznacznością w przypadku urządzeń wejściowych, które składają się zarówno z myszy, jak i z touchpada. W tym przypadku panel dotykowy nie służy do sterowania wskaźnikiem, ponieważ jest on już sterowany przez mysz.
  • W przeciwnym razie typ urządzenia jest ustawiony na wskaźnik. Domyślne ustawienie zapewnia, że touchpady, które nie mają żadnego innego specjalnego przeznaczenia, sterują wskaźnikiem.

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ą przydatne głównie w przypadku urządzeń dotykowych typu wskaźnik lub rysika.

Obsługiwane są te przyciski:

  • BTN_LEFT: zmapowano na MotionEvent.BUTTON_PRIMARY.
  • BTN_RIGHT: zmapowano na MotionEvent.BUTTON_SECONDARY.
  • BTN_MIDDLE: zmapowano na MotionEvent.BUTTON_MIDDLE.
  • BTN_BACKBTN_SIDE: zmapowane na MotionEvent.BUTTON_BACK. Naciśnięcie tego przycisku powoduje również wygenerowanie naciśnięcia klawisza z kodem klawisza KeyEvent.KEYCODE_BACK.
  • BTN_FORWARDBTN_EXTRA: zmapowane na MotionEvent.BUTTON_FORWARD. Naciśnięcie tego przycisku powoduje również wygenerowanie naciśnięcia klawisza z kodem KeyEvent.KEYCODE_FORWARD.
  • BTN_STYLUS: zmapowano na MotionEvent.BUTTON_SECONDARY.
  • BTN_STYLUS2: zmapowano na MotionEvent.BUTTON_TERTIARY.

Narzędzia i ich rodzaje

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

W innych miejscach w Androidzie, np. w interfejsie MotionEvent API, 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_PENMT_TOOL_PEN: zmapowane na MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_RUBBER: zmapowano na MotionEvent.TOOL_TYPE_ERASER.
  • BTN_TOOL_BRUSH: zmapowano na MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_PENCIL: zmapowano na MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_AIRBRUSH: zmapowano na MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_MOUSE: zmapowano na MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_LENS: zmapowano na MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP i BTN_TOOL_QUADTAP: przypisane do MotionEvent.TOOL_TYPE_FINGER.

Narzędzia do najeżdżania kursorem a narzędzia dotykowe

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ą wykrywać obecność narzędzia unoszącego się nad urządzeniem dotykowym. Niektóre z nich, np. digitizery z rysikiem działające na częstotliwości radiowej, mogą wykrywać, kiedy narzędzie znajduje się w ograniczonym zasięgu digitizera.

Komponent InputReader odróżnia narzędzia dotykowe od narzędzi, które działają w trybie zawieszenia. Podobnie narzędzia dotykowe i narzędzia do najeżdżania są zgłaszane aplikacjom na różne sposoby.

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

Narzędzia do najeżdżania są zgłaszane aplikacjom jako ogólne zdarzenia ruchu za pomocą funkcji MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVEMotionEvent.ACTION_HOVER_EXIT.

Wymagania dotyczące sterowników urządzeń dotykowych

  • Sterowniki urządzeń dotykowych powinny rejestrować tylko osie i kody klawiszy dla osi i przycisków, które obsługują. Rejestrowanie nieobsługiwanych osi lub kodów klawiszy może wprowadzić w błąd algorytm klasyfikacji urządzenia lub spowodować nieprawidłowe wykrycie przez system możliwości urządzenia. Jeśli na przykład urządzenie zgłasza kod klucza BTN_TOUCH, system zakłada, że BTN_TOUCH jest zawsze używany do wskazywania, czy narzędzie dotyka ekranu. Dlatego symbol BTN_TOUCH nie powinien być używany do oznaczania, że narzędzie znajduje się w zakresie i jest w trybie zawieszenia.
  • Urządzenia obsługujące 1 punkt dotyku korzystają z tych zdarzeń wejściowych systemu Linux:
    • ABS_X: (WYMAGANE) Zgłasza współrzędną X narzędzia.
    • ABS_Y: (WYMAGANE) Zgłasza współrzędną Y narzędzia.
    • ABS_PRESSURE: (opcjonalnie) raportuje fizyczny nacisk wywierany na końcówkę narzędzia lub siłę sygnału kontaktu dotykowego.
    • ABS_TOOL_WIDTH: (opcjonalnie) podaje pole przekroju lub szerokość kontaktu dotykowego lub samego narzędzia.
    • ABS_DISTANCE: (opcjonalnie) podaje odległość narzędzia od powierzchni urządzenia dotykowego.
    • ABS_TILT_X: (opcjonalnie) zgłasza odchylenie narzędzia od powierzchni urządzenia dotykowego wzdłuż osi X.
    • ABS_TILT_Y: (opcjonalnie) zgłasza odchylenie narzędzia od powierzchni urządzenia dotykowego wzdłuż osi Y.
    • BTN_TOUCH: (WYMAGANE) Określa, 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) Stan przycisku raportó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 używają tych zdarzeń wejściowych systemu Linux:
    • ABS_MT_POSITION_X: (WYMAGANE) Zgłasza współrzędną X narzędzia.
    • ABS_MT_POSITION_Y: (WYMAGANE) Zgłasza współrzędną Y narzędzia.
    • ABS_MT_PRESSURE: (opcjonalnie) raportuje fizyczny nacisk wywierany na końcówkę 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: (opcjonalny) podaje długość krótszego wymiaru kontaktu dotykowego. Tej osi nie należy używać, jeśli ABS_MT_TOUCH_MAJOR raportuje pomiar obszaru.
    • ABS_MT_WIDTH_MAJOR: (opcjonalnie) podaje pole przekroju narzędzia lub długość dłuższego wymiaru narzędzia. Nie używaj tej osi, chyba że znasz wymiary samego narzędzia.
    • ABS_MT_WIDTH_MINOR: (opcjonalnie) podaje długość krótszego wymiaru samego narzędzia. Nie należy używać tej osi, jeśli ABS_MT_WIDTH_MAJOR podaje pomiar powierzchni lub jeśli wymiary samego narzędzia są nieznane.
    • 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) zgłasza typ narzędzia jako MT_TOOL_FINGER lub MT_TOOL_PEN.
    • ABS_MT_TRACKING_ID: (opcjonalnie) podaje identyfikator śledzenia narzędzia. Identyfikator śledzenia to dowolna nieujemna liczba całkowita, która służy do identyfikowania i śledzenia każdego narzędzia z osobna, gdy jest aktywnych kilka narzędzi. Na przykład, gdy urządzenie jest dotykane przez kilka palców, każdy z nich powinien mieć przypisany odrębny identyfikator śledzenia, który jest używany, dopóki palec pozostaje w kontakcie z urządzeniem. Identyfikatory śledzenia można ponownie wykorzystać, gdy powiązane z nimi narzędzia znajdą się poza zasięgiem.
    • ABS_MT_SLOT: (opcjonalnie) zgłasza identyfikator gniazda narzędzia podczas korzystania z protokołu wielodotykowego „B” w systemie Linux. Więcej informacji znajdziesz w dokumentacji protokołu wielodotykowego w systemie Linux.
    • BTN_TOUCH: (WYMAGANE) Określa, 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) Stan przycisku raportó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) Zwraca typ narzędzia.
  • Jeśli zdefiniowano osie dla protokołu pojedynczego i wielu dotknięć, używane są tylko osie wielodotykowe, a osie pojedynczego dotknięcia są ignorowane.
  • Wartości minimalne i maksymalne osi ABS_X, ABS_Y, ABS_MT_POSITION_XABS_MT_POSITION_Y określają granice aktywnego obszaru urządzenia w jednostkach powierzchniowych specyficznych dla urządzenia. W przypadku ekranu dotykowego obszar aktywny opisuje część urządzenia dotykowego, która faktycznie pokrywa wyświetlacz.

    W przypadku ekranu dotykowego system automatycznie interpoluje zgłoszone pozycje dotknięcia w jednostkach powierzchni, aby uzyskać pozycje dotknięcia 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 zgłoszonym aktywnym obszarem.

    Dotknięcia rozpoczęte poza obszarem aktywnym nie są przekazywane do aplikacji, ale mogą być używane w przypadku klawiszy wirtualnych.

    Dotknięcia, które są inicjowane w obszarze aktywnym lub które wchodzą i wychodzą z obszaru wyświetlania, są przekazywane do aplikacji. Jeśli dotyk rozpocznie się w obszarze aplikacji, a następnie przesunie się 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 prawidłowe działanie.

    Urządzenie dotykowe nigdy nie powinno ograniczać współrzędnych dotyku do granic aktywnego obszaru. Jeśli dotyk opuści aktywny obszar, należy zgłosić, że znajduje się poza nim, lub w ogóle nie zgłaszać tego zdarzenia.

    Jeśli na przykład palec użytkownika dotyka lewego górnego rogu ekranu dotykowego, może to zgłosić współrzędne (minX, minY). Jeśli palec nadal będzie się przesuwać poza obszar aktywny, ekran dotykowy powinien zacząć zgłaszać współrzędne o składowych mniejszych niż minX i minY, np. (minX – 2, minY – 3), lub całkowicie przestać zgłaszać dotyk. Innymi słowy, ekran dotykowy nie powinien zgłaszać (minX, minY), gdy palec użytkownika dotyka obszaru poza aktywnym obszarem.

    Przyciąganie współrzędnych dotyku 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 poza obszar wyświetlania.

  • Wartości zgłaszane przez ABS_PRESSURE lub ABS_MT_PRESSURE, jeśli są w ogóle zgłaszane, muszą być niezerowe, gdy narzędzie dotyka urządzenia, a zerowe w pozostałych przypadkach, aby wskazywać, że narzędzie jest zawieszone.

    Raportowanie informacji o ciśnieniu jest opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą używać informacji o nacisku do implementowania rysowania z wykorzystaniem siły nacisku 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, a w pozostałych przypadkach powinny wynosić zero, ale nie jest to wymagane. Na przykład urządzenie dotykowe może mierzyć rozmiar kontaktu palca, ale nie rysika.

    Podawanie informacji o rozmiarze jest opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą wykorzystywać informacje o nacisku do rysowania z uwzględnieniem rozmiaru 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 być różna od zera, nawet gdy narzędzie ma bezpośredni kontakt z powierzchnią. Dokładne zgłaszane wartości zależą od sposobu, w jaki sprzęt mierzy odległość.

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

  • Wartości zgłaszane przez ABS_TILT_XABS_TILT_Y powinny wynosić zero, gdy narzędzie jest prostopadłe do urządzenia. Niezerowe nachylenie oznacza, że narzędzie jest trzymane pod kątem.

    Kąty pochylenia wzdłuż osi X i Y są podawane w stopniach odchylenia od prostopadłości. Punkt środkowy (idealnie prostopadły) jest określany przez wartość (max + min) / 2 dla każdej osi. Wartości mniejsze niż punkt środkowy oznaczają pochylenie w górę lub w lewo, a wartości większe niż punkt środkowy oznaczają pochylenie w dół lub w prawo.

    InputReader przekształca składowe nachylenia X i Y na kąt nachylenia prostopadłego w zakresie od 0 do PI / 2 radianów oraz kąt orientacji płaszczyzny w zakresie od -PI do PI radianów. W wyniku tego powstaje opis orientacji zgodny z opisem dotknięć palcem.

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

  • Jeśli typ narzędzia jest zgłaszany przez ABS_MT_TOOL_TYPE, zastępuje on wszelkie informacje o typie narzędzia zgłaszane przez BTN_TOOL_*. Jeśli informacje o typie narzędzia są niedostępne, domyślnie jest to MotionEvent.TOOL_TYPE_FINGER.

  • Narzędzie jest uznawane za aktywne, jeśli spełnione są te warunki:

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

      Ten warunek oznacza, że InputReader musi mieć co najmniej pewne informacje o charakterze narzędzia, np. czy dotyka ono powierzchni, lub przynajmniej jego typ. Jeśli nie ma dostępnych informacji, narzędzie jest uznawane za nieaktywne (poza zasięgiem).

    • W przypadku korzystania z protokołu wielodotykowego „A” narzędzie jest aktywne, gdy pojawia się w ostatnim raporcie synchronizacji. Gdy narzędzie przestanie się pojawiać w raportach synchronizacji, przestanie istnieć.
    • W przypadku korzystania z protokołu wielodotykowego „B” narzędzie jest aktywne, dopóki ma aktywne miejsce. Gdy miejsce zostanie zwolnione, narzędzie przestaje istnieć.
  • Narzędzie jest uznawane za zawieszone na podstawie tych warunków:
    • Jeśli narzędzie jest w stanie BTN_TOOL_MOUSE lub BTN_TOOL_LENS, nie jest zawieszone, nawet jeśli spełniony jest jeden z tych warunków:
    • Jeśli narzędzie jest aktywne, a sterownik zgłasza informacje o nacisku i zgłoszony nacisk wynosi zero, narzędzie jest zawieszone.
    • Jeśli narzędzie jest aktywne, a sterownik obsługuje kod klucza BTN_TOUCH i wartość BTN_TOUCH wynosi zero, narzędzie jest zawieszone.
  • InputReader obsługuje protokoły wielodotykowe „A” i „B”. Nowi kierowcy powinni 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ścia w systemie Linux.

    Może być konieczne wprowadzenie tych zmian:

    • Gdy narzędzie stanie się nieaktywne (palec zostanie podniesiony), nie powinno się już pojawiać w kolejnych raportach synchronizacji wielodotykowej. Gdy wszystkie narzędzia staną się nieaktywne (wszystkie palce będą „w górze”), sterownik powinien wysłać pusty pakiet raportu synchronizacji, np. SYN_MT_REPORT, a potem SYN_REPORT.

      W poprzednich wersjach Androida zdarzenia „up” były raportowane przez wysyłanie wartości ciśnienia 0. Stare działanie było niezgodne ze specyfikacją protokołu wejściowego systemu Linux i nie jest już obsługiwane.

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

      W starszych wersjach Androida informacje o ciśnieniu były pobierane z ABS_MT_TOUCH_MAJOR. Stare działanie 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ą parametru ABS_MT_TOUCH_MAJOR.

      Wcześniejsze wersje Androida pobierały informacje o rozmiarze z ABS_MT_TOOL_MAJOR. Stare działanie 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ń do Androida. Dzięki standardowemu protokołowi wejściowemu systemu Linux Android może obsługiwać szerszą gamę urządzeń dotykowych, takich jak zewnętrzne ekrany dotykowe HID z funkcją multi-touch, przy użyciu niezmodyfikowanych sterowników.

Obsługa urządzenia dotykowego

Poniżej znajdziesz krótkie podsumowanie obsługi urządzeń dotykowych na Androidzie.

  1. EventHub odczytuje surowe zdarzenia z evdev sterownika.
  2. InputReader przetwarza nieprzetworzone zdarzenia i aktualizuje wewnętrzny stan dotyczący położenia i innych cech każdego narzędzia. Śledzi też stany przycisków.
  3. Jeśli naciśnięto lub zwolniono przycisk WSTECZ lub DALEJ, InputReader powiadamia InputDispatcher o kluczowym zdarzeniu.
  4. InputReader określa, czy naciśnięto klawisz wirtualny. Jeśli tak, wysyła do InputDispatcher powiadomienie o kluczowym zdarzeniu.
  5. InputReader określa, czy dotknięcie zostało zainicjowane w obrębie wyświetlacza. Jeśli tak, powiadamia InputDispatcher o zdarzeniu dotyku.
  6. Jeśli nie ma narzędzi dotykowych, ale jest co najmniej 1 narzędzie do najeżdżania, InputReader powiadamia InputDispatcher o zdarzeniu najechania.
  7. Jeśli typ urządzenia dotykowego to wskaźnik, InputReader wykrywa gesty wskaźnika, przesuwa wskaźnik i odpowiednio go umieszcza oraz powiadamia InputDispatcher o zdarzeniu wskaźnika.
  8. InputDispatcher używa WindowManagerPolicy, aby określić, czy zdarzenia mają być wysyłane i czy mają wybudzać urządzenie. Następnie InputDispatcher dostarcza zdarzenia do odpowiednich aplikacji.

Konfiguracja urządzenia dotykowego

Zachowanie urządzenia dotykowego jest określane przez osie, przyciski, właściwości wejściowe, konfigurację urządzenia wejściowego, mapę klawiszy wirtualnych i układ klawiszy.

Więcej informacji o plikach, które biorą udział 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ą charakterystykę dotknięć za pomocą jednostek specyficznych dla urządzenia.

Wiele urządzeń dotykowych mierzy na przykład obszar kontaktu dotykowego za pomocą wewnętrznej skali specyficznej dla urządzenia, np. łącznej liczby węzłów czujnika, które zostały aktywowane przez dotyk. Ta surowa wartość rozmiaru nie byłaby przydatna dla aplikacji, ponieważ musiałyby one znać fizyczny rozmiar i inne cechy węzłów czujnika urządzenia dotykowego.

System używa parametrów kalibracji zakodowanych w plikach konfiguracyjnych urządzenia wejściowego do dekodowania, przekształcania i normalizowania wartości zgłaszanych przez urządzenie dotykowe w prostsze standardowe reprezentacje, które mogą być interpretowane przez aplikacje.

Konwencje dokumentacji

Na potrzeby dokumentacji używamy tych konwencji do opisywania wartości używanych przez system podczas procesu kalibracji.

Wartości osi surowej

Poniższe wyrażenia oznaczają surowe 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 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 nie jest dostępna.
raw.toolMajor
Wartość osi ABS_TOOL_WIDTH lub ABS_MT_WIDTH_MAJOR albo 0, jeśli nie jest dostępna.
raw.toolMinor
Wartość osi ABS_MT_WIDTH_MINOR lub raw.toolMajor, jeśli nie jest dostępna.
raw.orientation
Wartość osi ABS_MT_ORIENTATION lub 0, jeśli nie jest dostępna.
raw.distance
Wartość osi ABS_DISTANCE lub ABS_MT_DISTANCE 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 nie jest dostępna.

Zakresy osi surowych

Poniższe wyrażenia oznaczają granice wartości surowych. Są one uzyskiwane przez wywołanie EVIOCGABS ioctl dla każdej osi.

raw.*.min
Minimalna wartość osi surowej (włącznie).
raw.*.max
Maksymalna wartość osi pierwotnej (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 z dokładnością do +/- 1 jednostki.
raw.width
Szerokość obszaru dotykowego (włącznie z wartościami granicznymi), równa raw.x.range + 1.
raw.height
Wysokość obszaru dotykowego, która obejmuje wszystkie elementy, równa raw.y.range + 1.

Zakresy wyjściowe

Poniższe wyrażenia oznaczają charakterystykę wyjściowego układu współrzędnych. System używa interpolacji liniowej do przekształcania informacji o pozycji dotyku z jednostek powierzchni używanych przez urządzenie dotykowe na jednostki wyjściowe, które są zgłaszane aplikacjom, np. 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 wyświetlaczem) szerokość wyjściowa jest równa raw.width, co oznacza, że nie jest przeprowadzana ż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 paneli dotykowych (niepowiązanych z wyświetlaczem) wysokość wyjściowa wynosi raw.height, co oznacza, że nie jest przeprowadzana interpolacja.
output.diag
Długość przekątnej wyjściowego układu współrzędnych, równa sqrt(output.width ^2 + output.height ^2).

Podstawowa konfiguracja

Mapowanie danych wejściowych dotykowych korzysta z wielu właściwości konfiguracji w pliku konfiguracji urządzenia wejściowego, aby określić wartości kalibracji. W tabeli poniżej opisano niektóre właściwości konfiguracji ogólnego przeznaczenia. Wszystkie pozostałe właściwości zostały opisane w kolejnych sekcjach wraz z polami, do których kalibracji są używane.

touch.deviceType

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

Określa typ urządzenia dotykowego.

  • Jeśli wartość to touchScreen, urządzenie dotykowe jest ekranem dotykowym powiązanym z wyświetlaczem.

  • Jeśli wartość to touchPad, urządzenie dotykowe jest touchpadem niepowiązanym z wyświetlaczem.

  • Jeśli wartość to pointer, urządzenie dotykowe jest trackpadem niepowiązanym z wyświetlaczem, a jego ruchy są używane do pośrednich gestów wskaźnika wielodotykowego.

  • Jeśli wartość to default, system automatycznie wykrywa typ urządzenia zgodnie z algorytmem klasyfikacji.

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

W Androidzie 3 i starszych wersjach wszystkie urządzenia dotykowe były traktowane jako 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ść wynosi 1, pozycje dotyku zgłaszane przez urządzenie dotykowe są obracane za każdym razem, gdy zmienia się orientacja wyświetlacza.

  • Jeśli wartość to 0, pozycje dotyku zgłaszane przez urządzenie dotykowe są odporne 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 wewnętrzne i zewnętrzne ekrany dotykowe i wyświetlacze. Wewnętrzny ekran dotykowy z czujnikiem orientacji jest obracany w zależności od orientacji wyświetlacza wewnętrznego. Zewnętrzny ekran dotykowy z funkcją wykrywania orientacji jest obracany w zależności od orientacji wyświetlacza zewnętrznego.

Wykrywanie orientacji jest używane do obsługi obracania ekranów dotykowych na urządzeniach takich jak Nexus One. Na przykład, gdy urządzenie zostanie obrócone o 90 stopni w prawo względem naturalnej orientacji, bezwzględne położenia dotknięć zostaną ponownie przypisane tak, aby dotknięcie w lewym górnym rogu bezwzględnego układu współrzędnych ekranu dotykowego było zgłaszane jako dotknięcie w lewym górnym rogu obróconego układu współrzędnych wyświetlacza. Dzięki temu dotknięcia są zgłaszane w tym samym układzie współrzędnych, którego aplikacje używają do rysowania elementów wizualnych.

Przed Honeycomb wszystkie urządzenia dotykowe były uważane za urządzenia z czujnikiem orientacji.

touch.gestureMode

Definicja: touch.gestureMode = pointer | spots | default

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

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

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

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

Pola X i Y

Pola X i Y zawierają informacje o położeniu środka obszaru kontaktu.

Obliczenia

Obliczenia są proste: informacje o położeniu z sterownika dotykowego są interpolowane liniowo do układu 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

pola touchMajor, touchMinor, toolMajor, toolMinor, size

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

Pola toolMajortoolMinor określają przybliżone wymiary samego narzędzia w jednostkach wyjściowych (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 rozmiar znormalizowany to 0,0 (brak kontaktu lub jest on niemożliwy do zmierzenia), a największy możliwy rozmiar znormalizowany to 1,0 (obszar czujnika jest nasycony).

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

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

Jeśli rozmiar dotyku jest niedostępny, ale rozmiar narzędzia jest dostępny, rozmiar narzędzia jest ustawiany na równy rozmiarowi dotyku. Jeśli rozmiar narzędzia jest niedostępny, ale rozmiar dotyku jest dostępny, rozmiar dotyku jest ustawiany na rozmiar narzędzia.

Urządzenia dotykowe mierzą i raportują rozmiar dotyku oraz rozmiar narzędzia na różne sposoby. Obecna implementacja obsługuje 3 rodzaje pomiarów: średnicę, powierzchnię i geometryczne pole ograniczające w jednostkach powierzchni.

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

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

  • Jeśli wartość wynosi none, rozmiar jest ustawiony na 0.

  • Jeśli wartość to geometric, przyjmuje się, że rozmiar jest podany w tych samych jednostkach powierzchni co pozycja, więc jest skalowany w ten sam sposób.

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

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

  • Jeśli wartość to default, system używa kalibracji geometric, jeśli dostępne są osie raw.touchMajor lub raw.toolMajor. W przeciwnym razie używa kalibracji none.

touch.size.scale

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

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

Wartość domyślna to 1.0.

touch.size.bias

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

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

Wartość domyślna to 0.0.

touch.size.isSummed

Definicja: touch.size.isSummed = 0 | 1

Określa, czy rozmiar jest raportowany jako suma rozmiarów wszystkich aktywnych kontaktów, czy osobno dla każdego kontaktu.

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

  • Jeśli wartość to 0, zgłoszony rozmiar jest używany w takiej postaci, w jakiej został podany.

Wartość domyślna to 0.

Niektóre urządzenia dotykowe, zwłaszcza urządzenia „Semi-MT”, nie potrafią rozróżnić poszczególnych wymiarów wielu punktów dotyku, więc podają pomiar rozmiaru, który reprezentuje ich całkowitą powierzchnię lub szerokość. W przypadku takich urządzeń ta właściwość powinna mieć wartość 1. W razie wątpliwości ustaw tę wartość na 0.

Obliczenia

Obliczenie wartości 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 nacisk fizyczny wywierany na urządzenie dotykowe jako znormalizowaną wartość z zakresu od 0,0 (brak dotyku) do 1,0 (normalny nacisk).

Wartość 0 oznacza, że narzędzie jest zawieszone.

touch.pressure.calibration

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

Określa rodzaj pomiaru używanego przez sterownik dotykowy do raportowania nacisku.

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

  • Jeśli wartość to physical, oś nacisku jest uznawana za pomiar rzeczywistej fizycznej intensywności nacisku wywieranego na panel dotykowy.

  • Jeśli wartość to amplitude, przyjmuje się, że oś nacisku mierzy amplitudę sygnału, która jest związana z rozmiarem kontaktu i przyłożonym naciskiem.

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

touch.pressure.scale

Definicja: touch.pressure.scale = <nieujemna 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 określonych parametrów kalibracji.

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

pola orientacji i przechylenia,

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

Pole tilt opisuje nachylenie narzędzia jako pomiar kątowy. Pochylenie o 0 oznacza, że narzędzie jest prostopadłe do powierzchni. Nachylenie PI/2 oznacza, że narzędzie leży płasko na powierzchni.

touch.orientation.calibration

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

Określa rodzaj pomiaru używanego 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 surowa wartość raw.orientation.min odpowiadała wartości -PI/2, a surowa wartość raw.orientation.max – wartości PI/2. Wartość środkowa (raw.orientation.min + raw.orientation.max) / 2 odpowiada wartości 0.
  • Jeśli wartość to vector, orientacja jest interpretowana jako spakowany wektor składający się z 2 pól 4-bitowych ze znakiem. Ta reprezentacja jest używana w przypadku komponentów opartych na protokole Atmel Object Based Protocol. Po zdekodowaniu wektor daje kąt orientacji i wartość ufności. Wartość ufności służy do skalowania informacji o rozmiarze, chyba że jest to rozmiar geometryczny.
  • Jeśli wartość to default, system używa kalibracji interpolated, jeśli dostępna jest oś orientacji, w przeciwnym razie używa kalibracji none.

Obliczenia

Obliczenia w polach orientationtilt zależą od określonych parametrów kalibracji i dostępnych danych wejściowych.

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

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

        output.orientation = angle

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

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

pole odległoś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.calibration

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

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

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

  • Jeśli wartość to scaled, zgłoszona 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 kalibracji none.

touch.distance.scale

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

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

Wartość domyślna to 1.0.

Obliczenia

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 dotyczące zgodności

W Androidzie Ice Cream Sandwich 4.0 znacznie zmieniono właściwości konfiguracji urządzeń dotykowych. Wszystkie pliki konfiguracji urządzeń wejściowych dla urządzeń dotykowych muszą zostać zaktualizowane, aby korzystać z nowych właściwości konfiguracji.

Może być też konieczna aktualizacja sterowników starszych urządzeń dotykowych.

Pliki mapy klawiszy wirtualnych

Urządzenia dotykowe mogą być używane do implementowania klawiszy wirtualnych.

Można to zrobić na kilka sposobów, w zależności od możliwości kontrolera dotykowego. Niektóre kontrolery dotykowe można skonfigurować bezpośrednio do implementacji klawiszy programowych, ustawiając rejestry oprogramowania sprzętowego. W innych przypadkach mapowanie współrzędnych dotyku na kody klawiszy jest korzystne w przypadku oprogramowania.

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

Plik mapy klawiszy wirtualnych zawiera współrzędne i kody klawiszy wirtualnych w systemie Linux na ekranie dotykowym.

Oprócz pliku mapy klawiszy wirtualnych musi istnieć odpowiedni plik układu klawiszy i plik mapy znaków klawiszy, aby zmapować kody klawiszy systemu Linux na kody klawiszy systemu Android i określić typ urządzenia klawiatury (zwykle SPECIAL_FUNCTION).

Składnia

Plik wirtualnej mapy klawiszy to zwykły plik tekstowy zawierający sekwencję opisów układu klawiszy wirtualnych rozdzielonych znakami nowego wiersza lub dwukropkami.

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

Każdy klucz wirtualny jest opisany za pomocą 6 komponentów oddzielonych dwukropkiem:

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

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

Oto plik mapy klawiszy wirtualnych 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 mapowania klawiszy wirtualnych można też zapisać w 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 powyższym przykładzie ekran dotykowy ma rozdzielczość 480 x 800. Wszystkie wirtualne klawisze mają współrzędną <centerY> równą 835, czyli znajdują się nieco poniżej widocznego obszaru ekranu dotykowego.

Pierwszy klawisz ma kod skanowania w systemie Linux 158 (KEY_BACK), współrzędną centerX 55, współrzędną centerY 835, szerokość 90 i wysokość 55.

Przykład

Plik mapy klawiszy wirtualnych: /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 klawiatury: /system/usr/keylayout/touchyfeely.kl.

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

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

type SPECIAL_FUNCTION

Gesty wskaźnika wielodotykowego pośredniego

W trybie wskaźnika system interpretuje te gesty:

  • Kliknięcie 1 palcem: kliknięcie.
  • Ruch jednym palcem: przesuń wskaźnik.
  • Ruch jednym palcem i naciśnięcie przycisków: przeciągnij wskaźnik.
  • Ruch dwoma palcami w tym samym kierunku: przeciągnij obszar pod wskaźnikiem w tym kierunku. Sam wskaźnik się nie porusza.
  • Ruch dwoma palcami – oba palce poruszają się w różnych kierunkach, zbliżając się do siebie lub oddalając od siebie: przesuwanie/skalowanie/obracanie obszaru wokół wskaźnika. Sam wskaźnik się nie porusza.
  • Ruch wieloma palcami: gest odręczny.

Odrzucanie dłoni

Od Androida 13 system może automatycznie odrzucać dane wejściowe pochodzące z dłoni, gdy wbudowana platforma jest włączona. Rozwiązania wewnętrzne i niestandardowe są nadal obsługiwane, ale mogą wymagać modyfikacji, aby zwracać flagę TOOL_TYPE_PALM po wykryciu dłoni. Wbudowana platforma działa też w połączeniu z rozwiązaniami niestandardowymi.

Rzeczywisty model analizuje pierwsze 90 ms danych gestów, bieżący wskaźnik i otaczające go wskaźniki, a następnie sprawdza, jak daleko od krawędzi wyświetlacza znajdują się dotknięcia. Następnie określa, które z nich są dłońmi. Uwzględnia też rozmiar każdego kontaktu podany przez touchMajortouchMinor. Framework Androida usuwa następnie z potoku dotykowego 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.

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 w przypadku 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 funkcji wykrywania dłoni

  1. W sterowniku ekranu dotykowego użyj input_abs_set_res makra, aby ustawić rozdzielczości w tych polach (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 obsługuje tę funkcję, upewnij się, że rozdzielczość jest ustawiona prawidłowo.

  2. Aby sprawdzić, czy pola są prawidłowo skonfigurowane, uruchom polecenie:
        $ adb shell getevent -li
    
  3. Aby włączyć tę funkcję w czasie działania programu, uruchom to polecenie:
        $ 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. Sprawdź, czy w sekcji adb shell dumpsys input widać, że w UnwantedInteractionBlocker znajdują się elementy zapobiegające przypadkowemu dotknięciu ekranu. Jeśli tak nie jest, sprawdź logi związane z danymi wejściowymi, aby znaleźć wskazówki dotyczące tego, co może być nieprawidłowo skonfigurowane.

    Przyjrzyj się temu przykładowi:

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

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Więcej materiałów