Android obsługuje różne ekrany dotykowe i touchpady, w tym tablety z digitizerem obsługiwane za pomocą rysika.
Ekrany dotykowe to urządzenia dotykowe powiązane z wyświetlaczem, dzięki czemu użytkownik ma wrażenie, że bezpośrednio manipuluje elementami na ekranie.
Touchpady to urządzenia dotykowe, które nie są powiązane z wyświetlaczem, np. tablet graficzny. Touchpady są zwykle używane do wskazywania lub do bezwzględnego pośredniego pozycjonowania albo sterowania interfejsem użytkownika za pomocą gestów.
Urządzenia dotykowe mogą mieć przyciski o funkcjach podobnych do przycisków myszy.
Urządzenia dotykowe można czasami obsługiwać za pomocą różnych narzędzi, takich jak palce lub rysik, w zależności od technologii czujnika dotykowego.
Urządzenia dotykowe są czasami używane do implementowania klawiszy wirtualnych. Na przykład w przypadku niektórych urządzeń z Androidem obszar czujnika ekranu dotykowego wykracza poza krawędź wyświetlacza i pełni podwójną funkcję jako część klawiatury dotykowej.
Ze względu na dużą różnorodność urządzeń dotykowych Android korzysta z wielu właściwości konfiguracyjnych, aby opisać charakterystykę i pożądane działanie każdego urządzenia.
Klasyfikacja urządzeń z ekranem dotykowym
Urządzenie wejściowe jest klasyfikowane jako urządzenie wielodotykowe, jeśli spełnia oba te warunki:
- Urządzenie wejściowe zgłasza obecność osi bezwzględnych
ABS_MT_POSITION_X
iABS_MT_POSITION_Y
. - Urządzenie wejściowe nie ma przycisków gamepada. Ten warunek rozwiązuje niejednoznaczność w przypadku niektórych gamepadów, które zgłaszają osie z kodami pokrywającymi się z kodami osi MT.
Urządzenie wejściowe jest klasyfikowane jako urządzenie jednodotykowe, jeśli spełnione są oba te warunki:
- Urządzenie wejściowe nie jest klasyfikowane jako urządzenie wielodotykowe. Urządzenie wejściowe jest klasyfikowane jako urządzenie obsługujące 1 lub wiele punktów dotyku, ale nigdy jako oba rodzaje.
- Urządzenie wejściowe zgłasza obecność osi bezwzględnych
ABS_X
iABS_Y
oraz kodu kluczaBTN_TOUCH
.
Gdy urządzenie wejściowe jest klasyfikowane jako urządzenie dotykowe, obecność klawiszy wirtualnych jest określana przez próbę wczytania pliku mapy klawiszy wirtualnych dla tego urządzenia. Jeśli dostępna jest wirtualna mapa klawiszy, ładowany jest też plik układu klawiszy urządzenia. Informacje o lokalizacji i formacie tych plików znajdziesz w sekcji [Pliki mapy klawiszy wirtualnych](#virtual-key-map-files).
Następnie system wczytuje plik konfiguracyjny urządzenia wejściowego dla urządzenia dotykowego.
Wszystkie wbudowane urządzenia dotykowe powinny mieć pliki konfiguracyjne urządzenia wejściowego. Jeśli nie ma pliku konfiguracyjnego urządzenia wejściowego, system wybiera domyślną konfigurację odpowiednią dla ogólnych urządzeń peryferyjnych dotykowych, takich jak zewnętrzne ekrany dotykowe USB lub Bluetooth HID czy touchpady. Te ustawienia domyślne nie są przeznaczone do wbudowanych ekranów dotykowych i mogą powodować nieprawidłowe działanie.
Po wczytaniu konfiguracji urządzenia wejściowego system klasyfikuje je jako ekran dotykowy, touchpad lub wskaźnik.
- Urządzenie z ekranem dotykowym służy do bezpośredniego manipulowania obiektami na ekranie. Użytkownik dotyka ekranu bezpośrednio, więc system nie wymaga żadnych dodatkowych elementów wskazujących obiekty, którymi się posługuje.
- Touchpad służy do przekazywania aplikacji informacji o bezwzględnym położeniu dotknięć w danym obszarze czujnika. Może być przydatne w przypadku tabletów z digitizerem.
- Urządzenie wskazujące służy do pośredniego manipulowania obiektami na ekranie za pomocą kursora. Palce są interpretowane jako gesty wskaźnika wielodotykowego. Inne narzędzia, takie jak rysiki, są interpretowane na podstawie pozycji bezwzględnych. Więcej informacji znajdziesz w sekcji Gesty wskaźnika wielodotykowego pośredniego.
Do klasyfikowania urządzenia wejściowego jako ekranu dotykowego, touchpada lub urządzenia wskazującego stosuje się te reguły:
- Jeśli właściwość
touch.deviceType
jest ustawiona, typ urządzenia jest ustawiany zgodnie z wskazaniem. - Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej
INPUT_PROP_DIRECT
(za pomocą ioctlEVIOCGPROP
), typ urządzenia jest ustawiany na ekran dotykowy. Ten warunek zakłada, że urządzenia wejściowe z bezpośrednim dotykiem są podłączone do wyświetlacza, który również jest połączony. - Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej
INPUT_PROP_POINTER
(za pomocą ioctlEVIOCGPROP
), typ urządzenia jest ustawiony na pointer. - Jeśli urządzenie wejściowe zgłasza obecność osi względnych
REL_X
lubREL_Y
, typ urządzenia jest ustawiany na touch pad (touchpad). Ten warunek rozwiązuje problem z niejednoznacznością w przypadku urządzeń wejściowych, które składają się zarówno z myszy, jak i z touchpada. W tym przypadku panel dotykowy nie służy do sterowania wskaźnikiem, ponieważ jest on już sterowany przez mysz. - W przeciwnym razie typ urządzenia jest ustawiony na wskaźnik. Domyślne ustawienie zapewnia, że touchpady, które nie mają żadnego innego specjalnego przeznaczenia, sterują wskaźnikiem.
Przyciski
Przyciski to opcjonalne elementy sterujące, których aplikacje mogą używać do wykonywania dodatkowych funkcji. Przyciski na urządzeniach dotykowych działają podobnie jak przyciski myszy i są przydatne głównie w przypadku urządzeń dotykowych typu wskaźnik lub rysika.
Obsługiwane są te przyciski:
BTN_LEFT
: zmapowano naMotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: zmapowano naMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: zmapowano naMotionEvent.BUTTON_MIDDLE
.BTN_BACK
iBTN_SIDE
: zmapowane naMotionEvent.BUTTON_BACK
. Naciśnięcie tego przycisku powoduje również wygenerowanie naciśnięcia klawisza z kodem klawiszaKeyEvent.KEYCODE_BACK
.BTN_FORWARD
iBTN_EXTRA
: zmapowane naMotionEvent.BUTTON_FORWARD
. Naciśnięcie tego przycisku powoduje również wygenerowanie naciśnięcia klawisza z kodemKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: zmapowano naMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: zmapowano naMotionEvent.BUTTON_TERTIARY
.
Narzędzia i ich rodzaje
Narzędzie to palec, rysik lub inne urządzenie używane do interakcji z urządzeniem dotykowym. Niektóre urządzenia dotykowe potrafią rozróżniać różne rodzaje narzędzi.
W innych miejscach w Androidzie, np. w interfejsie MotionEvent
API, narzędzie jest często nazywane wskaźnikiem.
Obsługiwane są te typy narzędzi:
BTN_TOOL_FINGER
iMT_TOOL_FINGER
: zmapowane naMotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
iMT_TOOL_PEN
: zmapowane naMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_RUBBER
: zmapowano naMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: zmapowano naMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: zmapowano naMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: zmapowano naMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: zmapowano naMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: zmapowano naMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
iBTN_TOOL_QUADTAP
: przypisane doMotionEvent.TOOL_TYPE_FINGER
.
Narzędzia do najeżdżania kursorem a narzędzia dotykowe
Narzędzia mogą stykać się z urządzeniem dotykowym lub znajdować się w jego zasięgu i unosić się nad nim. Nie wszystkie urządzenia dotykowe mogą wykrywać obecność narzędzia unoszącego się nad urządzeniem dotykowym. Niektóre z nich, np. digitizery z rysikiem działające na częstotliwości radiowej, mogą wykrywać, kiedy narzędzie znajduje się w ograniczonym zasięgu digitizera.
Komponent InputReader
odróżnia narzędzia dotykowe od narzędzi, które działają w trybie zawieszenia. Podobnie narzędzia dotykowe i narzędzia do najeżdżania są zgłaszane aplikacjom na różne sposoby.
Narzędzia dotykowe są zgłaszane aplikacjom jako zdarzenia dotyku za pomocą MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
i MotionEvent.ACTION_POINTER_UP
.
Narzędzia do najeżdżania są zgłaszane aplikacjom jako ogólne zdarzenia ruchu za pomocą funkcji MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_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ą. Rejestrowanie nieobsługiwanych osi lub kodów klawiszy może wprowadzić w błąd algorytm klasyfikacji urządzenia lub spowodować nieprawidłowe wykrycie przez system możliwości urządzenia. Jeśli na przykład urządzenie zgłasza kod klucza
BTN_TOUCH
, system zakłada, żeBTN_TOUCH
jest zawsze używany do wskazywania, czy narzędzie dotyka ekranu. Dlatego symbolBTN_TOUCH
nie powinien być używany do oznaczania, że narzędzie znajduje się w zakresie i jest w trybie zawieszenia. - Urządzenia obsługujące 1 punkt dotyku korzystają z tych zdarzeń wejściowych systemu Linux:
ABS_X
: (WYMAGANE) Zgłasza współrzędną X narzędzia.ABS_Y
: (WYMAGANE) Zgłasza współrzędną Y narzędzia.ABS_PRESSURE
: (opcjonalnie) raportuje fizyczny nacisk wywierany na końcówkę narzędzia lub siłę sygnału kontaktu dotykowego.ABS_TOOL_WIDTH
: (opcjonalnie) podaje pole przekroju lub szerokość kontaktu dotykowego lub samego narzędzia.ABS_DISTANCE
: (opcjonalnie) podaje odległość narzędzia od powierzchni urządzenia dotykowego.ABS_TILT_X
: (opcjonalnie) zgłasza odchylenie narzędzia od powierzchni urządzenia dotykowego wzdłuż osi X.ABS_TILT_Y
: (opcjonalnie) zgłasza odchylenie narzędzia od powierzchni urządzenia dotykowego wzdłuż osi Y.BTN_TOUCH
: (WYMAGANE) Określa, czy narzędzie dotyka urządzenia.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcjonalnie) Stan przycisku raportów.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (opcjonalnie) Podaje typ narzędzia.
- Urządzenia wielodotykowe używają tych zdarzeń wejściowych systemu Linux:
ABS_MT_POSITION_X
: (WYMAGANE) Zgłasza współrzędną X narzędzia.ABS_MT_POSITION_Y
: (WYMAGANE) Zgłasza współrzędną Y narzędzia.ABS_MT_PRESSURE
: (opcjonalnie) raportuje fizyczny nacisk wywierany na końcówkę narzędzia lub siłę sygnału kontaktu dotykowego.ABS_MT_TOUCH_MAJOR
: (opcjonalnie) podaje pole przekroju poprzecznego kontaktu dotykowego lub długość dłuższego wymiaru kontaktu dotykowego.ABS_MT_TOUCH_MINOR
: (opcjonalny) podaje długość krótszego wymiaru kontaktu dotykowego. Tej osi nie należy używać, jeśliABS_MT_TOUCH_MAJOR
raportuje pomiar obszaru.ABS_MT_WIDTH_MAJOR
: (opcjonalnie) podaje pole przekroju narzędzia lub długość dłuższego wymiaru narzędzia. Nie używaj tej osi, chyba że znasz wymiary samego narzędzia.ABS_MT_WIDTH_MINOR
: (opcjonalnie) podaje długość krótszego wymiaru samego narzędzia. Nie należy używać tej osi, jeśliABS_MT_WIDTH_MAJOR
podaje pomiar powierzchni lub jeśli wymiary samego narzędzia są nieznane.ABS_MT_ORIENTATION
: (opcjonalnie) podaje orientację narzędzia.ABS_MT_DISTANCE
: (opcjonalnie) podaje odległość narzędzia od powierzchni urządzenia dotykowego.ABS_MT_TOOL_TYPE
: (opcjonalnie) zgłasza typ narzędzia jakoMT_TOOL_FINGER
lubMT_TOOL_PEN
.ABS_MT_TRACKING_ID
: (opcjonalnie) podaje identyfikator śledzenia narzędzia. Identyfikator śledzenia to dowolna nieujemna liczba całkowita, która służy do identyfikowania i śledzenia każdego narzędzia z osobna, gdy jest aktywnych kilka narzędzi. Na przykład, gdy urządzenie jest dotykane przez kilka palców, każdy z nich powinien mieć przypisany odrębny identyfikator śledzenia, który jest używany, dopóki palec pozostaje w kontakcie z urządzeniem. Identyfikatory śledzenia można ponownie wykorzystać, gdy powiązane z nimi narzędzia znajdą się poza zasięgiem.ABS_MT_SLOT
: (opcjonalnie) zgłasza identyfikator gniazda narzędzia podczas korzystania z protokołu wielodotykowego „B” w systemie Linux. Więcej informacji znajdziesz w dokumentacji protokołu wielodotykowego w systemie Linux.BTN_TOUCH
: (WYMAGANE) Określa, czy narzędzie dotyka urządzenia.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcjonalnie) Stan przycisku raportów.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (opcjonalnie) Zwraca typ narzędzia.
- Jeśli zdefiniowano osie dla protokołu pojedynczego i wielu dotknięć, używane są tylko osie wielodotykowe, a osie pojedynczego dotknięcia są ignorowane.
Wartości minimalne i maksymalne osi
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
iABS_MT_POSITION_Y
określają granice aktywnego obszaru urządzenia w jednostkach powierzchniowych specyficznych dla urządzenia. W przypadku ekranu dotykowego obszar aktywny opisuje część urządzenia dotykowego, która faktycznie pokrywa wyświetlacz.W przypadku ekranu dotykowego system automatycznie interpoluje zgłoszone pozycje dotknięcia w jednostkach powierzchni, aby uzyskać pozycje dotknięcia w pikselach wyświetlacza zgodnie z tym obliczeniem:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Ekran dotykowy może rejestrować dotknięcia poza zgłoszonym aktywnym obszarem.
Dotknięcia rozpoczęte poza obszarem aktywnym nie są przekazywane do aplikacji, ale mogą być używane w przypadku klawiszy wirtualnych.
Dotknięcia, które są inicjowane w obszarze aktywnym lub które wchodzą i wychodzą z obszaru wyświetlania, są przekazywane do aplikacji. Jeśli dotyk rozpocznie się w obszarze aplikacji, a następnie przesunie się poza obszar aktywny, aplikacja może otrzymać zdarzenia dotyku ze współrzędnymi wyświetlania, które są ujemne lub wykraczają poza granice wyświetlacza. Jest to prawidłowe działanie.
Urządzenie dotykowe nigdy nie powinno ograniczać współrzędnych dotyku do granic aktywnego obszaru. Jeśli dotyk opuści aktywny obszar, należy zgłosić, że znajduje się poza nim, lub w ogóle nie zgłaszać tego zdarzenia.
Jeśli na przykład palec użytkownika dotyka lewego górnego rogu ekranu dotykowego, może to zgłosić współrzędne (minX, minY). Jeśli palec nadal będzie się przesuwać poza obszar aktywny, ekran dotykowy powinien zacząć zgłaszać współrzędne o składowych mniejszych niż minX i minY, np. (minX – 2, minY – 3), lub całkowicie przestać zgłaszać dotyk. Innymi słowy, ekran dotykowy nie powinien zgłaszać (minX, minY), gdy palec użytkownika dotyka obszaru poza aktywnym obszarem.
Przyciąganie współrzędnych dotyku do krawędzi wyświetlacza tworzy sztuczną, twardą granicę wokół krawędzi ekranu, która uniemożliwia systemowi płynne śledzenie ruchów wchodzących lub wychodzących poza obszar wyświetlania.
Wartości zgłaszane przez
ABS_PRESSURE
lubABS_MT_PRESSURE
, jeśli są w ogóle zgłaszane, muszą być niezerowe, gdy narzędzie dotyka urządzenia, a zerowe w pozostałych przypadkach, aby wskazywać, że narzędzie jest zawieszone.Raportowanie informacji o ciśnieniu jest opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą używać informacji o nacisku do implementowania rysowania z wykorzystaniem siły nacisku i innych efektów.
Wartości zgłaszane przez
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
lubABS_MT_WIDTH_MINOR
powinny być niezerowe, gdy narzędzie dotyka urządzenia, a w pozostałych przypadkach powinny wynosić zero, ale nie jest to wymagane. Na przykład urządzenie dotykowe może mierzyć rozmiar kontaktu palca, ale nie rysika.Podawanie informacji o rozmiarze jest opcjonalne, ale zdecydowanie zalecane. Aplikacje mogą wykorzystywać informacje o nacisku do rysowania z uwzględnieniem rozmiaru i innych efektów.
Wartości zgłaszane przez
ABS_DISTANCE
lubABS_MT_DISTANCE
powinny zbliżać się do zera, gdy narzędzie dotyka urządzenia. Odległość może być różna od zera, nawet gdy narzędzie ma bezpośredni kontakt z powierzchnią. Dokładne zgłaszane wartości zależą od sposobu, w jaki sprzęt mierzy odległość.Raportowanie informacji o odległości jest opcjonalne, ale zalecane w przypadku urządzeń z rysikiem.
Wartości zgłaszane przez
ABS_TILT_X
iABS_TILT_Y
powinny wynosić zero, gdy narzędzie jest prostopadłe do urządzenia. Niezerowe nachylenie oznacza, że narzędzie jest trzymane pod kątem.Kąty pochylenia wzdłuż osi X i Y są podawane w stopniach odchylenia od prostopadłości. Punkt środkowy (idealnie prostopadły) jest określany przez wartość
(max + min) / 2
dla każdej osi. Wartości mniejsze niż punkt środkowy oznaczają pochylenie w górę lub w lewo, a wartości większe niż punkt środkowy oznaczają pochylenie w dół lub w prawo.InputReader
przekształca składowe nachylenia X i Y na kąt nachylenia prostopadłego w zakresie od 0 doPI / 2
radianów oraz kąt orientacji płaszczyzny w zakresie od-PI
doPI
radianów. W wyniku tego powstaje opis orientacji zgodny z opisem dotknięć palcem.Raportowanie informacji o pochyleniu jest opcjonalne, ale zalecane w przypadku urządzeń z rysikiem.
Jeśli typ narzędzia jest zgłaszany przez
ABS_MT_TOOL_TYPE
, zastępuje on wszelkie informacje o typie narzędzia zgłaszane przezBTN_TOOL_*
. Jeśli informacje o typie narzędzia są niedostępne, domyślnie jest toMotionEvent.TOOL_TYPE_FINGER
.Narzędzie jest uznawane za aktywne, jeśli spełnione są te warunki:
W przypadku protokołu pojedynczego dotyku narzędzie jest aktywne, jeśli wartość
BTN_TOUCH
lubBTN_TOOL_*
wynosi 1.Ten warunek oznacza, że
InputReader
musi mieć co najmniej pewne informacje o charakterze narzędzia, np. czy dotyka ono powierzchni, lub przynajmniej jego typ. Jeśli nie ma dostępnych informacji, narzędzie jest uznawane za nieaktywne (poza zasięgiem).- W przypadku korzystania z protokołu wielodotykowego „A” narzędzie jest aktywne, gdy pojawia się w ostatnim raporcie synchronizacji. Gdy narzędzie przestanie się pojawiać w raportach synchronizacji, przestanie istnieć.
- W przypadku korzystania z protokołu wielodotykowego „B” narzędzie jest aktywne, dopóki ma aktywne miejsce. Gdy miejsce zostanie zwolnione, narzędzie przestaje istnieć.
- Narzędzie jest uznawane za zawieszone na podstawie tych warunków:
- Jeśli narzędzie jest w stanie
BTN_TOOL_MOUSE
lubBTN_TOOL_LENS
, nie jest zawieszone, nawet jeśli spełniony jest jeden z tych warunków: - Jeśli narzędzie jest aktywne, a sterownik zgłasza informacje o nacisku i zgłoszony nacisk wynosi zero, narzędzie jest zawieszone.
- Jeśli narzędzie jest aktywne, a sterownik obsługuje kod klucza
BTN_TOUCH
i wartośćBTN_TOUCH
wynosi zero, narzędzie jest zawieszone.
- Jeśli narzędzie jest w stanie
InputReader
obsługuje protokoły wielodotykowe „A” i „B”. Nowi kierowcy powinni używać protokołu „B”, ale oba działają.Od Androida 4.0 sterowniki ekranu dotykowego mogą wymagać zmiany, aby były zgodne ze specyfikacją protokołu wejścia w systemie Linux.
Może być konieczne wprowadzenie tych zmian:
Gdy narzędzie stanie się nieaktywne (palec zostanie podniesiony), nie powinno się już pojawiać w kolejnych raportach synchronizacji wielodotykowej. Gdy wszystkie narzędzia staną się nieaktywne (wszystkie palce będą „w górze”), sterownik powinien wysłać pusty pakiet raportu synchronizacji, np.
SYN_MT_REPORT
, a potemSYN_REPORT
.W poprzednich wersjach Androida zdarzenia „up” były raportowane przez wysyłanie wartości ciśnienia 0. Stare działanie było niezgodne ze specyfikacją protokołu wejściowego systemu Linux i nie jest już obsługiwane.
Informacje o nacisku fizycznym lub sile sygnału należy zgłaszać za pomocą parametru
ABS_MT_PRESSURE
.W starszych wersjach Androida informacje o ciśnieniu były pobierane z
ABS_MT_TOUCH_MAJOR
. Stare działanie było niezgodne ze specyfikacją protokołu wejściowego systemu Linux i nie jest już obsługiwane.- Informacje o rozmiarze dotyku należy zgłaszać za pomocą parametru
ABS_MT_TOUCH_MAJOR
.Wcześniejsze wersje Androida pobierały informacje o rozmiarze z
ABS_MT_TOOL_MAJOR
. Stare działanie było niezgodne ze specyfikacją protokołu wejściowego systemu Linux i nie jest już obsługiwane.
Obsługa urządzenia dotykowego
Poniżej znajdziesz krótkie podsumowanie obsługi urządzeń dotykowych na Androidzie.
EventHub
odczytuje surowe zdarzenia zevdev
sterownika.InputReader
przetwarza nieprzetworzone zdarzenia i aktualizuje wewnętrzny stan dotyczący położenia i innych cech każdego narzędzia. Śledzi też stany przycisków.- Jeśli naciśnięto lub zwolniono przycisk WSTECZ lub DALEJ,
InputReader
powiadamiaInputDispatcher
o kluczowym zdarzeniu. InputReader
określa, czy naciśnięto klawisz wirtualny. Jeśli tak, wysyła doInputDispatcher
powiadomienie o kluczowym zdarzeniu.InputReader
określa, czy dotknięcie zostało zainicjowane w obrębie wyświetlacza. Jeśli tak, powiadamiaInputDispatcher
o zdarzeniu dotyku.- Jeśli nie ma narzędzi dotykowych, ale jest co najmniej 1 narzędzie do najeżdżania,
InputReader
powiadamiaInputDispatcher
o zdarzeniu najechania. - Jeśli typ urządzenia dotykowego to wskaźnik,
InputReader
wykrywa gesty wskaźnika, przesuwa wskaźnik i odpowiednio go umieszcza oraz powiadamiaInputDispatcher
o zdarzeniu wskaźnika. InputDispatcher
używaWindowManagerPolicy
, aby określić, czy zdarzenia mają być wysyłane i czy mają wybudzać urządzenie. NastępnieInputDispatcher
dostarcza zdarzenia do odpowiednich aplikacji.
Konfiguracja urządzenia dotykowego
Zachowanie urządzenia dotykowego jest określane przez osie, przyciski, właściwości wejściowe, konfigurację urządzenia wejściowego, mapę klawiszy wirtualnych i układ klawiszy.
Więcej informacji o plikach, które biorą udział w konfiguracji klawiatury, znajdziesz w tych sekcjach:
Właściwości
System korzysta z wielu właściwości konfiguracji urządzenia wejściowego, aby skonfigurować i skalibrować działanie urządzenia dotykowego.
Jednym z powodów jest to, że sterowniki urządzeń dotykowych często raportują charakterystykę dotknięć za pomocą jednostek specyficznych dla urządzenia.
Wiele urządzeń dotykowych mierzy na przykład obszar kontaktu dotykowego za pomocą wewnętrznej skali specyficznej dla urządzenia, np. łącznej liczby węzłów czujnika, które zostały aktywowane przez dotyk. Ta surowa wartość rozmiaru nie byłaby przydatna dla aplikacji, ponieważ musiałyby one znać fizyczny rozmiar i inne cechy węzłów czujnika urządzenia dotykowego.
System używa parametrów kalibracji zakodowanych w plikach konfiguracyjnych urządzenia wejściowego do dekodowania, przekształcania i normalizowania wartości zgłaszanych przez urządzenie dotykowe w prostsze standardowe reprezentacje, które mogą być interpretowane przez aplikacje.
Konwencje dokumentacji
Na potrzeby dokumentacji używamy tych konwencji do opisywania wartości używanych przez system podczas procesu kalibracji.
Wartości osi surowej
Poniższe wyrażenia oznaczają surowe wartości zgłaszane przez sterownik urządzenia dotykowego jako zdarzenia EV_ABS
.
raw.x
- Wartość osi
ABS_X
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 nie jest dostę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 nie jest dostępna. raw.orientation
- Wartość osi
ABS_MT_ORIENTATION
lub 0, jeśli nie jest dostępna. raw.distance
- Wartość osi
ABS_DISTANCE
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 nie jest dostępna.
Zakresy osi surowych
Poniższe wyrażenia oznaczają granice wartości surowych. Są one uzyskiwane przez wywołanie EVIOCGABS
ioctl dla każdej osi.
raw.*.min
- Minimalna wartość osi surowej (włącznie).
raw.*.max
- Maksymalna wartość osi pierwotnej (włącznie).
raw.*.range
- Odpowiednik:
raw.*.max - raw.*.min
. raw.*.fuzz
- Dokładność osi surowej. np. fuzz = 1 oznacza, że wartości są dokładne z dokładnością do +/- 1 jednostki.
raw.width
- Szerokość obszaru dotykowego (włącznie z wartościami granicznymi), równa
raw.x.range + 1
. raw.height
- Wysokość obszaru dotykowego, która obejmuje wszystkie elementy, równa
raw.y.range + 1
.
Zakresy wyjściowe
Poniższe wyrażenia oznaczają charakterystykę wyjściowego układu współrzędnych. System używa interpolacji liniowej do przekształcania informacji o pozycji dotyku z jednostek powierzchni używanych przez urządzenie dotykowe na jednostki wyjściowe, które są zgłaszane aplikacjom, np. piksele wyświetlacza.
output.width
- Szerokość danych wyjściowych. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to szerokość wyświetlacza w pikselach. W przypadku paneli dotykowych (niepowiązanych z wyświetlaczem) szerokość wyjściowa jest równa
raw.width
, co oznacza, że nie jest przeprowadzana żadna interpolacja. output.height
- Wysokość danych wyjściowych. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to wysokość wyświetlacza w pikselach. W przypadku paneli dotykowych (niepowiązanych z wyświetlaczem) wysokość wyjściowa wynosi
raw.height
, co oznacza, że nie jest przeprowadzana interpolacja. output.diag
- Długość przekątnej wyjściowego układu współrzędnych, równa
sqrt(output.width ^2 + output.height ^2)
.
Podstawowa konfiguracja
Mapowanie danych wejściowych dotykowych korzysta z wielu właściwości konfiguracji w pliku konfiguracji urządzenia wejściowego, aby określić wartości kalibracji. W tabeli poniżej opisano niektóre właściwości konfiguracji ogólnego przeznaczenia. Wszystkie pozostałe właściwości zostały opisane w kolejnych sekcjach wraz z polami, do których kalibracji są używane.
touch.deviceType
Definicja: touch.deviceType
= touchScreen
|
touchPad
| pointer
| default
Określa typ urządzenia dotykowego.
-
Jeśli wartość to
touchScreen
, urządzenie dotykowe jest ekranem dotykowym powiązanym z wyświetlaczem. -
Jeśli wartość to
touchPad
, urządzenie dotykowe jest touchpadem niepowiązanym z wyświetlaczem. -
Jeśli wartość to
pointer
, urządzenie dotykowe jest trackpadem niepowiązanym z wyświetlaczem, a jego ruchy są używane do pośrednich gestów wskaźnika wielodotykowego. -
Jeśli wartość to
default
, system automatycznie wykrywa typ urządzenia zgodnie z algorytmem klasyfikacji.
Więcej informacji o tym, jak typ urządzenia wpływa na jego działanie, znajdziesz w sekcji Klasyfikacja.
W Androidzie 3 i starszych wersjach wszystkie urządzenia dotykowe były traktowane jako ekrany dotykowe.
touch.orientationAware
Definicja: touch.orientationAware
= 0
| 1
Określa, czy urządzenie dotykowe ma reagować na zmiany orientacji wyświetlacza.
-
Jeśli wartość wynosi
1
, pozycje dotyku zgłaszane przez urządzenie dotykowe są obracane za każdym razem, gdy zmienia się orientacja wyświetlacza. -
Jeśli wartość to
0
, pozycje dotyku zgłaszane przez urządzenie dotykowe są odporne na zmiany orientacji wyświetlacza.
Wartością domyślną jest 1
, jeśli urządzenie ma ekran dotykowy, a w przeciwnym razie 0
.
System rozróżnia wewnętrzne i zewnętrzne ekrany dotykowe i wyświetlacze. Wewnętrzny ekran dotykowy z czujnikiem orientacji jest obracany w zależności od orientacji wyświetlacza wewnętrznego. Zewnętrzny ekran dotykowy z funkcją wykrywania orientacji jest obracany w zależności od orientacji wyświetlacza zewnętrznego.
Wykrywanie orientacji jest używane do obsługi obracania ekranów dotykowych na urządzeniach takich jak Nexus One. Na przykład, gdy urządzenie zostanie obrócone o 90 stopni w prawo względem naturalnej orientacji, bezwzględne położenia dotknięć zostaną ponownie przypisane tak, aby dotknięcie w lewym górnym rogu bezwzględnego układu współrzędnych ekranu dotykowego było zgłaszane jako dotknięcie w lewym górnym rogu obróconego układu współrzędnych wyświetlacza. Dzięki temu dotknięcia są zgłaszane w tym samym układzie współrzędnych, którego aplikacje używają do rysowania elementów wizualnych.
Przed Honeycomb wszystkie urządzenia dotykowe były uważane za urządzenia z czujnikiem orientacji.
touch.gestureMode
Definicja: touch.gestureMode
= pointer
| spots
|
default
Określa tryb prezentacji gestów wskaźnika. Ta właściwość konfiguracji ma znaczenie tylko wtedy, gdy urządzenie dotykowe jest typu wskaźnik.
-
Jeśli wartość to
pointer
, gesty na panelu dotykowym są prezentowane za pomocą kursora podobnego do wskaźnika myszy. -
Jeśli wartość to
spots
, gesty na panelu dotykowym są prezentowane przez punkt zakotwiczenia, który reprezentuje środek ciężkości gestu, oraz zestaw okrągłych punktów, które reprezentują położenie poszczególnych palców.
Wartość domyślna to pointer
, gdy ustawiona jest właściwość wejściowa INPUT_PROP_SEMI_MT
, lub spots
w przeciwnym razie.
Pola X i Y
Pola X i Y zawierają informacje o położeniu środka obszaru kontaktu.
Obliczenia
Obliczenia są proste: informacje o położeniu z sterownika dotykowego są interpolowane liniowo do układu współrzędnych wyjściowych.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
pola touchMajor, touchMinor, toolMajor, toolMinor, size
Pola touchMajor
i touchMinor
opisują przybliżone wymiary obszaru styku w jednostkach wyjściowych (pikselach).
Pola toolMajor
i toolMinor
określają przybliżone wymiary samego narzędzia w jednostkach wyjściowych (pikselach).
Pole size
opisuje znormalizowany rozmiar dotyku w stosunku do największego możliwego dotyku, jaki może wykryć urządzenie dotykowe. Najmniejszy możliwy rozmiar znormalizowany to 0,0 (brak kontaktu lub jest on niemożliwy do zmierzenia), a największy możliwy rozmiar znormalizowany to 1,0 (obszar czujnika jest nasycony).
Jeśli można zmierzyć zarówno przybliżoną długość, jak i szerokość, pole touchMajor
określa dłuższy wymiar, a pole touchMinor
określa krótszy wymiar powierzchni styku. Jeśli można zmierzyć tylko przybliżoną średnicę obszaru styku, pola 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 rozmiar narzędzia jest niedostępny, ale rozmiar dotyku jest dostępny, rozmiar dotyku jest ustawiany na rozmiar narzędzia.
Urządzenia dotykowe mierzą i raportują rozmiar dotyku oraz rozmiar narzędzia na różne sposoby. Obecna implementacja obsługuje 3 rodzaje pomiarów: średnicę, powierzchnię i geometryczne pole ograniczające w jednostkach powierzchni.
Definicja: touch.size.calibration
= none
|
geometric
| diameter
| area
| default
Określa rodzaj pomiaru używanego przez sterownik dotykowy do raportowania rozmiaru dotyku i rozmiaru narzędzia.
-
Jeśli wartość wynosi
none
, rozmiar jest ustawiony na 0. -
Jeśli wartość to
geometric
, przyjmuje się, że rozmiar jest podany w tych samych jednostkach powierzchni co pozycja, więc jest skalowany w ten sam sposób. -
Jeśli wartość to
diameter
, rozmiar jest proporcjonalny do średnicy (szerokości) dotyku lub narzędzia. -
Jeśli wartość to
area
, rozmiar jest proporcjonalny do obszaru dotyku lub narzędzia. -
Jeśli wartość to
default
, system używa kalibracjigeometric
, jeśli dostępne są osieraw.touchMajor
lubraw.toolMajor
. W przeciwnym razie używa kalibracjinone
.
touch.size.scale
Definicja: touch.size.scale
= <nieujemna liczba zmiennoprzecinkowa>
Określa stały współczynnik skalowania używany w kalibracji.
Wartość domyślna to 1.0
.
touch.size.bias
Definicja: touch.size.bias
= <nieujemna liczba zmiennoprzecinkowa>
Określa stałą wartość odchylenia używaną w kalibracji.
Wartość domyślna to 0.0
.
touch.size.isSummed
Definicja: touch.size.isSummed
= 0
| 1
Określa, czy rozmiar jest raportowany jako suma rozmiarów wszystkich aktywnych kontaktów, czy osobno dla każdego kontaktu.
-
Jeśli wartość wynosi
1
, zgłoszony rozmiar jest dzielony przez liczbę kontaktów przed użyciem. -
Jeśli wartość to
0
, zgłoszony rozmiar jest używany w takiej postaci, w jakiej został podany.
Wartość domyślna to 0
.
Niektóre urządzenia dotykowe, zwłaszcza urządzenia „Semi-MT”, nie potrafią rozróżnić poszczególnych wymiarów wielu punktów dotyku, więc podają pomiar rozmiaru, który reprezentuje ich całkowitą powierzchnię lub szerokość. W przypadku takich urządzeń ta właściwość powinna mieć wartość 1
. W razie wątpliwości ustaw tę wartość na 0
.
Obliczenia
Obliczenie wartości pól touchMajor
, touchMinor
, toolMajor
, 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
, ciśnienie jest nieznane, więc podczas dotykania jest ustawione na 1,0, a podczas najeżdżania kursorem na 0,0. -
Jeśli wartość to
physical
, oś nacisku jest uznawana za pomiar rzeczywistej fizycznej intensywności nacisku wywieranego na panel dotykowy. -
Jeśli wartość to
amplitude
, przyjmuje się, że oś nacisku mierzy amplitudę sygnału, która jest związana z rozmiarem kontaktu i przyłożonym naciskiem. -
Jeśli wartość to
default
, system używa kalibracjiphysical
, jeśli dostępna jest oś ciśnienia, w przeciwnym razie używa kalibracjinone
.
touch.pressure.scale
Definicja: touch.pressure.scale
= <nieujemna liczba zmiennoprzecinkowa>
Określa stały współczynnik skalowania używany w kalibracji.
Wartość domyślna to 1.0 / raw.pressure.max
.
Obliczenia
Obliczenie pola pressure
zależy od określonych parametrów kalibracji.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
pola orientacji i przechylenia,
Pole orientation
opisuje orientację dotyku i narzędzia jako pomiar kątowy. Orientacja 0
oznacza, że oś główna jest zorientowana pionowo, -PI/2
oznacza, że oś główna jest zorientowana w lewo, a PI/2
oznacza, że oś główna jest zorientowana w prawo. Gdy jest obecne narzędzie w postaci rysika, zakres orientacji można opisać w pełnym zakresie koła od -PI
lub PI
.
Pole tilt
opisuje nachylenie narzędzia jako pomiar kątowy.
Pochylenie o 0
oznacza, że narzędzie jest prostopadłe do powierzchni.
Nachylenie PI/2
oznacza, że narzędzie leży płasko na powierzchni.
touch.orientation.calibration
Definicja: touch.orientation.calibration
= none
|
interpolated
| vector
| default
Określa rodzaj pomiaru używanego przez sterownik dotykowy do raportowania orientacji.
- Jeśli wartość to
none
, orientacja jest nieznana, więc jest ustawiona na 0. - Jeśli wartość to
interpolated
, orientacja jest interpolowana liniowo, tak aby surowa wartośćraw.orientation.min
odpowiadała wartości-PI/2
, a surowa wartośćraw.orientation.max
– wartościPI/2
. Wartość środkowa(raw.orientation.min + raw.orientation.max) / 2
odpowiada wartości0
. - Jeśli wartość to
vector
, orientacja jest interpretowana jako spakowany wektor składający się z 2 pól 4-bitowych ze znakiem. Ta reprezentacja jest używana w przypadku komponentów opartych na protokole Atmel Object Based Protocol. Po zdekodowaniu wektor daje kąt orientacji i wartość ufności. Wartość ufności służy do skalowania informacji o rozmiarze, chyba że jest to rozmiar geometryczny. - Jeśli wartość to
default
, system używa kalibracjiinterpolated
, jeśli dostępna jest oś orientacji, w przeciwnym razie używa kalibracjinone
.
Obliczenia
Obliczenia w polach orientation
i tilt
zależą od określonych parametrów kalibracji i dostępnych danych wejściowych.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
pole odległości
Pole distance
opisuje odległość między narzędziem a powierzchnią urządzenia dotykowego. Wartość 0,0 oznacza bezpośredni kontakt, a większe wartości wskazują na rosnącą odległość od powierzchni.
touch.distance.calibration
Definicja: touch.distance.calibration
= none
|
scaled
| default
Określa rodzaj pomiaru używanego przez sterownik dotykowy do raportowania odległości.
-
Jeśli wartość to
none
, odległość jest nieznana, więc jest ustawiona na 0. -
Jeśli wartość to
scaled
, zgłoszona odległość jest mnożona przez stały współczynnik skali. -
Jeśli wartość to
default
, system używa kalibracjiscaled
, jeśli oś odległości jest dostępna, w przeciwnym razie używa kalibracjinone
.
touch.distance.scale
Definicja: touch.distance.scale
= <nieujemna liczba zmiennoprzecinkowa>
Określa stały współczynnik skalowania używany w kalibracji.
Wartość domyślna to 1.0
.
Obliczenia
Obliczenie pola distance
zależy od określonych parametrów kalibracji.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Przykład
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Uwagi dotyczące zgodności
W Androidzie Ice Cream Sandwich 4.0 znacznie zmieniono właściwości konfiguracji urządzeń dotykowych. Wszystkie pliki konfiguracji urządzeń wejściowych dla urządzeń dotykowych muszą zostać zaktualizowane, aby korzystać z nowych właściwości konfiguracji.
Może być też konieczna aktualizacja sterowników starszych urządzeń dotykowych.
Pliki mapy klawiszy wirtualnych
Urządzenia dotykowe mogą być używane do implementowania klawiszy wirtualnych.
Można to zrobić na kilka sposobów, w zależności od możliwości kontrolera dotykowego. Niektóre kontrolery dotykowe można skonfigurować bezpośrednio do implementacji klawiszy programowych, ustawiając rejestry oprogramowania sprzętowego. W innych przypadkach mapowanie współrzędnych dotyku na kody klawiszy jest korzystne w przypadku oprogramowania.
Gdy klucze wirtualne są implementowane w oprogramowaniu, jądro musi wyeksportować plik mapy kluczy wirtualnych o nazwie virtualkeys.<devicename>
jako właściwość płyty. Jeśli na przykład sterowniki urządzenia z ekranem dotykowym zgłaszają nazwę „touchyfeely”, plik mapy klawiszy wirtualnych musi mieć ścieżkę /sys/board_properties/virtualkeys.touchyfeely
.
Plik mapy klawiszy wirtualnych zawiera współrzędne i kody klawiszy wirtualnych w systemie Linux na ekranie dotykowym.
Oprócz pliku mapy klawiszy wirtualnych musi istnieć odpowiedni plik układu klawiszy i plik mapy znaków klawiszy, aby zmapować kody klawiszy systemu Linux na kody klawiszy systemu Android i określić typ urządzenia klawiatury (zwykle SPECIAL_FUNCTION
).
Składnia
Plik wirtualnej mapy klawiszy to zwykły plik tekstowy zawierający sekwencję opisów układu klawiszy wirtualnych rozdzielonych znakami nowego wiersza lub dwukropkami.
Linie komentarzy zaczynają się od znaku „#” i trwają do końca wiersza.
Każdy klucz wirtualny jest opisany za pomocą 6 komponentów oddzielonych dwukropkiem:
0x01
: kod wersji. Musi to być zawsze wartość0x01
.- <Linux key code>: kod klucza wirtualnego w systemie Linux.
- <centerX>: współrzędna X piksela środka wirtualnego klawisza.
- <centerY>: współrzędna Y piksela środka wirtualnego klucza.
- <width>: szerokość klawisza wirtualnego w pikselach.
- <height>: wysokość wirtualnego klawisza w pikselach.
Wszystkie współrzędne i rozmiary są podawane w systemie współrzędnych wyświetlacza.
Oto plik mapy klawiszy wirtualnych zapisany w jednym wierszu.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
Ten sam plik mapowania klawiszy wirtualnych można też zapisać w kilku wierszach.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
W powyższym przykładzie ekran dotykowy ma rozdzielczość 480 x 800. Wszystkie wirtualne klawisze mają współrzędną <centerY> równą 835, czyli znajdują się nieco poniżej widocznego obszaru ekranu dotykowego.
Pierwszy klawisz ma kod skanowania w systemie Linux 158
(KEY_BACK
), współrzędną centerX 55
, współrzędną centerY 835
, szerokość 90
i wysokość 55
.
Przykład
Plik mapy klawiszy wirtualnych: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Plik układu klawiatury: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Plik mapy znaków klucza: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Gesty wskaźnika wielodotykowego pośredniego
W trybie wskaźnika system interpretuje te gesty:
- Kliknięcie 1 palcem: kliknięcie.
- Ruch jednym palcem: przesuń wskaźnik.
- Ruch jednym palcem i naciśnięcie przycisków: przeciągnij wskaźnik.
- Ruch dwoma palcami w tym samym kierunku: przeciągnij obszar pod wskaźnikiem w tym kierunku. Sam wskaźnik się nie porusza.
- Ruch dwoma palcami – oba palce poruszają się w różnych kierunkach, zbliżając się do siebie lub oddalając od siebie: przesuwanie/skalowanie/obracanie obszaru wokół wskaźnika. Sam wskaźnik się nie porusza.
- Ruch wieloma palcami: gest odręczny.
Odrzucanie dłoni
Od Androida 13 system może automatycznie odrzucać dane wejściowe pochodzące z dłoni, gdy wbudowana platforma jest włączona. Rozwiązania wewnętrzne i niestandardowe są nadal obsługiwane, ale mogą wymagać modyfikacji, aby zwracać flagę TOOL_TYPE_PALM
po wykryciu dłoni. Wbudowana platforma działa też w połączeniu z rozwiązaniami niestandardowymi.
Rzeczywisty model analizuje pierwsze 90 ms danych gestów, bieżący wskaźnik i otaczające go wskaźniki, a następnie sprawdza, jak daleko od krawędzi wyświetlacza znajdują się dotknięcia.
Następnie określa, które z nich są dłońmi. Uwzględnia też rozmiar każdego kontaktu podany przez touchMajor
i touchMinor
. Framework Androida usuwa następnie z potoku dotykowego wskaźniki oznaczone jako dłonie.
Jeśli wskaźnik został już wysłany do aplikacji, system:
- (Jeśli są inne aktywne wskaźniki) Anuluje wskaźnik z ustawionymi wartościami
ACTION_POINTER_UP
iFLAG_CANCELED
. - (Jeśli jest to jedyny wskaźnik) Anuluje wskaźnik za pomocą
ACTION_CANCEL
.
Publiczny interfejs API MotionEvent.FLAG_CANCELED
wskazuje, że bieżące zdarzenie nie powinno wywoływać działania użytkownika. Ta flaga jest ustawiona zarówno w przypadku ACTION_CANCEL
, jak i ACTION_POINTER_UP
.
Jeśli wskaźnik dłoni nie został wysłany do aplikacji, system po prostu go odrzuca.
Włączanie funkcji wykrywania dłoni
- W sterowniku ekranu dotykowego użyj
input_abs_set_res
makra, aby ustawić rozdzielczości w tych polach (jednostki to piksele na mm):ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
Obsługa
ABS_MT_TOUCH_MINOR
jest opcjonalna. Jeśli jednak urządzenie obsługuje tę funkcję, upewnij się, że rozdzielczość jest ustawiona prawidłowo. - Aby sprawdzić, czy pola są prawidłowo skonfigurowane, uruchom polecenie:
$ adb shell getevent -li
- Aby włączyć tę funkcję w czasie działania programu, uruchom to polecenie:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Uruchom ponownie proces
system_server
.$ adb shell stop && adb shell start
- Sprawdź, czy w sekcji
adb shell dumpsys input
widać, że wUnwantedInteractionBlocker
znajdują się elementy zapobiegające przypadkowemu dotknięciu ekranu. Jeśli tak nie jest, sprawdź logi związane z danymi wejściowymi, aby znaleźć wskazówki dotyczące tego, co może być nieprawidłowo skonfigurowane.Przyjrzyj się temu przykładowi:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - 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