Urządzenia z ekranami dotykowymi

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

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.

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

Urządzenia dotykowe mogą mieć przyciski, których funkcje są podobne do przycisków myszy.

Urządzenia dotykowe można czasem 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 implementacji klawiszy wirtualnych. Na przykład na niektórych urządzeniach z Androidem obszar czujnika ekranu dotykowego wykracza poza krawędź wyświetlacza i pełni podwójną funkcję jako część klawiatury dotykowej.

Ze względu na dużą różnorodność urządzeń dotykowych Android korzysta z wielu właściwości konfiguracji, aby opisać cechy 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łnione są oba te warunki:

  • Urządzenie wejściowe zgłasza obecność osi bezwzględnych ABS_MT_POSITION_X i ABS_MT_POSITION_Y.
  • Urządzenie wejściowe nie ma żadnych przycisków pada do gier. Ten warunek rozwiązuje problem z niejednoznacznością w przypadku niektórych padów do gier, 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 z pojedynczym dotknięciem lub urządzenie wielodotykowe, nigdy jako oba.
  • Urządzenie wejściowe zgłasza obecność osi bezwzględnych ABS_X i ABS_Y oraz kodu klawisza 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 urządzenia. Jeśli dostępna jest mapa klawiszy wirtualnych, wczytywany 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 konfiguracji urządzenia wejściowego dla urządzenia dotykowego.

