Android obsługuje różne ekrany dotykowe i touchpady, w tym tablety z digitizerem i rysikiem.
Ekrany dotykowe to urządzenia dotykowe, które są powiązane z wyświetlaczem, dzięki czemu użytkownik ma wrażenie bezpośredniej manipulacji elementami na ekranie.
Płytki dotykowe to urządzenia dotykowe, które nie są powiązane z wyświetlaczem, np. tablety dotykowe. Touchpady są zwykle używane do wskazywania lub sterowania interfejsem za pomocą gestów lub pozycjonowania bezwzględnego.
Urządzenia dotykowe mogą mieć przyciski, których funkcje są podobne do przycisków myszy.
Urządzeniami dotykowymi można czasami sterować za pomocą różnych narzędzi, takich jak palce czy rysik, w zależności od używanej technologii czujnika dotykowego.
Klawisze wirtualne są czasem implementowane na urządzeniach dotykowych. Na przykład na niektórych urządzeniach z Androidem obszar czujnika ekranu dotykowego wykracza poza krawędź wyświetlacza i pełni podwójną funkcję jako część klawiatury dotykowej.
Ze względu na dużą różnorodność urządzeń dotykowych Android korzysta z dużej liczby właściwości konfiguracji, aby opisywać właściwości i pożądane zachowanie poszczególnych urządzeń.
Klasyfikacja urządzeń z ekranem dotykowym
Urządzenie wejściowe jest klasyfikowane jako urządzenie wielodotykowe, jeśli są spełnione oba te warunki:
- Urządzenie wejściowe zgłasza obecność osi bezwzględnych
ABS_MT_POSITION_X
iABS_MT_POSITION_Y
. - Urządzenie wejściowe nie ma żadnych przycisków kontrolera. Ten warunek rozwiązuje niejednoznaczność w przypadku niektórych kontrolerów, które raportują osie z kodami, które pokrywają się z osiami MT.
Urządzenie wejściowe jest klasyfikowane jako urządzenie z jednym dotykiem, jeśli są spełnione oba te warunki:
- Urządzenie wejściowe nie jest klasyfikowane jako urządzenie wielodotykowe. Urządzenie wejściowe jest klasyfikowane jako urządzenie jednodotykowe lub urządzenie wielodotykowe, nigdy nie jako jedno i drugie.
- Urządzenie wejściowe zgłasza obecność osi bezwzględnych
ABS_X
iABS_Y
oraz obecność kodu klawiszaBTN_TOUCH
.
Gdy urządzenie wejściowe zostanie sklasyfikowane jako urządzenie dotykowe, obecność klawiszy wirtualnych jest określana przez próbę załadowania pliku mapy klawiszy wirtualnych dla tego urządzenia. Jeśli dostępna jest mapa klawiszy wirtualnych, wczytuje się też plik z układem klawiszy dla urządzenia. Informacje o lokalizacji i formacie tych plików znajdziesz w sekcji [Pliki mapy klucza wirtualnego](#virtual-key-map-files).
Następnie system wczytuje plik konfiguracji urządzenia wejściowego dla urządzenia dotykowego.
Wszystkie wbudowane urządzenia dotykowe powinny mieć pliki konfiguracji urządzenia wejściowego. Jeśli nie ma pliku konfiguracji urządzenia wejściowego, system wybierze domyślną konfigurację odpowiednią dla urządzeń peryferyjnych dotykowych ogólnego przeznaczenia, takich jak zewnętrzne ekrany dotykowe USB lub Bluetooth HID czy panele dotykowe. Te ustawienia domyślne nie są przeznaczone do wbudowanych ekranów dotykowych i mogą powodować nieprawidłowe działanie.
Po załadowaniu konfiguracji urządzenia wejściowego system zaklasyfikuje urządzenie jako ekran dotykowy, panel dotykowy lub wskaźnik.
- Ekran dotykowy służy do bezpośredniego manipulowania obiektami na ekranie. Użytkownik dotyka ekranu bezpośrednio, więc system nie wymaga żadnych dodatkowych elementów, które wskazywałyby obiekty podlegające manipulacji.
- Pad dotykowy służy do przekazywania aplikacji informacji o bezwzględnym położeniu dotyku w danym obszarze czujnika. Może to być przydatne w przypadku tabletów do digitalizacji.
- Wskaźnik służy do pośredniego manipulowania obiektami na ekranie za pomocą kursora. Palce są interpretowane jako gesty wskaźnika wielodotykowego. Inne narzędzia, takie jak rysiki, są interpretowane przy użyciu pozycji bezwzględnych. Więcej informacji znajdziesz w artykule Gesty sterowania pośredniego za pomocą wskaźnika wielodotykowego.
Do klasyfikowania urządzenia wejściowego jako ekranu dotykowego, touchpada lub urządzenia wskazującego służą te reguły.
- Jeśli właściwość
touch.deviceType
jest ustawiona, typ urządzenia jest ustawiony zgodnie z wspomnianym. - Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej
INPUT_PROP_DIRECT
(za pomocą ioctlEVIOCGPROP
), typ urządzenia jest ustawiany na ekran dotykowy. To założenie zakłada, że urządzenia z wyświetlaczem dotykowym są podłączone do wyświetlacza, który jest również połączony. - Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej
INPUT_PROP_POINTER
(za pomocą ioctlEVIOCGPROP
), typ urządzenia jest ustawiony na wskaźnik. - Jeśli urządzenie wejściowe zgłasza obecność osi względnych
REL_X
lubREL_Y
, typ urządzenia jest ustawiany jako panel dotykowy. Ten warunek rozwiązuje niejednoznaczność w przypadku urządzeń wejściowych, które składają się z myszy i touchpada. W takim przypadku panel dotykowy nie służy do sterowania wskaźnikiem, ponieważ steruje nim już mysz. - W przeciwnym razie typ urządzenia jest ustawiony na wskaźnik. Dzięki temu domyślnemu ustawieniu panele dotykowe, które nie mają przypisanego innego specjalnego celu, kontrolują kursor.
Przyciski
Przyciski to opcjonalne elementy sterujące, których aplikacje mogą używać do wykonywania dodatkowych funkcji. Przyciski na urządzeniach dotykowych działają podobnie jak przyciski myszy i są używane głównie w przypadku urządzeń dotykowych typu wskaźnik lub rysików.
Obsługiwane są te przyciski:
BTN_LEFT
: przypisane doMotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: przypisane doMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: przypisane doMotionEvent.BUTTON_MIDDLE
.BTN_BACK
iBTN_SIDE
: zmapowane naMotionEvent.BUTTON_BACK
. Naciśnięcie tego przycisku spowoduje również syntezę naciśnięcia klawisza z kodem klawiszaKeyEvent.KEYCODE_BACK
.BTN_FORWARD
iBTN_EXTRA
: zmapowane naMotionEvent.BUTTON_FORWARD
. Naciśnięcie tego przycisku spowoduje również syntezę naciśnięcia klawisza z kodem klawiszaKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: przypisane doMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: przypisane doMotionEvent.BUTTON_TERTIARY
.
Narzędzia i typy narzędzi
Narzędzie to palec, rysik lub inne urządzenie służące do interakcji z urządzeniem dotykowym. Niektóre urządzenia dotykowe potrafią rozróżniać różne typy narzędzi.
W innych miejscach w Androidzie, np. w interfejsie API MotionEvent
, narzędzie jest często nazywane wskaźnikiem.
Obsługiwane są te typy narzędzi:
BTN_TOOL_FINGER
iMT_TOOL_FINGER
: zmapowane naMotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
iMT_TOOL_PEN
: zmapowane naMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_RUBBER
: przypisane doMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: przypisane doMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: przypisane doMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: przypisane doMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: przypisane doMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: przypisane doMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
iBTN_TOOL_QUADTAP
: mapowane naMotionEvent.TOOL_TYPE_FINGER
.
Nawigowanie kursorem a dotknięcie
Narzędzia mogą być w kontaktie z urządzeniem dotykowym lub znajdować się w zasięgu i unosić się nad nim. Nie wszystkie urządzenia dotykowe mogą wykrywać obecność narzędzia unoszonego nad urządzeniem dotykowym. Te, które to umożliwiają, np. digitizery na podstawie sygnału radiowego, często wykrywają, kiedy narzędzie znajduje się w ograniczonym zasięgu digitizera.
Komponent InputReader
odróżnia narzędzia dotykowe od narzędzi do nawigacji. Podobnie narzędzia dotykowe i narzędzia do najeżdżania są zgłaszane do aplikacji na różne sposoby.
Narzędzia dotykowe są zgłaszane aplikacjom jako zdarzenia dotykowe za pomocą MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
i MotionEvent.ACTION_POINTER_UP
.
Narzędzia do nawigacji są zgłaszane aplikacjom jako zdarzenia ruchu za pomocą parametrów 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 oraz przycisków, które obsługują. Rejestrowanie nieobsługiwanych osi lub kodów klawiszy może dezorientować algorytm klasyfikacji urządzenia lub spowodować, że system nieprawidłowo wykryje możliwości urządzenia. Jeśli na przykład urządzenie zgłasza kod klawisza
BTN_TOUCH
, system zakłada, żeBTN_TOUCH
jest zawsze używane do wskazywania, czy narzędzie dotyka ekranu. Dlatego nie należy używać znakuBTN_TOUCH
, aby wskazać, że narzędzie znajduje się w zakresie i jest tylko najeżdżane. - Urządzenia jednodotykowe używają tych zdarzeń wejściowych w systemie Linux:
ABS_X
: (WYMAGANE) zwraca współrzędną X narzędzia.ABS_Y
: (WYMAGANE) zwraca współrzędną Y narzędzia.ABS_PRESSURE
: (opcjonalnie) raportuje nacisk fizyczny na końcówkę narzędzia lub siłę sygnału dotykowego.ABS_TOOL_WIDTH
: (opcjonalnie) zwraca pole przekroju lub szerokość punktu styczności z dotykiem lub samego narzędzia.ABS_DISTANCE
: (opcjonalnie) zwraca odległość narzędzia od powierzchni urządzenia dotykowego.ABS_TILT_X
: (opcjonalnie) zwraca pochylenie narzędzia względem powierzchni urządzenia dotykowego wzdłuż osi X.ABS_TILT_Y
: (opcjonalnie) zwraca pochylenie narzędzia względem powierzchni urządzenia dotykowego wzdłuż osi Y.BTN_TOUCH
: (WYMAGANE) wskazuje, czy narzędzie dotyka urządzenia.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcjonalnie) stany przycisku w raportach.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (opcjonalnie) Raportuje typ narzędzia.
- Urządzenia wielodotykowe używają tych zdarzeń wejściowych w systemie Linux:
ABS_MT_POSITION_X
: (WYMAGANE) zwraca współrzędną X narzędzia.ABS_MT_POSITION_Y
: (WYMAGANE) zwraca współrzędną Y narzędzia.ABS_MT_PRESSURE
: (opcjonalnie) raportuje nacisk fizyczny na końcówkę narzędzia lub siłę sygnału dotykowego.ABS_MT_TOUCH_MAJOR
: (opcjonalnie) raportuje pole przekroju powierzchni dotykowej lub długość dłuższego wymiaru powierzchni dotykowej.ABS_MT_TOUCH_MINOR
: (opcjonalnie) zwraca długość krótszego wymiaru punktu styczności. Tej osi nie należy używać, jeśli parametrABS_MT_TOUCH_MAJOR
raportuje pomiar powierzchni.ABS_MT_WIDTH_MAJOR
: (opcjonalnie) zwraca pole przekroju narzędzia lub długość dłuższego wymiaru narzędzia. Nie używaj tej osi, chyba że znasz wymiary samego narzędzia.ABS_MT_WIDTH_MINOR
: (opcjonalnie) raportuje długość krótszego wymiaru narzędzia. Nie należy używać tej osi, jeśliABS_MT_WIDTH_MAJOR
podaje pomiar powierzchni lub jeśli wymiary narzędzia są nieznane.ABS_MT_ORIENTATION
: (opcjonalnie) zwraca orientację narzędzia.ABS_MT_DISTANCE
: (opcjonalnie) zwraca odległość narzędzia od powierzchni urządzenia dotykowego.ABS_MT_TOOL_TYPE
: (opcjonalnie) raportuje typ narzędzia jakoMT_TOOL_FINGER
lubMT_TOOL_PEN
.ABS_MT_TRACKING_ID
: (opcjonalnie) zwraca identyfikator śledzenia narzędzia. Identyfikator śledzenia to dowolna nieujemna liczba całkowita, która służy do identyfikowania i śledzenia każdego narzędzia niezależnie, gdy aktywne jest kilka narzędzi. Jeśli na przykład kilka palców dotyka urządzenia, do każdego z nich należy przypisać osobny identyfikator śledzenia, który jest używany, dopóki palec pozostaje w kontaktie z urządzeniem. Identyfikatory śledzenia można ponownie użyć, gdy powiązane z nimi narzędzia znajdą się poza zasięgiem.ABS_MT_SLOT
: (opcjonalnie) zwraca identyfikator slotu narzędzia, gdy używany jest protokół wielodotykowy „B” dla systemu Linux. Więcej informacji znajdziesz w dokumentacji dotyczącej protokołu wielodotykowego Linux.BTN_TOUCH
: (WYMAGANE) wskazuje, czy narzędzie dotyka urządzenia.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcjonalnie) stany przycisku w raportach.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (opcjonalnie) Raportuje typ narzędzia.
- Jeśli zdefiniowane są osie dla protokołów jedno- i wielodotykowych, używane są tylko osie wielodotykowe, a osie jednodotykowe są ignorowane.
Minimalne i maksymalne wartości osi
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
iABS_MT_POSITION_Y
określają granice aktywnej powierzchni urządzenia w jednostkach powierzchni zależnych od urządzenia. W przypadku ekranu dotykowego aktywny obszar to część urządzenia dotykowego, która faktycznie pokrywa wyświetlacz.W przypadku ekranu dotykowego system automatycznie interpoluje zgłaszane pozycje dotyku w jednostkach powierzchni, aby uzyskać pozycje dotyku w pikselach wyświetlacza zgodnie z tę formułą:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Ekran dotykowy może rejestrować dotknięcia poza obszarem zgłoszonym jako aktywny.
Dotknięcia rozpoczęte poza obszarem aktywnym nie są przesyłane do aplikacji, ale można ich używać do obsługi klawiszy wirtualnych.
Dotknięcia rozpoczęte w aktywnej części ekranu lub wchodzące w obszar wyświetlania i z niego wychodzące są przesyłane do aplikacji. W konsekwencji, jeśli dotyk rozpoczyna się w ograniczeniach aplikacji, a potem przesuwa się poza aktywny obszar, aplikacja może odbierać zdarzenia dotyku z współrzędnymi wyświetlacza o ujemnych wartościach lub wykraczające poza granice wyświetlacza. Jest to prawidłowe działanie.
Urządzenie dotykowe nie powinno nigdy ograniczać współrzędnych dotykowych do granic aktywnego obszaru. Jeśli dotyk wykracza poza aktywny obszar, powinien być zgłoszony jako wykraczający poza aktywny obszar lub nie powinien być zgłaszany wcale.
Jeśli na przykład palec użytkownika dotyka ekranu dotykowego w pobliżu lewego górnego rogu, współrzędne mogą być podawane jako (minX, minY). Jeśli palec będzie się nadal oddalać od aktywnego obszaru, ekran dotykowy powinien zacząć raportować współrzędne z wartościami mniejszymi niż minX i minY, np. (minX – 2, minY – 3), lub całkowicie przestać raportować dotyk. Inaczej mówiąc, ekran dotykowy nie powinien przekazywać danych (minX, minY), gdy palec użytkownika dotyka obszaru poza obszarem aktywnym.
Przycinanie współrzędnych dotykowych do krawędzi wyświetlacza tworzy sztuczną twardą krawędź wokół krawędzi ekranu, która uniemożliwia systemowi płynne śledzenie ruchów, które wchodzą lub wychodzą poza obszar wyświetlacza.
Wartości zgłaszane przez
ABS_PRESSURE
lubABS_MT_PRESSURE
(jeśli w ogóle są zgłaszane) muszą być różne od 0, gdy narzędzie dotyka urządzenia, a w przeciwnym razie muszą być równe 0, co oznacza, że narzędzie się unosi.Raportowanie informacji o ciśnieniu jest opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą używać informacji o ciśnieniu do implementowania rysowania wrażliwego na nacisk i innych efektów.
Wartości zwracane przez
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
lubABS_MT_WIDTH_MINOR
powinny być różne od 0, gdy narzędzie dotyka urządzenia, a w przeciwnym razie powinny być równe 0. Nie jest to jednak wymagane. Na przykład urządzenie dotykowe może mierzyć rozmiar dotyku palcem, ale nie dotyku rysika.Raportowanie informacji o rozmiarze jest opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą używać informacji o ciśnieniu do implementowania rysowania zależnego od rozmiaru i innych efektów.
Wartości zwracane przez
ABS_DISTANCE
lubABS_MT_DISTANCE
powinny zbliżać się do zera, gdy narzędzie dotyka urządzenia. Odległość może być niezerowa nawet wtedy, gdy narzędzie jest w bezpośrednim kontakcie. Dokładne wartości zależą od sposobu pomiaru odległości przez sprzęt.Raportowanie informacji o odległości jest opcjonalne, ale zalecane w przypadku urządzeń ze stycznym.
Wartości zwracane przez
ABS_TILT_X
iABS_TILT_Y
powinny być równe zeru, gdy narzędzie jest prostopadłe do urządzenia. Nachylenie inne niż zero oznacza, że narzędzie jest trzymane pod kątem.Kąty pochylenia wzdłuż osi X i Y są podawane w stopniach w stosunku do prostopadłości. Punkt środkowy (idealnie prostopadły) jest podany przez
(max + min) / 2
dla każdej osi. Wartości mniejsze niż punkt środkowy oznaczają pochylenie w górę lub w lewo, a wartości większe niż punkt środkowy oznaczają pochylenie w dół lub w prawo.InputReader
przekształca składowe pochylenia X i Y w prostopadłe kąt pochylenia w zakresie od 0 doPI / 2
radianów oraz kąt orientacji w płaszczyźnie w zakresie od-PI
doPI
radianów. Takie przedstawienie powoduje, że opis orientacji jest zgodny z tym, co jest używane do opisu dotyku palcem.Raportowanie informacji o przechyleniu jest opcjonalne, ale zalecane w przypadku urządzeń ze sterowaniem dotykowym.
Jeśli typ narzędzia jest raportowany przez
ABS_MT_TOOL_TYPE
, zastępuje on wszystkie informacje o typie narzędzia raportowane przezBTN_TOOL_*
. Jeśli nie ma żadnych informacji o typie narzędzia, domyślnie jest toMotionEvent.TOOL_TYPE_FINGER
.Aktywność narzędzia określana jest na podstawie tych warunków:
W przypadku protokołu jednodotykowego narzędzie jest aktywne, jeśli
BTN_TOUCH
lubBTN_TOOL_*
ma wartość 1.To założenie zakłada, że
InputReader
musi mieć co najmniej pewne informacje o charakterze narzędzia, na przykład o tym, czy jest ono dotykane, lub przynajmniej o jego typie. Jeśli nie ma żadnych informacji, narzędzie jest uznawane za nieaktywne (poza zakresem).- Gdy używasz protokołu wielodotykowego „A”, narzędzie jest aktywne, gdy jest widoczne w najnowszym raporcie synchronizacji. Gdy narzędzie przestanie się pojawiać w raportach synchronizacji, przestanie istnieć.
- Gdy używasz protokołu wielodotykowego „B”, narzędzie jest aktywne, dopóki ma aktywny slot. Gdy slot zostanie zwolniony, narzędzie przestaje istnieć.
- Na podstawie tych warunków określa się, że kursor znajduje się nad elementem:
- Jeśli narzędzie jest
BTN_TOOL_MOUSE
lubBTN_TOOL_LENS
, to nie jest ono najeżdżane, nawet jeśli spełniony jest co najmniej jeden z tych warunków. - Jeśli narzędzie jest aktywne i przekazuje informacje o ciśnieniu, a przekazywany nacisk wynosi 0, oznacza to, że narzędzie jest wstrzymane.
- Jeśli narzędzie jest aktywne i sterownik obsługuje kod klucza
BTN_TOUCH
, a wartośćBTN_TOUCH
wynosi 0, oznacza to, że narzędzie jest najeżdżane.
- Jeśli narzędzie jest
InputReader
obsługuje protokół wielodotykowy „A” i „B”. Nowe sterowniki powinny używać protokołu „B”, ale oba działają.Od Androida 4.0 sterowniki ekranu dotykowego mogą wymagać zmiany, aby były zgodne ze specyfikacją protokołu wejściowego Linuxa.
Może być konieczne wprowadzenie tych zmian:
Gdy narzędzie stanie się nieaktywne (palec jest „podniesiony”), nie powinno już pojawiać się w kolejnych raportach synchronizacji wielodotykowej. Gdy wszystkie narzędzia są nieaktywne (wszystkie palce są „w górze”), kierowca powinien wysłać pusty pakiet raportu synchronizacji, na przykład
SYN_MT_REPORT
, a następnieSYN_REPORT
.W poprzednich wersjach Androida zdarzenie „w górę” było zgłaszane przez wysłanie wartości ciśnienia 0. Stare zachowanie było niezgodne ze specyfikacją protokołu wejściowego Linuxa i nie jest już obsługiwane.
Informacje o fizycznym nacisku lub sile sygnału należy zgłaszać za pomocą elementu
ABS_MT_PRESSURE
.W poprzednich wersjach Androida informacje o ciśnieniu były pobierane z
ABS_MT_TOUCH_MAJOR
. Stare zachowanie było niezgodne ze specyfikacją protokołu wejściowego Linuxa i nie jest już obsługiwane.- Informacje o rozmiarze dotyku należy zgłaszać za pomocą funkcji
ABS_MT_TOUCH_MAJOR
.W poprzednich wersjach Androida informacje o rozmiarze były pobierane z plików
ABS_MT_TOOL_MAJOR
. Stare zachowanie było niezgodne ze specyfikacją protokołu wejściowego Linuxa i nie jest już obsługiwane.
Obsługa urządzenia dotykowego
Poniżej znajdziesz krótkie podsumowanie obsługi urządzenia dotykowego na Androidzie.
EventHub
odczytuje nieprzetworzone zdarzenia z sterownikaevdev
.InputReader
pobiera nieprzetworzone zdarzenia i aktualizuje stan wewnętrzny dotyczący pozycji oraz innych właściwości każdego narzędzia. Sprawdza też stany przycisków.- Jeśli przycisk Wstecz lub Do przodu został wciśnięty lub zwolniony,
InputReader
powiadomiInputDispatcher
o kluczowym zdarzeniu. InputReader
określa, czy nastąpiło naciśnięcie wirtualnego klawisza. Jeśli tak, powiadamiaInputDispatcher
o kluczowym zdarzeniu.InputReader
określa, czy dotknięcie zostało zainicjowane w ramach wyświetlacza. Jeśli tak, wysyła powiadomienieInputDispatcher
o zdarzeniu dotknięcia.- Jeśli nie ma narzędzi dotykowych, ale jest co najmniej 1 narzędzie do nawigacji,
InputReader
powiadamiaInputDispatcher
o zdarzeniu nawigacji. - Jeśli typ urządzenia dotykowego to wskaźnik,
InputReader
wykonuje wykrywanie gestów wskaźnika, przesuwa wskaźnik i odpowiednio go zaznacza oraz powiadamiaInputDispatcher
o zdarzeniu wskaźnika. InputDispatcher
używaWindowManagerPolicy
, aby określić, czy zdarzenia mają być wysyłane i czy mają budzić urządzenie. NastępnieInputDispatcher
przekazuje zdarzenia do odpowiednich aplikacji.
Konfiguracja urządzenia dotykowego
Działanie urządzenia dotykowego zależy od jego osi, przycisków, właściwości danych wejściowych, konfiguracji urządzenia wejściowego, mapy klawiszy wirtualnych i układu klawiszy.
Więcej informacji o plikach, które uczestniczą w konfiguracji klawiatury, znajdziesz w tych sekcjach:
Właściwości
System korzysta z wielu właściwości konfiguracji urządzenia wejściowego, aby skonfigurować i skalibrować działanie urządzenia dotykowego.
Jednym z powodów jest to, że sterowniki urządzeń dotykowych często raportują właściwości dotyku za pomocą jednostek specyficznych dla urządzenia.
Na przykład wiele urządzeń dotykowych mierzy obszar dotyku za pomocą wewnętrznej skali urządzenia, takiej jak łączna liczba węzłów czujnika, które zostały wyzwolone przez dotyk. Ta wartość nie ma znaczenia dla aplikacji, ponieważ muszą one znać rozmiar fizyczny i inne cechy węzłów czujników urządzenia dotykowego.
System używa parametrów kalibracji zakodowanych w plikach konfiguracji urządzenia wejściowego do dekodowania, przekształcania i normalizowania wartości zgłaszanych przez urządzenie dotykowe w prostszą standardową reprezentację, którą mogą odczytać aplikacje.
Konwencje dokumentacji
W dokumentacji używamy tych konwencji do opisu wartości używanych przez system podczas procesu kalibracji.
Nieprzetworzone wartości osi
Wyrażenia poniżej oznaczają wartości nieprzetworzone przesyłane przez sterownik urządzenia dotykowego jako zdarzenia EV_ABS
.
raw.x
- Wartość osi
ABS_X
lubABS_MT_POSITION_X
. raw.y
- Wartość osi
ABS_Y
lubABS_MT_POSITION_Y
. raw.pressure
- Wartość osi
ABS_PRESSURE
lubABS_MT_PRESSURE
albo 0, jeśli nie jest dostępna. raw.touchMajor
- Wartość osi
ABS_MT_TOUCH_MAJOR
lub 0, jeśli nie jest dostępna. raw.touchMinor
- Wartość osi
ABS_MT_TOUCH_MINOR
lubraw.touchMajor
, jeśli ta pierwsza jest niedostępna. raw.toolMajor
- Wartość osi
ABS_TOOL_WIDTH
lubABS_MT_WIDTH_MAJOR
albo 0, jeśli nie jest dostępna. raw.toolMinor
- Wartość osi
ABS_MT_WIDTH_MINOR
lubraw.toolMajor
, jeśli ta pierwsza jest niedostępna. raw.orientation
- Wartość osi
ABS_MT_ORIENTATION
lub 0, jeśli nie jest dostępna. raw.distance
- Wartość osi
ABS_DISTANCE
lubABS_MT_DISTANCE
albo 0, jeśli nie jest dostępna. raw.tiltX
- Wartość osi
ABS_TILT_X
lub 0, jeśli nie jest dostępna. raw.tiltY
- Wartość osi
ABS_TILT_Y
lub 0, jeśli jest niedostępna.
Zakresy osi surowych
Poniższe wyrażenia oznaczają granice wartości nieprzetworzonych. Można je uzyskać, wywołując ioctl EVIOCGABS
dla każdej osi.
raw.*.min
- Wartość minimalna osi nieprzetworzonej z uwzględnieniem zakresu.
raw.*.max
- Maksymalna wartość osi nieprzetworzonej włącznie.
raw.*.range
- Odpowiednik:
raw.*.max - raw.*.min
. raw.*.fuzz
- Dokładność osi surowej. Przykładowo fuzz = 1 oznacza, że wartości są dokładne do +/- 1 jednostki.
raw.width
- Szerokość obszaru dotykowego, która obejmuje
raw.x.range + 1
. raw.height
- Wysokość obszaru dotykowego, równa
raw.y.range + 1
.
Zakresy wyjściowe
Wyrażenia poniżej określają właściwości wyjściowego układu współrzędnych. System 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ą przekazywane aplikacjom, np. piksele wyświetlacza.
output.width
- Szerokość danych wyjściowych. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to szerokość wyświetlacza w pikselach. W przypadku paneli dotykowych (niepowiązanych z ekranem) szerokość wyjściowa jest równa
raw.width
, co oznacza, że nie jest wykonywana żadna interpolacja. output.height
- Wysokość danych wyjściowych. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to wysokość wyświetlacza w pikselach. W przypadku paneli dotykowych (niepowiązanych z wyświetlaczem) wysokość wyjściowa wynosi
raw.height
, co oznacza, że nie jest wykonywana żadna interpolacja. output.diag
- Długość przekątnej w wyjściowym układzie współrzędnych, równa
sqrt(output.width ^2 + output.height ^2)
.
Podstawowa konfiguracja
Aby określić wartości kalibracji, mapper dotykowego wejścia korzysta z wielu właściwości konfiguracji w pliku konfiguracji urządzenia wejściowego. W tabeli poniżej opisano niektóre właściwości konfiguracji ogólnego przeznaczenia. Wszystkie pozostałe właściwości są opisane w następnych sekcjach wraz z pola, których używa się do ich kalibracji.
touch.deviceType
Definicja: touch.deviceType
= touchScreen
|
touchPad
| pointer
| default
Określa typ urządzenia dotykowego.
-
Jeśli wartość to
touchScreen
, urządzenie dotykowe to ekran dotykowy powiązany z ekranem. -
Jeśli wartość to
touchPad
, urządzenie dotykowe to panel dotykowy, który nie jest powiązany z ekranem. -
Jeśli wartość to
pointer
, urządzenie dotykowe to panel dotykowy niekojarzony z ekranem, a jego ruchy są używane do bezpośrednich gestów wskaźnika wielodotykowego. -
Jeśli wartość to
default
, system automatycznie wykrywa typ urządzenia na podstawie algorytmu klasyfikacji.
Więcej informacji o tym, jak typ urządzenia wpływa na działanie urządzenia dotykowego, znajdziesz w sekcji Klasyfikacja.
W Androidzie 3 i starszych wszystkie urządzenia dotykowe były uznawane za urządzenia z ekranem dotykowym.
touch.orientationAware
Definicja: touch.orientationAware
= 0
| 1
Określa, czy urządzenie dotykowe ma reagować na zmiany orientacji wyświetlacza.
-
Jeśli wartość to
1
, pozycje dotyku zgłaszane przez urządzenie dotykowe są obracane za każdym razem, gdy zmienia się orientacja wyświetlacza. -
Jeśli wartość jest
0
, pozycje dotyku zgłaszane przez urządzenie dotykowe są odporne na zmiany orientacji wyświetlacza.
Jeśli urządzenie ma ekran dotykowy, wartość domyślna to 1
, w przeciwnym razie – 0
.
System rozróżnia ekrany dotykowe wewnętrzne i zewnętrzne. Orientacja wewnętrznego ekranu dotykowego jest zależna od orientacji wewnętrznego wyświetlacza. Zewnętrzny ekran dotykowy z uwzględnieniem orientacji jest obracany na podstawie orientacji wyświetlacza zewnętrznego.
Orientacja jest używana do obsługi obracania ekranów dotykowych na urządzeniach takich jak Nexus One. Na przykład po obróceniu urządzenia o 90 stopni zgodnie z kierunkiem wskazówek zegara względem jego naturalnej orientacji, bezwzględne pozycje dotyku są przemapowywane w taki sposób, że dotknięcie w lewym górnym rogu bezwzględnego układu współrzędnych ekranu dotykowego jest rejestrowane jako dotknięcie w lewym górnym rogu obranego układu współrzędnych wyświetlacza. Dzięki temu dotknięcia są raportowane w tym samym układzie współrzędnych, którego aplikacje używają do rysowania elementów wizualnych.
Przed Honeycomb założenie było takie, że wszystkie urządzenia dotykowe są świadome orientacji.
touch.gestureMode
Definicja: touch.gestureMode
= pointer
| spots
|
default
Określa tryb prezentacji gestów wskaźnika. Ta właściwość konfiguracji ma znaczenie tylko wtedy, gdy urządzenie dotykowe ma typ wskaźnik.
-
Jeśli wartość to
pointer
, gesty na panelu dotykowym są wyświetlane za pomocą kursora podobnego do wskaźnika myszy. -
Jeśli wartość to
spots
, gesty na panelu dotykowym są reprezentowane przez punkt kotwiczenia, który reprezentuje środek gestu, oraz zestaw punktów okrągłych, które reprezentują położenie poszczególnych palców.
Wartość domyślna to pointer
, jeśli właściwość wejściowa INPUT_PROP_SEMI_MT
jest ustawiona, lub spots
w przeciwnym razie.
Pola X i Y
Pola X i Y zawierają informacje o pozycji środka obszaru kontaktu.
Obliczenia
Obliczenie jest proste: informacje o pozycji z sterownika dotykowego są interpolowane liniowo w systemie współrzędnych wyjściowych.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
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 narzędzia w jednostkach wyjściowych (pikselach).
Pole size
opisuje znormalizowany rozmiar dotyku w stosunku do największego możliwego dotyku, jaki może wykryć urządzenie dotykowe. Najmniejszy możliwy znormalizowany rozmiar to 0,0 (brak kontaktu lub niemożliwość pomiaru), a największy możliwy znormalizowany rozmiar to 1,0 (obszar czujnika jest nasycony).
Jeśli można zmierzyć przybliżoną długość i szerokość, pole touchMajor
określa dłuższy wymiar, a pole touchMinor
krótszy wymiar pola styczności. Jeśli można zmierzyć tylko przybliżony średnicę pola styku, pola touchMajor
i touchMinor
są równe.
Podobnie pole toolMajor
określa dłuższy wymiar, a pole toolMinor
– krótszy wymiar przekroju narzędzia.
Jeśli rozmiar dotyku jest niedostępny, ale rozmiar narzędzia jest dostępny, rozmiar narzędzia jest ustawiany na równy rozmiarowi dotyku. Jeśli natomiast rozmiar narzędzia jest niedostępny, a rozmiar dotykowy – dostępny, rozmiar dotykowy jest ustawiany na równy rozmiarowi narzędzia.
Urządzenia dotykowe mierzą lub podają rozmiary dotyku i narzędzi na różne sposoby. Obecna implementacja obsługuje 3 rodzaje pomiarów: średnicę, powierzchnię i geometryczny prostokąt ograniczający w jednostkach powierzchni.
Definicja: touch.size.calibration
= none
|
geometric
| diameter
| area
| default
Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania rozmiaru dotyku i rozmiaru narzędzia.
-
Jeśli wartością jest
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 on skalowany w ten sam sposób. -
Jeśli wartość to
diameter
, przyjmuje się, że rozmiar jest proporcjonalny do średnicy (szerokości) dotyku lub narzędzia. -
Jeśli wartość to
area
, przyjmuje się, że rozmiar jest proporcjonalny do obszaru dotyku lub narzędzia. -
Jeśli wartość to
default
, system używa kalibracjigeometric
, jeśli ośraw.touchMajor
lubraw.toolMajor
jest dostępna. W przeciwnym razie używa kalibracjinone
.
touch.size.scale
Definicja: touch.size.scale
= <dodatnia liczba zmiennoprzecinkowa>
Określa stały współczynnik skalowania używany w kalibracji.
Wartość domyślna to 1.0
.
touch.size.bias
Definicja: touch.size.bias
= <dodatnia liczba zmiennoprzecinkowa>
Określa stałą wartość przesunięcia używaną w kalibracji.
Wartość domyślna to 0.0
.
touch.size.isSummed
Definicja: touch.size.isSummed
= 0
| 1
Określa, czy rozmiar jest raportowany jako suma rozmiarów wszystkich aktywnych kontaktów, czy jest raportowany osobno dla każdego kontaktu.
-
Jeśli wartość to
1
, podany rozmiar jest dzielony przez liczbę kontaktów przed ich użyciem. -
Jeśli wartością jest
0
, podany rozmiar jest używany bez zmian.
Wartość domyślna to 0
.
Niektóre urządzenia dotykowe, zwłaszcza urządzenia „Semi-MT”, nie mogą rozróżniać poszczególnych wymiarów wielu kontaktów, więc podają rozmiar, który reprezentuje ich łączną powierzchnię lub szerokość. Ta właściwość powinna być ustawiona na 1
tylko w przypadku takich urządzeń. W razie wątpliwości ustaw tę wartość na 0
.
Obliczenia
Obliczanie pól touchMajor
, touchMinor
, toolMajor
, 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 fizyczny nacisk na urządzenie dotykowe jako wartość znormalizowana w zakresie od 0,0 (brak dotyku) do 1,0 (normalny nacisk).
Zerowe ciśnienie oznacza, że narzędzie jest w stanie zawieszenia.
touch.pressure.calibration
Definicja: touch.pressure.calibration
= none
|
physical
| amplitude
| default
Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania ciśnienia.
-
Jeśli wartość to
none
, ciśnienie jest nieznane, więc jest ustawiane na 1,0 podczas dotykania i 0,0 podczas najeżdżania kursorem. -
Jeśli wartość to
physical
, przyjmuje się, że oś nacisku mierzy rzeczywistą intensywność nacisku fizycznego na panel dotykowy. -
Jeśli wartość to
amplitude
, przyjmuje się, że oś ciśnienia służy do pomiaru amplitudy sygnału, która jest związana z wielkością kontaktu i stosowanym ciśnieniem. -
Jeśli wartość to
default
, system używa kalibracjiphysical
, jeśli dostępna jest oś ciśnienia, w przeciwnym razie używa kalibracjinone
.
touch.pressure.scale
Definicja: touch.pressure.scale
= <dodatnia liczba zmiennoprzecinkowa>
Określa stały współczynnik skalowania używany w kalibracji.
Wartość domyślna to 1.0 / raw.pressure.max
.
Obliczenia
Obliczenie pola pressure
zależy od podanych parametrów kalibracji.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
pola orientacji i przechylenia.
Pole orientation
opisuje orientację dotyku i narzędzie jako kąt. Orientacja 0
wskazuje, że główna oś jest zorientowana pionowo, -PI/2
wskazuje, że główna oś jest zorientowana w lewo, a PI/2
wskazuje, że główna oś jest zorientowana w prawo. Gdy używany jest rysownik, zakres orientacji można opisać w zakresie pełnego koła od -PI
do PI
.
Pole tilt
określa nachylenie narzędzia jako pomiar kątowy.
Kąt 0
wskazuje, że narzędzie jest prostopadłe do powierzchni.
Kąt PI/2
oznacza, że narzędzie jest płaskie na powierzchni.
touch.orientation.calibration
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 ustawiona jest na 0. - Jeśli wartość to
interpolated
, orientacja jest interpolowana liniowo, tak aby wartość bezwzględnaraw.orientation.min
została zmapowana na-PI/2
, a wartość bezwzględnaraw.orientation.max
naPI/2
. Wartość środkowa kolumny(raw.orientation.min + raw.orientation.max) / 2
jest mapowana na kolumnę0
. - Jeśli wartość to
vector
, orientacja jest interpretowana jako skompresowany wektor składający się z 2 4-bitowych pól ze znakiem. Ta reprezentacja jest używana w elementach protokołu Atmel Object Based Protocol. Po dekodowaniu wektor zwraca kąt orientacji i poziom ufności. Poziom ufności służy do skalowania informacji o rozmiarze, chyba że jest ono geometryczne. - Jeśli wartość to
default
, system używa kalibracjiinterpolated
, jeśli oś orientacji jest dostępna, w przeciwnym razie używanone
.
Obliczenia
Obliczenie pól orientation
i tilt
zależy od określonych parametrów kalibracji i dostępnego wejścia.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
pole „odległość”
Pole distance
określa odległość między narzędziem a powierzchnią urządzenia dotykowego. Wartość 0,0 oznacza bezpośredni kontakt, a większe wartości – coraz większą odległość od powierzchni.
touch.distance.calibration
Definicja: touch.distance.calibration
= none
|
scaled
| default
Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania odległości.
-
Jeśli wartość to
none
, odległość jest nieznana, więc ustawiona jest na 0. -
Jeśli wartość to
scaled
, podana odległość jest mnożona przez stały współczynnik skali. -
Jeśli wartość to
default
, system używa kalibracjiscaled
, jeśli oś odległości jest dostępna, w przeciwnym razie używanone
.
touch.distance.scale
Definicja: touch.distance.scale
= <dodatnia liczba zmiennoprzecinkowa>
Określa stały współczynnik skalowania używany w kalibracji.
Wartość domyślna to 1.0
.
Obliczenia
Obliczenie pola distance
zależy od podanych parametrów kalibracji.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Przykład
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Uwagi dotyczące zgodności
Właściwości konfiguracji urządzeń dotykowych zostały znacznie zmienione w Androidzie Ice Cream Sandwich 4.0. Aby używać nowych właściwości konfiguracji, należy zaktualizować wszystkie pliki konfiguracji urządzeń dotykowych.
Może też być konieczna aktualizacja sterowników starszych urządzeń dotykowych.
Pliki mapy klawiszy wirtualnych
Klawisze wirtualne można implementować na urządzeniach dotykowych.
Można to zrobić na kilka sposobów, w zależności od możliwości kontrolera dotykowego. Niektóre sterowniki dotykowe można skonfigurować bezpośrednio, aby implementowały klawisze dotykowe przez ustawienie rejestrów oprogramowania układowego. Czasami jednak konieczne jest przekształcenie współrzędnych dotykowych na kody klawiszy w oprogramowaniu.
Gdy klucze wirtualne są implementowane w oprogramowaniu, jądro musi wyeksportować plik mapy klucza wirtualnego o nazwie virtualkeys.<devicename>
jako właściwość płytki. Jeśli na przykład sterowniki urządzenia z ekranem dotykowym podają nazwę „touchyfeely”, to plik mapy klawiszy wirtualnych musi mieć ścieżkę/sys/board_properties/virtualkeys.touchyfeely
.
Plik mapy klawiszy wirtualnych zawiera współrzędne i kody klawiszy Linuxa odpowiadające wirtualnym klawiszom na ekranie dotykowym.
Oprócz pliku mapy klawiszy wirtualnych musisz mieć odpowiedni plik układu klawiszy i plik mapy znaków klawiszy, aby mapować kody klawiszy Linux na kody klawiszy Androida oraz określić typ urządzenia klawiatury (zwykle SPECIAL_FUNCTION
).
Składnia
Plik mapy kluczy wirtualnych to zwykły plik tekstowy zawierający sekwencję opisów układu klucza wirtualnego, oddzielonych znakami końca wiersza lub dwukropkami.
Linie komentarzy zaczynają się od znaku „#” i trwają do końca linii.
Każdy klucz wirtualny jest opisany przez 6 komponentów oddzielonych dwukropkiem:
0x01
: kod wersji. Musi to być wartość0x01
.- <Linux key code>: kod klucza Linuksa dla klucza wirtualnego.
- <centerX>: współrzędna X środka klucza wirtualnego.
- <centerY>: współrzędna Y środka klawisza wirtualnego.
- <width>: szerokość klawisza wirtualnego w pikselach.
- <height>: wysokość klawisza wirtualnego w pikselach.
Wszystkie współrzędne i rozmiary są określane w systemie współrzędnych wyświetlacza.
Oto plik mapy klucza wirtualnego zapisany w jednym wierszu.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
Ten sam plik mapy klucza wirtualnego może też być zapisany na kilku wierszach.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
W tym przykładzie ekran dotykowy ma rozdzielczość 480 x 800. W związku z tym wszystkie klawisze wirtualne mają współrzędną <centerY> 835, która jest nieco poniżej widocznego obszaru ekranu dotykowego.
Pierwszy klucz ma kod skanowania Linuxa 158
(KEY_BACK
), współrzędną centerX 55
, współrzędną centerY 835
, szerokość 90
i wysokość 55
.
Przykład
Plik mapy klucza wirtualnego: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Plik układu klawiszy: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Plik mapy kluczy: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Gesty pośrednie z użyciem wskaźnika wielodotykowego
W trybie wskaźnika system interpretuje te gesty:
- Kliknięcie 1 palcem: kliknięcie.
- Ruch jednym palcem: przesuwanie wskaźnika.
- Ruch jednym palcem plus naciśnięcie przycisku: przeciągnij wskaźnik.
- 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 w tym samym lub różnych kierunkach: przesuwanie, powiększanie lub obracanie obszaru wokół wskaźnika. Sam wskaźnik się nie porusza.
- Ruch wieloma palcami: gest swobodny.
Odrzucenie palmy
Od Androida 13 system może automatycznie odrzucać dane wejściowe z dłoni, gdy wbudowany framework jest włączony. Wciąż obsługiwane są rozwiązania niestandardowe, które zostały opracowane wewnętrznie, ale mogą wymagać modyfikacji, aby zwracały flagę TOOL_TYPE_PALM
, gdy wykryto dłoń. Wbudowany framework działa też w połączeniu z rozwiązaniami niestandardowymi.
Rzeczywisty model analizuje pierwsze 90 ms danych dotyczących gestów, bieżący wskaźnik oraz wskaźniki otaczające, a następnie sprawdza, jak daleko od krawędzi wyświetlacza znajdują się dotykowe punkty.
Następnie określa, które z wskaźników są dłońmi. Uwzględnia ona też rozmiar każdego kontaktu, jak podają wymiary touchMajor
i touchMinor
. Następnie framework Androida usuwa z potoku dotyku wskaźniki oznaczone jako dłonie.
Jeśli wskaźnik został już wysłany do aplikacji, system:
- (jeśli są inne aktywne wskaźniki) anuluje wskaźnik z ustawionymi wartościami
ACTION_POINTER_UP
iFLAG_CANCELED
. - (jeśli jest to jedyny wskaźnik) anuluje wskaźnik za pomocą
ACTION_CANCEL
.
Interfejs publiczny API, MotionEvent.FLAG_CANCELED
, wskazuje, że bieżące zdarzenie nie powinno wywoływać działania użytkownika. Ta flaga jest ustawiona w przypadku zarówno ACTION_CANCEL
, jak i ACTION_POINTER_UP
.
Jeśli wskaźnik dłoni nie został wysłany do aplikacji, system po prostu go odrzuca.
Włączanie funkcji odrzucania dłoni
- W sterowniku dotykowym użyj makra
input_abs_set_res
, aby ustawić rozdzielczości dla tych pól (jednostki to piksele na mm):ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
Obsługa
ABS_MT_TOUCH_MINOR
jest opcjonalna. Jeśli jednak Twoje urządzenie obsługuje tę funkcję, sprawdź, czy rozdzielczość jest ustawiona prawidłowo. - Aby sprawdzić, czy pola są prawidłowo skonfigurowane, uruchom:
$ adb shell getevent -li
- Aby włączyć tę funkcję w czasie działania, uruchom:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Ponownie uruchom proces
system_server
.$ adb shell stop && adb shell start
- Sprawdź, czy
adb shell dumpsys input
pokazuje, że wUnwantedInteractionBlocker
są elementy odrzucające palce. Jeśli tak się nie stanie, sprawdź logi związane z danymi wejściowymi, aby znaleźć wskazówki dotyczące możliwej przyczyny błędu.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: {} - Aby na stałe włączyć tę funkcję, dodaj odpowiednie polecenie sysprop w pliku
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1