Urządzenia z ekranami dotykowymi

Android obsługuje różne ekrany dotykowe i pady dotykowe, w tym tablety digitizera z rysikiem.

Ekrany dotykowe to urządzenia dotykowe powiązane z wyświetlaczem. użytkownicy mają wrażenie, że bezpośrednio manipulowają elementami na ekranie.

touchpady to urządzenia dotykowe niepowiązane z wyświetlaczem (np. z digitizerem. Touchpady są zwykle używane do wskazywania bez pośredniego pozycjonowania lub sterowania za pomocą gestów.

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

Urządzeniami dotykowymi można czasami obsługiwać za pomocą różnych narzędzi np. palcami lub rysikiem w zależności od technologii czujnika dotykowego.

Czasami do obsługi klawiszy wirtualnych używane są urządzenia dotykowe. Na przykład na stronie niektórych urządzeń z Androidem obszar czujnika ekranu dotykowego wykracza poza krawędź jako część dotykową klawiatury.

Ze względu na dużą różnorodność urządzeń dotykowych Android opiera się na dużej liczbie właściwości konfiguracji opisujące cechy i oczekiwane działanie każdego urządzenia.

Klasyfikacja urządzenia dotykowego

Urządzenie wejściowe jest klasyfikowane jako urządzenie z obsługą wielodotykową, jeśli: spełnione są następujące warunki:

  • Urządzenie wejściowe zgłasza obecność elementów ABS_MT_POSITION_X i Osie bezwzględne: ABS_MT_POSITION_Y.
  • Urządzenie wejściowe nie ma żadnych przycisków pada do gier. Ten warunek rozwiązuje problem z określonymi padami do gier, które zgłaszają osie z kodami; który nakłada się na osie MT.

Urządzenie wejściowe jest klasyfikowane jako urządzenie jednokrotnego dotknięcia, jeśli spełnione są następujące warunki:

  • Urządzenie wejściowe nie jest sklasyfikowane jako urządzenie wielodotykowe. Urządzenie wejściowe jest klasyfikowana jako urządzenie wielodotykowe lub wielodotykowe, ani jedno, i drugie.
  • Urządzenie wejściowe zgłasza obecność wartości bezwzględnych ABS_X i ABS_Y i obecności kodu klucza BTN_TOUCH.

Jeśli urządzenie wejściowe jest sklasyfikowane jako urządzenie dotykowe, obecność kluczy wirtualnych jest określana podczas próby wczytania pliku wirtualnej mapy kluczy dla danego urządzenia. Jeśli dostępna jest wirtualna mapa klawiszy, z urządzenia. Zapoznaj się z [plikami mapy kluczy wirtualnych](#virtual-key-map-files) .

Następnie system wczytuje plik konfiguracji urządzenia dotykowego.

Wszystkie wbudowane urządzenia dotykowe powinny mieć wejściowe pliki konfiguracji urządzenia. Jeśli nie ma wejściowego pliku konfiguracji urządzenia, system wybiera domyślną konfigurację, odpowiednią do ogólnego przeznaczenia. dotykowe urządzenia peryferyjne, takie jak zewnętrzne ekrany dotykowe USB lub Bluetooth HID lub touchpada. Nie są przeznaczone do wbudowanych ekranów dotykowych, może spowodować nieprawidłowe działanie.

Po wczytaniu konfiguracji urządzenia wejściowego system klasyfikuje urządzenie wejściowe jako ekran dotykowy, touchpada lub urządzenie wskaźnikowe.

  • Urządzenie z ekranem dotykowym służy do bezpośredniego manipulacji obiektami na ekranu. Użytkownik dotyka ekranu bezpośrednio, dzięki czemu system wymaga dodatkowych afordancji, aby wskazać obiekty, które są zmanipulowane.
  • Urządzenie z touchpadem dostarcza absolutnych informacji o pozycjonowaniu. w aplikacji dotyczącej dotknięć danego obszaru czujnika. Przydatne informacje dla tabletów digitizer.
  • Urządzenie wskaźnikowe służy do pośredniego manipulowania obiektami na za pomocą kursora. Palce są interpretowane jako wskaźnik wielodotykowy gestami. Inne narzędzia, takie jak rysiki, są interpretowane przy użyciu pozycji bezwzględnych. Zobacz Wskaźnik pośredniej wielodotyku gestów, by dowiedzieć się więcej.

Do klasyfikowania urządzenia wejściowego jako ekranu dotykowego służą te reguły: touchpada lub wskaźnika.

  • Jeśli właściwość touch.deviceType jest skonfigurowana, typ urządzenia to ustawiony zgodnie ze wskazówkami.
  • Jeśli urządzenie wejściowe zgłasza obecność elementu INPUT_PROP_DIRECT właściwość wejściową (za pomocą funkcji ioctl EVIOCGPROP), typ urządzenia to Ustaw ekran dotykowy. Ten warunek zakłada, że dotyk bezpośredniego wprowadzania danych a urządzenia są podłączone do wyświetlacza, który również jest podłączony.
  • Jeśli urządzenie wejściowe zgłasza obecność elementu INPUT_PROP_POINTER właściwość wejściową (za pomocą funkcji ioctl EVIOCGPROP), a następnie typ urządzenia. ustaw na pointer.
  • Jeśli urządzenie wejściowe zgłasza obecność elementu REL_X lub REL_Y względnych, typ urządzenia zostanie ustawiony na touchpad. Ten warunek niejednoznaczne w przypadku urządzeń wejściowych, które składają się z myszy na touchpadzie. W tym przypadku pad dotykowy nie służy do sterowania wskaźnik, bo mysz już nim steruje.
  • W przeciwnym razie typ urządzenia jest ustawiony na wskaźnik. To ustawienie domyślne zapewnia które nie służą do żadnych innych zastosowań specjalnych. sterować wskaźnikiem.

Przyciski

Przyciski to opcjonalne ustawienia, których mogą używać aplikacje. z dodatkowymi funkcjami. Przyciski na urządzeniach dotykowych działają podobnie jak mysz są używane głównie w przypadku urządzeń dotykowych z wskaźnikiem oraz rysik.

Obsługiwane są te przyciski:

  • BTN_LEFT: mapowano na: MotionEvent.BUTTON_PRIMARY.
  • BTN_RIGHT: mapowano na: MotionEvent.BUTTON_SECONDARY.
  • BTN_MIDDLE: mapowano na: MotionEvent.BUTTON_MIDDLE.
  • BTN_BACK i BTN_SIDE: mapowano do: MotionEvent.BUTTON_BACK. Naciśnięcie tego przycisku powoduje też syntetyzowanie naciśnięcia klawisza z kodem klawisza. KeyEvent.KEYCODE_BACK
  • BTN_FORWARD i BTN_EXTRA: mapowano na MotionEvent.BUTTON_FORWARD Naciśnięcie tego przycisku powoduje też wygenerowanie syntetyzowania klawisza z kodem klucza KeyEvent.KEYCODE_FORWARD.
  • BTN_STYLUS: mapowano na: MotionEvent.BUTTON_SECONDARY.
  • BTN_STYLUS2: mapowano na: MotionEvent.BUTTON_TERTIARY.

Narzędzia i ich typy

Narzędzie to palec, rysik lub inne urządzenie służące do interakcji z nim. urządzenia dotykowego. Niektóre urządzenia dotykowe rozróżniają różnych typów narzędzi.

W innych miejscach na Androidzie, np. w interfejsie API MotionEvent, narzędzie jest często nazywane jako wskaźnik.

Obsługiwane są te typy narzędzi:

  • BTN_TOOL_FINGER i MT_TOOL_FINGER: mapowano na MotionEvent.TOOL_TYPE_FINGER
  • BTN_TOOL_PEN i MT_TOOL_PEN: mapowano na MotionEvent.TOOL_TYPE_STYLUS
  • BTN_TOOL_RUBBER: mapowano na: MotionEvent.TOOL_TYPE_ERASER.
  • BTN_TOOL_BRUSH: mapowano na: MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_PENCIL: mapowano na: MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_AIRBRUSH: mapowano na: MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_MOUSE: mapowano na: MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_LENS: mapowano na: MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP i BTN_TOOL_QUADTAP: mapowano na: MotionEvent.TOOL_TYPE_FINGER.

Narzędzia dotykowe i najeżdżanie kursorem

Narzędzia mogą mieć kontakt z urządzeniem dotykowym lub znajdować się w zasięgu i najeżdżać kursorem nad nim. Nie wszystkie urządzenia dotykowe wykrywają obecność narzędzia najeżdżając nad urządzeniem dotykowym. Funkcje obsługiwane, takie jak cyfrowe cyfrowy rysiki oparte na częstotliwości radiowej, często wykrywają, czy narzędzie znajduje się w ograniczonym zasięgu digitizera.

Komponent InputReader odróżnia narzędzia dotykowe od najeżdżania kursorem narzędzi. Analogicznie aplikacje dotykają narzędzi do dotykania i najeżdżania kursorem. na różne sposoby.

Narzędzia do dotknięcia są raportowane aplikacjom jako zdarzenia dotknięcia za pomocą: MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN i MotionEvent.ACTION_POINTER_UP.

Narzędzia do najeżdżania kursorem są raportowane w aplikacjach jako ogólne zdarzenia ruchu przez 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 kody klawiszy dla osi i obsługiwanych przycisków. Rejestrowanie nieobsługiwanych osi lub kodów kluczy może zmylić algorytm klasyfikacji urządzeń lub spowodować nieprawidłowe działanie systemu wykryć możliwości urządzenia. Jeśli na przykład urządzenie zgłasza BTN_TOUCH – kod klucza, system zakłada, że pole BTN_TOUCH jest zawsze używane do wskazywania, czy narzędzie jest dotykając ekranu. Dlatego atrybutu BTN_TOUCH nie należy używać do wskazywania że narzędzie znajduje się tylko w zasięgu i porusza się.
  • Urządzenia z pojedynczym dotknięciem używają tych zdarzeń wejściowych w systemie Linux:
    • ABS_X: (WYMAGANE) przekazuje 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 napiwek. lub siłę sygnału kontaktu dotykowego.
    • ABS_TOOL_WIDTH: (opcjonalnie) raportuje obszar przekroju lub szerokość do kontaktu dotykowego lub samego narzędzia.
    • ABS_DISTANCE: (opcjonalnie) podaje odległość narzędzia od powierzchni. urządzenia dotykowego.
    • ABS_TILT_X: (opcjonalnie) raportuje przechylenie narzędzia od powierzchni urządzenia dotykowego na osi X.
    • ABS_TILT_Y: (opcjonalnie) raportuje przechylenie narzędzia od powierzchni urządzenia dotykowego wzdłuż osi Y.
    • BTN_TOUCH: (WYMAGANE) wskazuje, czy narzędzie dotyka urządzenia.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (opcjonalnie) Stany 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: (optional) Raportuje typ narzędzia.
  • Urządzenia z obsługą wielu dotyku używają tych zdarzeń wejściowych w systemie Linux:
    • ABS_MT_POSITION_X: (WYMAGANE) przekazuje współrzędną X narzędzia.
    • ABS_MT_POSITION_Y: (WYMAGANE) podaje współrzędną Y narzędzia.
    • ABS_MT_PRESSURE: (opcjonalnie) raportuje nacisk fizyczny wywierany na miejsce końcówką narzędzia lub siłę sygnału kontaktu dotykowego.
    • ABS_MT_TOUCH_MAJOR: (opcjonalnie) raportuje pole przekroju poprzecznego kontaktu dotykowego, czyli jego dłuższego wymiaru.
    • ABS_MT_TOUCH_MINOR: (opcjonalnie) raportuje długość krótszego wymiaru. od kontaktu dotykowego. Tej osi nie należy używać, jeśli ABS_MT_TOUCH_MAJOR to raport pomiaru obszaru.
    • ABS_MT_WIDTH_MAJOR: (opcjonalnie) raportuje pole przekroju poprzecznego 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. samego narzędzia. Nie należy używać tej osi, jeśli funkcja ABS_MT_WIDTH_MAJOR generuje raporty. pomiaru obszaru lub gdy 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 tool type, 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 śledzić je niezależnie, gdy aktywnych jest wiele narzędzi. Przykład: gdy kilka palców dotyka urządzenia, każdy z nich powinien mieć przypisany identyfikatora śledzenia, który jest używany, gdy palec pozostaje w kontakcie. Identyfikatory śledzenia można ponownie wykorzystać, gdy powiązane z nimi narzędzia stają się poza zasięgiem.
    • ABS_MT_SLOT: (opcjonalnie) raportuje identyfikator boksu narzędzia, gdy używasz parametru Protokół „B” w systemie Linux. Zapoznaj się z dokumentacją protokołu Multi-touch w Linuksie .
    • 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 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: (optional) Raportuje typ narzędzia.
  • Jeśli osie są zdefiniowane zarówno dla protokołu pojedynczego punktu kontaktu, jak i dla protokołu wielodotykowego, używane są tylko osie wielodotykowe, a osie pojedynczego dotknięcia są ignorowane.
  • Minimalne i maksymalne wartości ABS_X, ABS_Y, ABS_MT_POSITION_X, a osie ABS_MT_POSITION_Y wyznaczają granice aktywnego obszaru urządzenia w jednostkach powierzchniowych poszczególnych urządzeń. W przypadku ekranu dotykowego aktywny obszar opisuje część urządzenia dotykowego, która faktycznie zasłania wyświetlacz.

    W przypadku ekranu dotykowego system automatycznie interpoluje zgłoszony dotyk położenie w jednostkach powierzchni w celu uzyskania pozycji dotyku w pikselach wyświetlacza zgodnie z w następujący sposób:

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

    Ekran dotykowy może zgłosić dotknięcia poza zgłoszonym obszarem aktywnym.

    Dotknięcia wykonywane poza aktywnym obszarem nie są wyświetlane w aplikacjach ale można go używać w przypadku kluczy wirtualnych.

    Dotknięcia inicjowane w aktywnym obszarze lub otwierające i zamykające ekran do aplikacji. Jeśli zatem dotknięcie rozpoczyna się w obrębie aplikacji, a następnie wychodzi poza aktywny obszar, może odbierać zdarzenia dotyku ze współrzędnymi, które są ujemne lub wykraczające poza wartość od granic wyświetlacza. To prawidłowy proces.

    Urządzenie dotykowe nigdy nie powinno ograniczać współrzędnych dotyku do granic aktywnej w pobliżu. Jeśli dotknięcie opuszcza obszar aktywny, powinien zostać zgłoszony jako będący poza obszarem aktywny obszar aktywności lub w ogóle go nie zgłaszać.

    Jeśli na przykład użytkownik dotknie palcem lewego górnego rogu ekranu ekranu dotykowego, może zostać zgłoszona współrzędna następujących wymiarów: (minX, minY). Jeśli palec będzie się powtarzał przed wyjściem poza aktywny obszar, ekran dotykowy powinien raportowania współrzędnych z komponentami mniejszymi niż minX i minY, np. (minX – 2, minY – 3) lub powinien całkowicie przestać zgłaszać dotyk. Inaczej mówiąc, ekran dotykowy nie powinien podawać wartości (minX, minY). gdy palec użytkownika dotyka poza obszar aktywny.

    Dociśnięcie współrzędnych dotyku do krawędzi wyświetlacza powoduje utworzenie sztucznego granicę wokół krawędzi ekranu, która uniemożliwia systemowi płynnie śledzić ruchy rozpoczynające się od granic obszaru wyświetlania.

  • Wartości zgłaszane przez funkcję ABS_PRESSURE lub ABS_MT_PRESSURE, jeśli nie są zgłaszane, musi mieć wartość różną od zera, gdy narzędzie dotyka urządzenia i 0, aby wskazać, że narzędzie je zatrzymuje.

    Informacje o częstotliwości raportowania są opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą korzystać z informacji o ciśnieniu, aby zaimplementować rysowanie wrażliwe na nacisk i innych efektów.

  • Wartości raportowane przez: ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR lub Wartość ABS_MT_WIDTH_MINOR powinna być różna od zera, gdy narzędzie jest dotknięty urządzeniem i 0 w innym przypadku, ale nie jest to wymagane. Na przykład urządzenie dotykowe może być w stanie zmierzyć rozmiar palca użytkownika. kontakty, ale nie rysikiem kliknij kontakty.

    Informacje o rozmiarze raportowania są opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą korzystać z informacji o ciśnieniu, aby zaimplementować rysowanie z uwzględnieniem rozmiaru i innych efektów.

  • Wartości raportowane przez funkcję ABS_DISTANCE lub ABS_MT_DISTANCE powinny gdy narzędzie dotyka urządzenia, zbliża się do zera. Odległość może być różna od zera nawet w bezpośrednim kontakcie z narzędziem. Dokładne raportowane wartości zależą w sposób, w jaki sprzęt mierzy odległość.

    Raportowanie informacji o odległości jest opcjonalne, ale zalecane w przypadku: rysikach.

  • Wartości ABS_TILT_X i ABS_TILT_Y powinny wynosić zero gdy narzędzie jest prostopadłe do urządzenia. Pochylenie różne od zera oznacza, że narzędzie jest trzymane ku pochyłości.

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

    InputReader przekształca komponenty przechylenia X i Y w prostokątną kąt nachylenia w zakresie od 0 do PI / 2 w radianach i kąt płaskiego układu z zakresu od -PI do PI radianów. Rezultatem jest opis orientacji zgodny z tym, co jest używane do opisu dotknięć palców.

    Raportowanie informacji o pochyleniu jest opcjonalne, ale zalecane w przypadku rysików.

  • Jeśli typ narzędzia jest raportowany przez ABS_MT_TOOL_TYPE, zastępuje wszystkie narzędzia – typ informacji zgłoszonych przez: BTN_TOOL_*. Jeśli w ogóle nie są dostępne żadne informacje o typie narzędzia, domyślnym typem narzędzia jest MotionEvent.TOOL_TYPE_FINGER

  • Narzędzie jest określane jako aktywne na podstawie tych warunków:

    • W przypadku korzystania z protokołu jednokrotnego dotknięcia narzędzie jest aktywne, jeśli BTN_TOUCH, lub BTN_TOOL_* to 1.

      Ten warunek oznacza, że InputReader musi mieć co najmniej niektóre informacji na temat charakteru narzędzia – czy jest ono dotykane, a przynajmniej typ narzędzia. Jeśli nie ma dostępnych informacji, Narzędzie jest uznawane za nieaktywne (poza zakresem).

    • W przypadku protokołu wielodotykowego „A” narzędzie jest aktywne za każdym razem, jest widoczny w ostatnim raporcie synchronizacji. Gdy narzędzie przestaje być wyświetlane synchronizacji, przestaje istnieć.
    • W przypadku korzystania z protokołu wielodotykowego „B” narzędzie jest aktywne, dopóki ma aktywny przedział czasu. Po wyczyszczeniu boksu narzędzie przestaje istnieć.
  • Działanie narzędzia zostaje określone jako najechanie kursorem na podstawie tych warunków:
    • Jeśli narzędziem jest BTN_TOOL_MOUSE lub BTN_TOOL_LENS, nie jest zatrzymywany, nawet jeśli spełniony jest którykolwiek z tych warunków.
    • Jeśli narzędzie jest aktywne, a kierowca przekazuje informacje o ciśnieniu, i raportowane ciśnienie wynosi zero, to narzędzie się unosi.
    • Jeśli narzędzie jest aktywne, a sterownik obsługuje kod klucza BTN_TOUCH i BTN_TOUCH ma wartość zero, to znaczy, że narzędzie się znajduje.
  • InputReader obsługuje zarówno protokół wielodotykowy „A” i „B”. Nowi kierowcy należy użyć funkcji „B” ale oba te rozwiązania działają.
  • W Androidzie 4.0 może być konieczna zmiana sterowników ekranu dotykowego pod kątem zgodności ze specyfikacją protokołu wejściowego systemu Linux.

    Może być wymagane wprowadzenie tych zmian:

    • Gdy narzędzie stanie się nieaktywne (palec „w górę”), nie powinno być widoczne. w kolejnych raportach Gdy wszystkie narzędzia staną się nieaktywne (wszystkie palce są w górę), sterownik powinien wysłać pusty pakiet raportu o synchronizacji na przykład SYN_MT_REPORT, a następnie SYN_REPORT.

      Poprzednie wersje Androida oczekiwały „aktualizacji” zdarzenia, które mają być raportowane wartość ciśnienia wynosząca 0. Stare działanie było niezgodne z Specyfikacja protokołu wejściowego systemu Linux i nie jest już obsługiwana.

    • Informacje o ciśnieniu fizycznym lub sile sygnału należy zgłaszać za pomocą: ABS_MT_PRESSURE

      Poprzednie wersje Androida pobierały informacje o ciśnieniu od ABS_MT_TOUCH_MAJOR. Stare działanie było niezgodne z Specyfikacja protokołu wejściowego systemu Linux i nie jest już obsługiwana.

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

      Poprzednie wersje Androida pobierały informacje o rozmiarze z: ABS_MT_TOOL_MAJOR Stare działanie było niezgodne z Specyfikacja protokołu wejściowego systemu Linux i nie jest już obsługiwana.

    . Sterowniki urządzeń dotykowych nie wymagają już dostosowań typowych dla Androida. Korzystając ze standardowego protokołu wejściowego Linuksa, Android może obsługiwać szerszą gamę urządzeń dotykowych, takich jak zewnętrzny wielodotyk HID ekranów dotykowych przy użyciu niezmodyfikowanych sterowników.

Obsługa urządzenia dotykowego

Poniżej znajduje się krótkie podsumowanie działania urządzenia dotykowego z Androidem.

  1. Funkcja EventHub odczytuje nieprzetworzone zdarzenia ze sterownika evdev.
  2. Funkcja InputReader przetwarza nieprzetworzone zdarzenia i aktualizuje stan wewnętrzny dotyczący położenie i inne cechy każdego narzędzia. Śledzi również stanów przycisku.
  3. Jeśli naciśniesz lub zwolnisz przycisk BACK lub FORWARD, InputReader powiadamia aplikację InputDispatcher o kluczowym zdarzeniu.
  4. InputReader określa, czy naciśnięto klawisz wirtualny. Jeśli tak, powiadamia o kluczowym zdarzeniu InputDispatcher.
  5. InputReader określa, czy dotyk zostało zainicjowane w od granic wyświetlacza. Jeśli tak, InputDispatcher będzie otrzymywać powiadomienia o zdarzenie dotknięcia.
  6. Jeśli nie ma żadnych narzędzi dotyku, ale jest co najmniej jedno narzędzie do najeżdżania kursorem, InputReader powiadamia użytkownika InputDispatcher o zdarzeniu najechania kursorem.
  7. Jeśli typem urządzenia dotykowego jest wskaźnik, InputReader wykonuje wskaźnik wykrywanie gestów, odpowiednio przesuwa wskaźnik i punkt oraz powiadamia InputDispatcher o zdarzeniu wskaźnika.
  8. Funkcja InputDispatcher używa WindowManagerPolicy, aby określić, czy oraz czy mają wybudzić urządzenie. Następnie InputDispatcher dostarcza zdarzenia do odpowiednich aplikacji.

Konfiguracja urządzenia dotykowego

Działanie urządzenia dotykowego zależy od osi urządzenia, przycisków, właściwości wprowadzania konfiguracja urządzenia wejściowego, wirtualna mapa klawiszy i układ klawiszy.

W kolejnych sekcjach znajdziesz więcej informacji o plikach, które uczestniczyć w konfiguracji klawiatury:

Właściwości

System korzysta z wielu właściwości wejściowych do konfiguracji urządzenia i kalibrować działanie urządzenia dotykowego.

Powodem takiej sytuacji jest to, że sterowniki urządzeń dotykowych często zgłaszają, i rozpoznawać cechy dotyku przy użyciu jednostek charakterystycznych dla danego urządzenia.

Na przykład wiele urządzeń dotykowych mierzy powierzchnię kontaktu dotykowego za pomocą wewnętrznej skali dla konkretnego urządzenia, takiej jak łączna liczba węzłów czujnika, które zostały aktywowane przez dotknięcie. Ta nieprzetworzona wartość rozmiaru nie mają znaczenia dla aplikacji, ponieważ muszą wiedzieć wielkości fizycznej i innych cech węzłów czujnika urządzenia dotykowego.

System wykorzystuje parametry kalibracji zakodowane w konfiguracji urządzenia wejściowego pliki do dekodowania, przekształcania i normalizacji wartości zgłaszanych dotykiem urządzenia w prostszy, standardowy sposób, zrozumiały dla aplikacji.

Konwencje w dokumentacji

W celach dokumentacji używamy następujących konwencji, aby opisać wartości używane przez system podczas procesu kalibracji.

Nieprzetworzone wartości osi

Poniższe wyrażenia oznaczają nieprzetworzone wartości zgłaszane przez dotknięcie sterownika urządzenia 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 wartość 0, jeśli niedostępna.
raw.touchMajor
Wartość na osi ABS_MT_TOUCH_MAJOR lub 0, jeśli jest niedostępna.
raw.touchMinor
Wartość osi ABS_MT_TOUCH_MINOR lub raw.touchMajor, jeśli niedostępna.
raw.toolMajor
Wartość osi ABS_TOOL_WIDTH lub ABS_MT_WIDTH_MAJOR albo wartość 0, jeśli niedostępna.
raw.toolMinor
Wartość osi ABS_MT_WIDTH_MINOR lub raw.toolMajor, jeśli jej nie ma.
raw.orientation
Wartość na osi ABS_MT_ORIENTATION lub 0, jeśli jest niedostępna.
raw.distance
Wartość osi ABS_DISTANCE lub ABS_MT_DISTANCE albo wartość 0, jeśli niedostępna.
raw.tiltX
Wartość na osi ABS_TILT_X lub 0, jeśli jest niedostępna.
raw.tiltY
Wartość na osi ABS_TILT_Y lub 0, jeśli jest niedostępna.

Nieprzetworzone zakresy osi

Poniższe wyrażenia określają granice nieprzetworzonych wartości. Są pozyskiwane wywołując funkcję EVIOCGABS ioctl dla każdej osi.

raw.*.min
Obejmująca minimalna wartość nieprzetworzonej osi.
raw.*.max
Obejmująca maksymalna wartość nieprzetworzonej osi.
raw.*.range
Odpowiednik: raw.*.max - raw.*.min.
raw.*.fuzz
Dokładność nieprzetworzonej osi. np. fuzz = 1 oznacza, że wartości są dokładne z dokładnością do +/- 1 jednostki.
raw.width
Obejmująca szerokość obszaru dotykowego odpowiadająca wymiarowi raw.x.range + 1.
raw.height
włącznie z wysokością obszaru dotykowego odpowiadającej wartości raw.y.range + 1.

Zakresy wyjściowe

Poniższe wyrażenia określają parametry wyjściowego układu współrzędnych. System wykorzystuje interpolację liniową do tłumaczenia informacji o pozycji dotyku jednostkę płaszczyzną używaną przez urządzenie dotykowe do jednostek wyjściowych, i przesyłane do aplikacji, takie jak piksele wyświetlacza.

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

Podstawowa konfiguracja

Mapowanie dotykowe używa wielu właściwości konfiguracyjnych urządzenia wejściowego plik konfiguracji, aby określić wartości kalibracji. W tabeli poniżej niektóre właściwości konfiguracji ogólnego przeznaczenia. Podano też wszystkie pozostałe właściwości. w kolejnych sekcjach wraz z polami używanymi do kalibracji.

Touch.deviceType

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

Określa typ urządzenia dotykowego.

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

  • Jeśli wartość to touchPad, urządzenie dotykowe jest klawiaturą, która nie jest powiązana. z wyświetlaczem.

  • Jeśli wartość to pointer, urządzenie dotykowe jest klawiaturą, która nie jest powiązana. z wyświetlaczem, a ruchy nim 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 znajdziesz w sekcji Klasyfikacja. o tym, jak typ urządzenia wpływa na jego działanie.

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, obracane są pozycje dotyku zgłaszane przez urządzenie dotykowe przy zmianie orientacji ekranu.

  • Jeśli wartość to 0, pozycje dotyku zgłaszane przez urządzenie dotykowe są odporne aby wyświetlić zmiany orientacji.

Wartość domyślna to 1, jeśli urządzenie jest urządzeniem z ekranem dotykowym. 0 w przeciwnym razie.

System odróżnia wewnętrzne i zewnętrzne ekrany dotykowe oraz wyświetlacze. Wewnętrzny ekran dotykowy rozpoznający orientację jest obrócony w zależności od orientacji wewnętrznego wyświetlacza. Zewnętrzny ekran dotykowy rozpoznający orientację jest obrócony w zależności od orientacji wyświetlacza zewnętrznego.

Znajomość orientacji jest używana do obsługi obracania ekranów dotykowych na urządzeniach. np. Nexus One. Na przykład gdy urządzenie jest obrócone w prawo o 90 stopni. zgodnie z naturalną orientacją, absolutne położenie dotknięć jest zmapowane, że kliknięcie w lewym górnym rogu bezwzględnego układu współrzędnych ekranu dotykowego jest raportowany 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, używane przez aplikacje do rysowania.

Przed wprowadzeniem Honeycomb wszystkie urządzenia dotykowe miały rozpoznawalność orientacji.

tryb dotykowy

Definicja: touch.gestureMode = pointer | spots | default

Określa tryb prezentacji gestów wskaźnika. Ta właściwość konfiguracji ma znaczenie tylko wtedy, gdy typ urządzenia dotykowego to wskaźnik.

  • Jeśli wartość to pointer, gesty na touchpadzie są wyświetlane po najechaniu kursorem. jak w przypadku wskaźnika myszy.

  • Jeśli wartość to spots, gesty na touchpadzie są wyświetlane przez reklamę zakotwiczoną. reprezentujący środek gestu i zestaw okrągłych punktów, reprezentujących położenie poszczególnych palców.

Wartość domyślna to pointer, gdy właściwość wejściowa INPUT_PROP_SEMI_MT jest wartością domyślną. lub spots w innym przypadku.

Pola X i Y

Pola X i Y zawierają informacje o położeniu środkowej części obszaru kontaktowego.

Obliczenia

Obliczenie jest proste: informacje o pozycji ze sterownika dotykowego jest interpolowana liniowo do wyjściowego układu współrzędnych.

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

touchpad

Pola touchMajor i touchMinor podają przybliżone wymiary powierzchni kontaktu w jednostkach wyjściowych (w pikselach).

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

Pole size opisuje znormalizowany rozmiar dotyku względem to największy możliwy dotyk, jaki może wykryć urządzenie dotykowe. Najmniejszy możliwy znormalizowany rozmiar to 0,0 (brak kontaktu lub jest on niewymierny) i największy możliwy znormalizowany rozmiar to 1,0 (obszar czujnika jest nasycony).

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

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

Jeśli rozmiar dotyku jest niedostępny, ale rozmiar narzędzia jest dostępny, jest równy rozmiarowi ekranu dotykowego. Jeśli rozmiar narzędzia jest niedostępny ale dostępny jest też 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 różne 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 dotyku do przekazywania wielkości ekranu dotykowego 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 jednostek powierzchni, więc jest skalowany w taki sam sposób.

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

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

  • Jeśli wartość to default, system użyje kalibracji geometric, jeśli Dostępna jest oś raw.touchMajor lub raw.toolMajor; w przeciwnym razie wykorzystuje kalibracji none.

dotknij.rozmiar.skala

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

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

Wartość domyślna to 1.0.

dotyk.rozmiar.bias

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

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

Wartość domyślna to 0.0.

dotknięcie.rozmiar.wyrazSumed

Definicja: touch.size.isSummed = 0 | 1

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

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

  • Jeśli wartość to 0, raportowany rozmiar jest używany w niezmienionej formie.

Wartość domyślna to 0.

Niektóre urządzenia dotykowe, zwłaszcza MT urządzenia nie potrafią rozróżnić poszczególnych wymiarów wielu kontaktów, aby raportowały pomiar rozmiaru. który reprezentuje ich całkowity obszar lub szerokość. Ta właściwość powinna być ustawiona tylko na 1 w przypadku takich urządzeń. W razie wątpliwości ustaw tę wartość na 0.

Obliczenia

Obliczanie wartości touchMajor, touchMinor, toolMajor, toolMinor, i size zależą od określonych parametrów kalibracji.

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

size = avg(touchMajor, touchMinor)

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

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

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

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

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

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

output.size = size

pole ciśnienia

Pole pressure opisuje przybliżone ciśnienie fizyczne wywołane urządzenia dotykowego jako znormalizowanej wartości od 0,0 (brak dotyku) do 1,0 (normalne ciśnienie).

Brak ciśnienia oznacza, że narzędzie się unosi.

dotyk.ciśnienie.kalibracja

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

Określa rodzaj pomiaru używany przez sterownik dotyku do zgłaszania ciśnienia.

  • Jeśli wartość wynosi none, ciśnienie jest nieznane, więc jest ustawiona na 1,0, i 0,0 po najechaniu.

  • Jeśli wartość wynosi physical, zakłada się, że oś nacisku do pomiaru rzeczywistej wartości siła nacisku na touchpada.

  • Jeśli wartość wynosi amplitude, do pomiaru sygnału przyjmuje się oś nacisku. amplitudę, która odpowiada rozmiarowi styku i wywieranym przez nie ciśnieniu.

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

dotyk.ciśnienie.skala

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

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

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

Obliczenia

Obliczanie wartości 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 pochylenia

Pole orientation opisuje orientację dotyku i narzędzia jako kątowy. Orientacja 0 wskazuje, że oś główna jest jest ustawiony w pionie, -PI/2 oznacza, że oś główna jest zorientowana w lewo, PI/2 oznacza, że oś główna jest skierowana w prawo. Gdy rysik narzędzie, zakres orientacji można opisać w pełnym zakresie okręgów od -PI lub PI.

Pole tilt opisuje pochylenie narzędzia jako pomiar kątowy. Nachylenie o wartości 0 oznacza, że narzędzie jest prostopadłe do powierzchni. Kąt nachylenia wynoszący PI/2 oznacza, że narzędzie jest umieszczone na płaskiej 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 że nieprzetworzona wartość raw.orientation.min mapowana na -PI/2 i nieprzetworzona wartość raw.orientation.max mapuje na PI/2. Wartość centralna (raw.orientation.min + raw.orientation.max) / 2 wskazuje na 0.
  • Jeśli wartość to vector, orientacja jest interpretowana jako wektor zapakowany o spójności dwóch podpisanych 4-bitowych pól. Ta reprezentacja jest używana w protokole opartym na obiektach Atmel części składowych. Po zdekodowaniu wektor generuje kąt orientacji i poziom ufności magnituda. Wielkość ufności jest używana do skalowania informacji o rozmiarze, chyba że jest to obiekt 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

Obliczenia wartości pól orientation i tilt 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 podaje odległość między narzędziem a urządzeniem dotykowym na różnych powierzchniach. Wartość 0,0 oznacza kontakt bezpośredni, a wyższe – i zwiększa odległość od powierzchni.

dotyk.odległość.kalibracja

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, zgłaszana odległość jest mnożona przez stały współczynnik skali.

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

dotyk.odległość.skala

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

Obliczanie wartości pola distance zależy od określonej 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 znacznie się zmieniły w Android 4.0 (Ice Cream Sandwich) Wszystkie pliki konfiguracji urządzenia wejściowego – dotykowe Urządzenia muszą zostać zaktualizowane, aby korzystały z nowych właściwości konfiguracji.

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

Pliki mapy kluczy wirtualnych

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 funkcji kontroler dotykowy. Niektóre kontrolery dotykowe można skonfigurować bezpośrednio, aby zaimplementować klawiszy funkcyjnych przez ustawienie rejestrów oprogramowania układowego. Innym razem wskazane jest wykonanie od współrzędnych dotyku na kody klawiszy w oprogramowaniu.

Gdy w oprogramowaniu są zaimplementowane klucze wirtualne, jądro musi wyeksportować wirtualną mapę klucza virtualkeys.<devicename>. Przykład: jeśli sterowniki urządzenia z ekranem dotykowym podają nazwę „touchyfeely”. a następnie plik wirtualnej mapy kluczy musi mieć ścieżkę /sys/board_properties/virtualkeys.touchyfeely

Plik wirtualnej mapy kluczy opisuje współrzędne i kody klawiszy wirtualnych w Linuksie na ekranie dotykowym.

Oprócz pliku wirtualnej mapy kluczy musi istnieć odpowiedni układ kluczy pliku mapy klawiszy w postaci 1 i 2 pliku mapy klawiszy, aby zmapować kody klawiszy Linuksa na kody klawiszy Androida aby określić typ klawiatury (zwykle SPECIAL_FUNCTION).

Składnia

Plik wirtualnej mapy kluczy to zwykły plik tekstowy zawierający sekwencję klucza wirtualnego opisy układów rozdzielane znakami nowego wiersza lub dwukropkami.

Wiersze komentarza zaczynają się od znaku „#” i kontynuuj do końca wiersza.

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

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

Wszystkie współrzędne i rozmiary określa się w postaci układu współrzędnych wyświetlania.

Oto plik wirtualnej mapy kluczy 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 wirtualnej mapy kluczy można również zapisać w wielu wierszach.

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

W przykładzie powyżej ekran dotykowy ma rozdzielczość 480 x 800. W związku z powyższym klucze wirtualne mają wartość <centerY> współrzędna 835, czyli nieco niżej w widocznym obszarze ekranu dotykowego.

Pierwszy klucz zawiera kod skanowania systemu Linux: 158 (KEY_BACK), środekX 55, środek Y z 835, szerokość 90 i wysokość 55

Przykład

Plik mapy kluczy 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 klucza: /system/usr/keylayout/touchyfeely.kl.

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

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

type SPECIAL_FUNCTION

Pośrednie gesty wskaźnika wielodotykowego

W trybie wskaźnika system interpretuje te gesty:

  • Dotknięcie 1 palcem: kliknięcie.
  • Ruch 1 palcem: przesuń wskaźnik.
  • Naciśnięcia przycisku plusa 1 palcem: przeciągnij wskaźnik.
  • Ruch dwoma palcami poruszającymi się w tym samym kierunku: przeciągnij obszar pod wskaźnikiem w tym kierunku. Wskaźnik się nie porusza.
  • Ruch dwoma palcami poruszającymi się w kierunku do siebie lub rozsuwanych w różnych kierunkach: przesuwaj/skaluj/obracaj obszar wokół wskaźnika. Wskaźnik się nie porusza.
  • Ruch wieloma palcami: dowolny gest.

Odrzucenie palm

Od Androida 13 system może automatycznie odrzucać informacje podawane przez dłonie po włączeniu wbudowanej platformy. Własne rozwiązania własne są nadal obsługiwane, ale trzeba je zmodyfikować, by zwracały flagę TOOL_TYPE_PALM, gdy 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 według bieżącego wskaźnika i przy a następnie analizuje, jak daleko od krawędzi wyświetlacza znajdują się dotknięcia. Następnie na podstawie każdego wskaźnika określa, które wskaźniki są dłoniami. Uwzględnia też bierz pod uwagę wielkość każdego kontaktu, według raportów touchMajor i touchMinor Platforma Androida następnie usuwa wskaźniki oznaczone jako ze strumienia dotyku.

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

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

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

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

Włącz odrzucanie dłoni

  1. W sterowniku dotykowym użyj Makro input_abs_set_res należy ustawić rozdzielczość dla następujących pól (jednostki są piks. na mm):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

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

  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 aplikacji, uruchom polecenie:
        $ 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 środku znajdują się moduły odrzucające dłonie UnwantedInteractionBlocker Jeśli tak nie jest, sprawdź logi związane z danymi wejściowymi, aby znaleźć wskazówki dotyczące błędów konfiguracji.

    Zapoznaj się z tym przykładem:

    UnwantedInteractionBlocker:
      mEnablePalmRejection: true
      isPalmRejectionEnabled (flag value): true
      mPalmRejectors:
        deviceId = 3:
          mDeviceInfo:
            max_x = 
            max_y = 
            x_res = 11.00
            y_res = 11.00
            major_radius_res = 1.00
            minor_radius_res = 1.00
            minor_radius_supported = true
            touch_major_res = 1
            touch_minor_res = 1
          mSlotState:
            mSlotsByPointerId:
    
            mPointerIdsBySlot:
    
          mSuppressedPointerIds: {}
    
  6. Aby na stałe włączyć tę funkcję, dodaj odpowiednie polecenie sysprop do polecenia init**rc plik:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Więcej materiałów