Wszystkie wbudowane urządzenia dotykowe powinny mieć pliki konfiguracji urządzeń wejściowych. Jeśli nie ma pliku konfiguracji urządzenia wejściowego, system wybiera domyślną konfigurację odpowiednią dla urządzeń peryferyjnych do zwykłych obciążeń, takich jak zewnętrzne ekrany dotykowe USB lub Bluetooth HID albo panele dotykowe. 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 urządzenie wskazujące.

  • Urządzenie z ekranem dotykowym służy do bezpośredniego manipulowania obiektami na ekranie. Użytkownik bezpośrednio dotyka ekranu, więc system nie wymaga żadnych dodatkowych elementów wskazujących obiekty, którymi manipuluje.
  • Panel dotykowy służy do przekazywania aplikacji informacji o bezwzględnym położeniu dotknięć na danym obszarze czujnika. Może być przydatna w przypadku tabletów graficznych.
  • Urządzenie wskazujące służy do pośredniego manipulowania obiektami na ekranie za pomocą kursora. Palce są interpretowane jako gesty wskaźnika wielodotykowego. Inne narzędzia, takie jak rysiki, są interpretowane przy użyciu pozycji bezwzględnych. Więcej informacji znajdziesz w sekcji Gesty pośrednie wielodotykowe.

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

  • Jeśli właściwość touch.deviceType jest ustawiona, typ urządzenia jest ustawiony zgodnie ze 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 dotykowe z bezpośrednim wprowadzaniem danych są podłączone do wyświetlacza, który również jest podłączony.
  • Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej INPUT_PROP_POINTER (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 ustawiony na 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 touchpada. W takim przypadku panel dotykowy nie służy do sterowania wskaźnikiem, ponieważ jest on już sterowany za pomocą myszy.
  • W przeciwnym razie typ urządzenia jest ustawiony na pointer. Ta domyślna wartość zapewnia, że panele dotykowe, 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 do przycisków myszy i są używane głównie w przypadku urządzeń dotykowych ze wskaźnikiem lub rysikiem.

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_BACK i BTN_SIDE: zmapowane na MotionEvent.BUTTON_BACK. Naciśnięcie tego przycisku powoduje też wygenerowanie naciśnięcia klawisza z kodem KeyEvent.KEYCODE_BACK.
  • BTN_FORWARD i BTN_EXTRA: zmapowane na MotionEvent.BUTTON_FORWARD. Naciśnięcie tego przycisku powoduje też symulację naciśnięcia klawisza o kodzie KeyEvent.KEYCODE_FORWARD.
  • BTN_STYLUS: zmapowano na MotionEvent.BUTTON_SECONDARY.
  • BTN_STYLUS2: zmapowano na MotionEvent.BUTTON_TERTIARY.

Narzędzia i typy narzędzi

Narzędzie to palec, rysik lub inne urządzenie, które służy 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 API MotionEvent, narzędzie jest często nazywane wskaźnikiem.

Obsługiwane są te typy narzędzi:

  • BTN_TOOL_FINGER i MT_TOOL_FINGER: zmapowane na MotionEvent.TOOL_TYPE_FINGER.
  • BTN_TOOL_PEN i MT_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: mapowane na MotionEvent.TOOL_TYPE_FINGER.

Najeżdżanie a dotykanie narzędzi

Narzędzia mogą być w kontakcie z urządzeniem dotykowym lub w jego zasięgu i nad nim. Nie wszystkie urządzenia dotykowe mogą wykrywać obecność narzędzia nad urządzeniem dotykowym. Te, które to robią, np. digitizery rysików RF, często mogą wykrywać, kiedy narzędzie znajduje się w ograniczonym zasięgu digitizera.

Komponent InputReader odróżnia narzędzia dotykowe od narzędzi najeżdżania. 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 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 są zgłaszane aplikacjom jako ogólne zdarzenia ruchu za pomocą MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE i MotionEvent.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ą. Zarejestrowanie nieobsługiwanych osi lub kodów klawiszy może spowodować błąd algorytmu klasyfikacji urządzeń lub nieprawidłowe wykrywanie możliwości urządzenia przez system. Jeśli na przykład urządzenie zgłasza kod klawisza BTN_TOUCH, system zakłada, że BTN_TOUCH jest zawsze używany do wskazywania, czy narzędzie dotyka ekranu. Dlatego nie należy używać BTN_TOUCH do wskazywania, że narzędzie jest tylko w zasięgu i najeżdża na element.
  • Urządzenia z ekranem dotykowym obsługującym pojedynczy dotyk korzystają z tych zdarzeń wejściowych systemu Linux:
    • ABS_X: (WYMAGANE) raportuje współrzędną X narzędzia.
    • ABS_Y: (WYMAGANE) raportuje współrzędną Y narzędzia.
    • ABS_PRESSURE: (opcjonalnie) raportuje nacisk fizyczny wywierany na końcówkę narzędzia lub siłę sygnału kontaktu dotykowego.
    • ABS_TOOL_WIDTH: (opcjonalnie) raportuje pole przekroju lub szerokość punktu dotykowego albo samego narzędzia.
    • ABS_DISTANCE: (opcjonalnie) raportuje odległość narzędzia od powierzchni urządzenia dotykowego.
    • ABS_TILT_X: (opcjonalnie) raportuje nachylenie narzędzia względem powierzchni urządzenia dotykowego wzdłuż osi X.
    • ABS_TILT_Y: (opcjonalnie) raportuje nachylenie narzędzia względem powierzchni urządzenia dotykowego wzdłuż osi Y.
    • BTN_TOUCH: (WYMAGANE) wskazuje, czy narzędzie dotyka urządzenia.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (opcjonalnie) Raportuje stany przycisków.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (opcjonalnie) podaje typ narzędzia.
  • Urządzenia wielodotykowe używają tych zdarzeń wejściowych systemu Linux:
    • ABS_MT_POSITION_X: (WYMAGANE) raportuje współrzędną X narzędzia.
    • ABS_MT_POSITION_Y: (WYMAGANE) raportuje współrzędną Y narzędzia.
    • ABS_MT_PRESSURE: (opcjonalnie) raportuje nacisk fizyczny wywierany na końcówkę narzędzia lub siłę sygnału kontaktu dotykowego.
    • ABS_MT_TOUCH_MAJOR: (opcjonalnie) raportuje pole przekroju poprzecznego punktu dotykowego lub długość dłuższego wymiaru punktu dotykowego.
    • ABS_MT_TOUCH_MINOR: (opcjonalnie) podaje długość krótszego wymiaru punktu dotykowego. Tej osi nie należy używać, jeśli ABS_MT_TOUCH_MAJOR raportuje pomiar powierzchni.
    • ABS_MT_WIDTH_MAJOR: (opcjonalnie) podaje pole przekroju poprzecznego narzędzia lub długość jego dłuższego wymiaru. Nie używaj tej osi, chyba że znasz wymiary samego narzędzia.
    • ABS_MT_WIDTH_MINOR: (opcjonalny) podaje długość krótszego wymiaru narzędzia. Nie należy używać tej osi, jeśli ABS_MT_WIDTH_MAJOR podaje pomiar powierzchni lub jeśli wymiary samego narzędzia są nieznane.
    • ABS_MT_ORIENTATION: (opcjonalnie) raportuje orientację narzędzia.
    • ABS_MT_DISTANCE: (opcjonalnie) raportuje odległość narzędzia od powierzchni urządzenia dotykowego.
    • ABS_MT_TOOL_TYPE: (opcjonalny) raportuje typ narzędzia jako MT_TOOL_FINGER lub MT_TOOL_PEN.
    • ABS_MT_TRACKING_ID: (opcjonalnie) raportuje identyfikator śledzenia narzędzia. Identyfikator śledzenia to dowolna nieujemna liczba całkowita, która służy do identyfikowania i śledzenia każdego narzędzia niezależnie, gdy aktywnych jest kilka narzędzi. Na przykład gdy kilka palców dotyka urządzenia, każdemu z nich należy przypisać 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) raportuje identyfikator gniazda narzędzia, gdy używany jest protokół wielodotykowy „B” systemu Linux. Więcej informacji znajdziesz w dokumentacji protokołu wielodotykowego systemu Linux.
    • BTN_TOUCH: (WYMAGANE) wskazuje, czy narzędzie dotyka urządzenia.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (opcjonalnie) Raportuje stany przycisków.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (opcjonalnie) podaje typ narzędzia.
  • Jeśli zdefiniowane są osie zarówno dla protokołu jednodotykowego, jak i wielodotykowego, używane są tylko osie wielodotykowe, a osie jednodotykowe są ignorowane.
  • Wartości minimalne i maksymalne osi ABS_X, ABS_Y, ABS_MT_POSITION_X i ABS_MT_POSITION_Y definiują granice aktywnego obszaru urządzenia w jednostkach powierzchni właściwych 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 tymi obliczeniami:

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

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

    Dotknięcia, które są inicjowane poza aktywnym obszarem, nie są dostarczane do aplikacji, ale mogą być używane do klawiszy wirtualnych.

    Dotknięcia, które są inicjowane w obszarze aktywnym lub które wchodzą w obszar wyświetlania i go opuszczają, są przekazywane do aplikacji. W związku z tym, jeśli dotknięcie rozpocznie się w granicach aplikacji, a następnie przesunie się poza aktywny obszar, aplikacja może otrzymywać zdarzenia dotknięcia 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 nie powinno nigdy ograniczać współrzędnych dotyku do granic aktywnego obszaru. Jeśli dotknięcie wykracza poza aktywny obszar, powinno zostać zgłoszone jako znajdujące się poza aktywnym obszarem lub nie powinno być w ogóle zgłaszane.

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

    Ograniczenie współrzędnych dotyku do krawędzi wyświetlacza tworzy sztuczną twardą granicę wokół krawędzi ekranu, co uniemożliwia systemowi płynne śledzenie ruchów, które wchodzą w granice obszaru wyświetlania lub je opuszczają.

  • Wartości zgłaszane przez ABS_PRESSURE lub ABS_MT_PRESSURE, jeśli w ogóle są zgłaszane, muszą być różne od zera, gdy narzędzie dotyka urządzenia, i równe zero, gdy narzędzie jest nad urządzeniem.

    Podawanie informacji o ciśnieniu jest opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą używać informacji o sile nacisku do implementowania rysowania z wykrywaniem nacisku i innych efektów.

  • Wartości raportowane przez ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR lub ABS_MT_WIDTH_MINOR powinny być niezerowe, gdy narzędzie dotyka urządzenia, i zerowe w przeciwnym razie, ale nie jest to wymagane. Na przykład urządzenie dotykowe może mierzyć rozmiar dotknięcia palcem, ale nie rysikiem.

    Podawanie informacji o rozmiarze jest opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą wykorzystywać informacje o sile nacisku do implementowania rysowania zależnego od 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ć większa niż zero, nawet gdy narzędzie jest w bezpośrednim kontakcie. Dokładne wartości zależą od sposobu, w jaki sprzęt mierzy odległość.

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

  • Wartości zgłaszane przez ABS_TILT_X i ABS_TILT_Y powinny wynosić zero, gdy narzędzie jest prostopadłe do urządzenia. Wartość nachylenia różna od zera oznacza, że narzędzie jest trzymane pod kątem.

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

    InputReader przekształca składowe nachylenia X i Y na prostopadły kąt nachylenia w zakresie od 0 do PI / 2 radianów oraz kąt orientacji płaskiej w zakresie od -PI do PI radianów. Taka reprezentacja daje opis orientacji zgodny z opisem dotknięć palcem.

    Raportowanie informacji o nachyleniu 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 nie są dostępne żadne informacje o typie narzędzia, domyślnie ustawiany jest typ MotionEvent.TOOL_TYPE_FINGER.

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

    • Jeśli używasz protokołu pojedynczego dotknięcia, narzędzie jest aktywne, gdy BTN_TOUCH lub BTN_TOOL_* ma wartość 1.

      Ten warunek oznacza, że InputReader musi mieć przynajmniej pewne informacje o charakterze narzędzia, np. czy jest to narzędzie dotykowe, lub przynajmniej o jego typie. Jeśli nie ma żadnych informacji, przyjmuje się, że narzędzie jest nieaktywne (poza zasięgiem).

    • W przypadku protokołu wielodotykowego „A” narzędzie jest aktywne, gdy pojawia się w najnowszym raporcie synchronizacji. Gdy narzędzie przestanie pojawiać się w raportach synchronizacji, przestanie istnieć.
    • W przypadku protokołu wielodotykowego „B” narzędzie jest aktywne, dopóki ma aktywny slot. Po wyczyszczeniu gniazda narzędzie przestaje istnieć.
  • Narzędzie jest uznawane za najeżdżające na podstawie tych warunków:
    • Jeśli narzędzie jest BTN_TOOL_MOUSE lub BTN_TOOL_LENS, nie jest ono najeżdżane, nawet jeśli spełniony jest jeden z tych warunków.
    • Jeśli narzędzie jest aktywne, a sterownik zgłasza informacje o nacisku, a zgłoszony nacisk wynosi zero, narzędzie jest w trybie najechania.
    • Jeśli narzędzie jest aktywne, a sterownik obsługuje kod klawisza BTN_TOUCH i BTN_TOUCH ma wartość 0, narzędzie jest w trybie najechania.
  • InputReader obsługuje protokoły wielodotyku „A” i „B”. Nowe sterowniki powinny używać protokołu „B”, ale oba działają.
  • Od Androida 4.0 może być konieczna zmiana sterowników ekranu dotykowego, aby były zgodne ze specyfikacją protokołu wejściowego systemu Linux.

    Może być konieczne wprowadzenie tych zmian:

    • Gdy narzędzie stanie się nieaktywne (palec zostanie podniesiony), powinno przestać pojawiać się w kolejnych raportach synchronizacji wielodotykowej. Gdy wszystkie narzędzia staną się nieaktywne (wszystkie palce zostaną podniesione), sterownik powinien wysłać pusty pakiet raportu synchronizacji, np. SYN_MT_REPORT, a następnie SYN_REPORT.

      W poprzednich wersjach Androida zdarzenia „up” były raportowane przez wysłanie wartości nacisku 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 powinny być przekazywane za pomocą ABS_MT_PRESSURE.

      Poprzednie wersje Androida pobierały informacje o ciśnieniu z aplikacji 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 powinny być przekazywane za pomocą ABS_MT_TOUCH_MAJOR.

      Poprzednie 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ż dostosowywania do Androida. Dzięki standardowemu protokołowi wejściowemu systemu Linux Android może obsługiwać szerszą gamę urządzeń peryferyjnych, takich jak zewnętrzne ekrany dotykowe HID, przy użyciu niezmodyfikowanych sterowników.

Obsługa urządzenia dotykowego

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

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

Konfiguracja urządzenia dotykowego

Działanie 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 uczestniczą w konfiguracji klawiatury, znajdziesz w tych sekcjach:

Właściwości

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

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

Na przykład wiele urządzeń dotykowych mierzy obszar kontaktu dotykowego za pomocą wewnętrznej skali specyficznej dla urządzenia, takiej jak łączna liczba węzłów czujnika, które zostały aktywowane przez dotyk. Ta nieprzetworzona wartość rozmiaru nie byłaby przydatna dla aplikacji, ponieważ musiałyby one znać fizyczny rozmiar i inne cechy węzłów czujników urządzenia dotykowego.

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

Konwencje dokumentacji

W celach dokumentacyjnych używamy tych konwencji do opisywania wartości używanych przez system podczas procesu kalibracji.

Nieprzetworzone wartości osi

Poniższe wyrażenia oznaczają nieprzetworzone wartości zgłaszane przez sterownik urządzenia dotykowego jako zdarzenia EV_ABS.

raw.x
Wartość osi ABS_X lub ABS_MT_POSITION_X.
raw.y
Wartość osi ABS_Y lub ABS_MT_POSITION_Y.
raw.pressure
Wartość osi ABS_PRESSURE lub ABS_MT_PRESSURE albo 0, jeśli jest niedostępna.
raw.touchMajor
Wartość 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 jest niedostępna.
raw.toolMajor
Wartość osi ABS_TOOL_WIDTH lub ABS_MT_WIDTH_MAJOR albo 0, jeśli jest niedostępna.
raw.toolMinor
Wartość osi ABS_MT_WIDTH_MINOR lub raw.toolMajor, jeśli jest niedostępna.
raw.orientation
Wartość osi ABS_MT_ORIENTATION lub 0, jeśli jest niedostępna.
raw.distance
Wartość osi ABS_DISTANCE lub ABS_MT_DISTANCE albo 0, jeśli jest niedostępna.
raw.tiltX
Wartość osi ABS_TILT_X lub 0, jeśli jest niedostępna.
raw.tiltY
Wartość osi ABS_TILT_Y lub 0, jeśli jest niedostępna.

Nieprzetworzone zakresy osi

Poniższe wyrażenia oznaczają granice nieprzetworzonych wartości. Można je uzyskać, wywołując EVIOCGABS ioctl dla każdej osi.

raw.*.min
Minimalna wartość osi nieprzetworzonej (włącznie).
raw.*.max
Maksymalna wartość osi nieprzetworzonej (włącznie).
raw.*.range
Odpowiednik: raw.*.max - raw.*.min.
raw.*.fuzz
Dokładność nieprzetworzonej osi. Na przykład fuzz = 1 oznacza, że wartości są dokładne do +/- 1 jednostki.
raw.width
Szerokość obszaru dotykowego (włącznie z obramowaniem), odpowiadająca raw.x.range + 1.
raw.height
Wysokość obszaru dotykowego, równoważna raw.y.range + 1.

Zakresy wyjściowe

Poniższe wyrażenia określają 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ą raportowane do aplikacji, np. piksele wyświetlacza.

output.width
Szerokość wyjściowa. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to szerokość wyświetlacza w pikselach. W przypadku paneli dotykowych (niepowiązanych z wyświetlaczem) szerokość wyjściowa wynosi raw.width, co oznacza, że nie jest wykonywana 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 touchpadów (niepowiązanych z wyświetlaczem) wysokość wyjściowa wynosi raw.height, co oznacza, że nie jest wykonywana interpolacja.
output.diag
Długość przekątnej wyjściowego układu współrzędnych, odpowiadająca sqrt(output.width ^2 + output.height ^2).

Podstawowa konfiguracja

Moduł mapowania dotykowego wprowadzania danych używa 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 do zwykłych obciążeń. Wszystkie pozostałe właściwości są 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 to ekran dotykowy powiązany z wyświetlaczem.

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

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

  • 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 działanie urządzenia dotykowego, 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 powinno reagować na zmiany orientacji wyświetlacza.

  • Jeśli wartość to 1, pozycje dotykowe zgłaszane przez urządzenie dotykowe są obracane przy każdej zmianie orientacji wyświetlacza.

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

Wartość domyślna to 1, jeśli urządzenie ma ekran dotykowy, lub 0 w przeciwnym razie.

System rozróżnia wewnętrzne i zewnętrzne ekrany dotykowe oraz wyświetlacze. Wewnętrzny ekran dotykowy z funkcją rozpoznawania orientacji jest obracany na podstawie orientacji wyświetlacza wewnętrznego. Zewnętrzny ekran dotykowy z funkcją rozpoznawania orientacji jest obracany na podstawie orientacji wyświetlacza zewnętrznego.

Wykrywanie orientacji służy 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 orientacji naturalnej, bezwzględne pozycje dotknięć są ponownie mapowane, 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ą raportowane w tym samym układzie współrzędnych, którego aplikacje używają do rysowania elementów wizualnych.

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

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

  • 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 touchpadzie są przedstawiane za pomocą kotwicy, która reprezentuje środek ciężkości gestu, oraz zestawu okrągłych punktów, które reprezentują pozycję 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.

Obliczenie

Obliczenia są proste: informacje o pozycji ze sterownika dotykowego są interpolowane liniowo do wyjściowego układu współrzędnych.

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

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

Pola touchMajor, touchMinor, toolMajor, toolMinor, size

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

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

Pole size opisuje znormalizowany rozmiar dotknięcia w stosunku do największego możliwego dotknięcia, które może wykryć urządzenie dotykowe. Najmniejszy możliwy znormalizowany rozmiar to 0,0 (brak kontaktu lub niemożliwy do zmierzenia), a największy 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 – krótszy wymiar obszaru kontaktu. Jeśli można zmierzyć tylko przybliżoną średnicę obszaru kontaktu, pola touchMajor i touchMinor są równe.

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

Jeśli rozmiar dotyku jest niedostępny, ale rozmiar narzędzia jest dostępny, rozmiar narzędzia jest ustawiany na rozmiar dotyku. Jeśli natomiast rozmiar narzędzia jest niedostępny, ale rozmiar dotyku jest dostępny, rozmiar dotyku jest ustawiany na rozmiar narzędzia.

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

<touch.size.calibration< h4=""></touch.size.calibration<>

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ść to none, rozmiar jest ustawiany na 0.

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

  • Jeśli wartość to diameter, przyjmuje się, że rozmiar jest proporcjonalny do średnicy (szerokości) dotknięcia lub narzędzia.

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

  • Jeśli wartość to default, system używa kalibracji geometric, gdy dostępna jest oś 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 podczas kalibracji.

Wartością domyślną jest 1.0.

touch.size.bias

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

Określa stałą wartość błędu systematycznego używaną podczas kalibracji.

Wartością domyślną jest 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, przed użyciem raportowany rozmiar jest dzielony przez liczbę kontaktów.

  • Jeśli wartość to 0, używany jest zgłoszony rozmiar.

Wartością domyślną jest 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ą rozmiar, który reprezentuje ich łączny obszar lub szerokość. W przypadku takich urządzeń ta właściwość powinna mieć wartość 1. W razie wątpliwości ustaw wartość 0.

Obliczenie

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

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

size = avg(touchMajor, touchMinor)

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

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

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

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

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

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

output.size = size

pole 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, nacisk jest nieznany, więc jest ustawiony na 1,0 podczas dotykania i 0,0 podczas najeżdżania.

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

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

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

touch.pressure.scale

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

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

Wartością domyślną jest 1.0 / raw.pressure.max.

Obliczenie

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

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

pola orientacji i nachylenia

Pole orientation opisuje orientację dotknięcia i narzędzia jako pomiar kątowy. Orientacja 0 oznacza, że oś główna jest ustawiona pionowo, -PI/2 – że oś główna jest skierowana w lewo, a PI/2 – że oś główna jest skierowana w prawo. Jeśli dostępne jest narzędzie rysika, zakres orientacji może być opisany w pełnym zakresie koła od -PI do PI.

Pole tilt opisuje nachylenie narzędzia jako pomiar kątowy. Wartość 0 oznacza, że narzędzie jest prostopadłe do powierzchni. Nachylenie PI/2 oznacza, że narzędzie jest 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 nieprzetworzona wartość raw.orientation.min była mapowana na -PI/2, a nieprzetworzona wartość raw.orientation.max – na PI/2. Wartość środkowa (raw.orientation.min + raw.orientation.max) / 2 jest mapowana na 0.
  • Jeśli wartość to vector, orientacja jest interpretowana jako spakowany wektor składający się z 2 4-bitowych pól ze znakiem. Ta reprezentacja jest używana w częściach Atmel Object Based Protocol. Po zdekodowaniu wektor daje kąt orientacji i wartość ufności. Wartość ufności jest używana do skalowania informacji o rozmiarze, chyba że jest to wartość geometryczna.
  • Jeśli wartość to default, system używa kalibracji interpolated, jeśli oś orientacji jest dostępna, w przeciwnym razie używa none.

Obliczenie

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

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

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

        output.orientation = angle

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

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

pole odległości

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

touch.distance.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ść wynosi none, odległość jest nieznana, więc jest ustawiona na 0.

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

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

touch.distance.scale

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

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

Wartością domyślną jest 1.0.

Obliczenie

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

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

Przykład

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

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

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

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

# Orientation
touch.orientation.calibration = vector

Uwagi dotyczące zgodności

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

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

Pliki map klawiszy wirtualnych

Urządzenia dotykowe mogą służyć do implementacji 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 przycisków programowych przez ustawienie rejestrów oprogramowania układowego. W innych przypadkach mapowanie współrzędnych dotyku na kody klawiszy może być wykonywane w oprogramowaniu.

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

Plik mapy klawiszy wirtualnych opisuje 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 można było mapować kody klawiszy systemu Linux na kody klawiszy Androida i określić typ klawiatury (zwykle SPECIAL_FUNCTION).

Składnia

Plik mapy klawiszy wirtualnych to zwykły plik tekstowy składający się z sekwencji opisów układu klawiszy wirtualnych rozdzielonych znakami nowego wiersza lub dwukropkami.

Wiersze komentarzy zaczynają się od znaku „#” i kończą się na końcu wiersza.

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

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

Wszystkie współrzędne i rozmiary są określane w układzie 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 mapy 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. W związku z tym wszystkie klawisze wirtualne mają współrzędną <centerY> równą 835, czyli nieco poniżej widocznego obszaru ekranu dotykowego.

Pierwszy klawisz ma kod skanowania Linuksa 158 (KEY_BACK), centerX 55, 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 klawiszy: /system/usr/keylayout/touchyfeely.kl.

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

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

type SPECIAL_FUNCTION

Pośrednie gesty wielodotykowe ze wskaźnikiem

W trybie wskaźnika system interpretuje te gesty:

  • Kliknięcie jednym palcem: kliknięcie.
  • Ruch jednym palcem: przesuwanie wskaźnika.
  • Ruch 1 palcem i naciśnięcie przycisku: przeciągnięcie wskaźnika.
  • Ruch 2 palcami w tym samym kierunku: przeciągnij obszar pod wskaźnikiem w tym kierunku. Sam wskaźnik się nie porusza.
  • Ruch 2 palcami, gdy oba palce zbliżają się do siebie lub oddalają w różnych kierunkach: przesuwanie, skalowanie lub obracanie obszaru wokół wskaźnika. Sam wskaźnik się nie porusza.
  • Ruch wieloma palcami: gest dowolny.

odrzucanie dotyku dłonią,

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

Model analizuje pierwsze 90 ms danych gestu, bieżący wskaźnik i wskaźniki otaczające, a następnie uwzględnia odległość dotknięć od krawędzi wyświetlacza. Następnie określa, które ze wskaźników są dłońmi. Uwzględnia też rozmiar każdego kontaktu podany przez touchMajor i touchMinor. Następnie platforma Androida usuwa ze strumienia 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_UP i FLAG_CANCELED.
  • (Jeśli jest to jedyny wskaźnik) Anuluje wskaźnik za pomocą ACTION_CANCEL.

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

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

Włącz ignorowanie dotknięć dłonią

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

    Obsługa ABS_MT_TOUCH_MINOR jest opcjonalna. Jeśli jednak 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, uruchom:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Ponownie uruchom proces system_server.
         $ adb shell stop && adb shell start
        
  5. Sprawdź, czy adb shell dumpsys input pokazuje, że w UnwantedInteractionBlocker znajdują się odrzucenia dłoni. Jeśli nie, sprawdź logi związane z danymi wejściowymi, aby znaleźć wskazówki dotyczące tego, co może być nieprawidłowo skonfigurowane.

    Zobacz ten przykład:

    UnwantedInteractionBlocker:
      mEnablePalmRejection: true
      isPalmRejectionEnabled (flag value): true
      mPalmRejectors:
        deviceId = 3:
          mDeviceInfo:
            max_x = 
            max_y = 
            x_res = 11.00
            y_res = 11.00
            major_radius_res = 1.00
            minor_radius_res = 1.00
            minor_radius_supported = true
            touch_major_res = 1
            touch_minor_res = 1
          mSlotState:
            mSlotsByPointerId:
    
            mPointerIdsBySlot:
    
          mSuppressedPointerIds: {}
    
  6. Aby 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 informacji