Android obsługuje różnorodne ekrany dotykowe i tabliczki dotykowe, w tym tablety z rysikiem i tabletami z wyświetlaczem cyfrowym.
Ekrany dotykowe to urządzenia dotykowe powiązane z wyświetlaczem w taki sposób, że użytkownik ma wrażenie, że bezpośrednio manipuluje elementami na ekranie.
Płytki dotykowe to urządzenia dotykowe, które nie są powiązane z wyświetlaczem, takie jak tablet z digitalizatorem. Płytki dotykowe są zwykle używane do wskazywania lub do bezwzględnego pośredniego pozycjonowania lub sterowania interfejsem użytkownika za pomocą gestów.
Urządzenia dotykowe mogą mieć przyciski, których funkcje są podobne do przycisków myszy.
Urządzeniami dotykowymi można czasami manipulować 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 kluczy wirtualnych. Na przykład w niektórych urządzeniach z systemem Android obszar czujnika ekranu dotykowego wystaje 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 opiera się na dużej liczbie właściwości konfiguracyjnych, aby opisać charakterystykę i pożądane zachowanie każdego urządzenia.
Klasyfikacja urządzeń dotykowych
Urządzenie wejściowe jest klasyfikowane jako urządzenie wielodotykowe, jeśli spełnione są oba poniższe warunki:
- Urządzenie wejściowe zgłasza obecność osi absolutnych
ABS_MT_POSITION_X
iABS_MT_POSITION_Y
. - Urządzenie wejściowe nie ma żadnych przycisków gamepada. Ten warunek rozwiązuje niejasność związaną z niektórymi gamepadami, które zgłaszają osie z kodami pokrywającymi się z osiami MT.
Urządzenie wejściowe jest klasyfikowane jako urządzenie jednodotykowe, jeśli spełnione są oba poniższe 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 jedno i drugie.
- Urządzenie wejściowe zgłasza obecność osi absolutnych
ABS_X
iABS_Y
oraz obecność kodu kluczaBTN_TOUCH
.
Kiedy urządzenie wejściowe jest klasyfikowane jako urządzenie dotykowe, obecność kluczy wirtualnych jest określana poprzez próbę załadowania pliku mapy klawiszy wirtualnych dla tego urządzenia. Jeśli dostępna jest wirtualna mapa klawiszy, ładowany jest również plik układu klawiszy dla urządzenia. Informacje na temat lokalizacji i formatu tych plików znajdziesz w [Pliki wirtualnej mapy klawiszy](#virtual-key-map-files).
Następnie system ładuje plik konfiguracyjny urządzenia wejściowego dla urządzenia dotykowego.
Wszystkie wbudowane urządzenia dotykowe powinny mieć pliki konfiguracyjne urządzeń wejściowych. Jeśli nie ma pliku konfiguracyjnego urządzenia wejściowego, system wybiera domyślną konfigurację, odpowiednią dla dotykowych urządzeń peryferyjnych ogólnego przeznaczenia, takich jak zewnętrzne ekrany dotykowe USB lub Bluetooth HID lub tabliczki dotykowe. Te ustawienia domyślne nie są przeznaczone dla wbudowanych ekranów dotykowych i mogą powodować nieprawidłowe działanie.
Po załadowaniu konfiguracji urządzenia wejściowego system klasyfikuje urządzenie wejściowe jako ekran dotykowy , panel dotykowy lub urządzenie wskazujące .
- Urządzenie z ekranem dotykowym służy do bezpośredniej manipulacji obiektami na ekranie. Użytkownik bezpośrednio dotyka ekranu, dzięki czemu system nie wymaga żadnych dodatkowych afordancji wskazujących, którymi obiektami manipuluje.
- Urządzenie touchpad służy do dostarczania aplikacji informacji o bezwzględnym położeniu w przypadku dotknięcia danego obszaru czujnika. Może się przydać w przypadku tabletów z digitalizatorem.
- Urządzenie wskazujące służy do pośredniego manipulowania obiektami na ekranie za pomocą kursora. Palce są interpretowane jako gesty wskaźnika wielodotykowego. Inne narzędzia, takie jak rysiki, są interpretowane przy użyciu pozycji bezwzględnych. Aby uzyskać więcej informacji, zobacz Pośrednie gesty wskaźnika wielodotykowego .
Poniższe zasady służą do klasyfikacji urządzenia wejściowego jako ekranu dotykowego, panelu dotykowego lub urządzenia wskazującego.
- Jeśli właściwość
touch.deviceType
jest ustawiona, typ urządzenia jest ustawiany zgodnie ze wskazaniami. - Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej
INPUT_PROP_DIRECT
(poprzez ioctlEVIOCGPROP
), wówczas typem urządzenia jest ustawiony na ekran dotykowy . W tym warunku zakłada się, że urządzenia dotykowe z bezpośrednim wejściem są podłączone do wyświetlacza, który również jest podłączony. - Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej
INPUT_PROP_POINTER
(poprzez ioctlEVIOCGPROP
), wówczas typ urządzenia jest ustawiony na pointer . - Jeśli urządzenie wejściowe zgłosi obecność osi względnych
REL_X
lubREL_Y
, wówczas typem urządzenia jest ustawiony na touchpad . Ten warunek rozwiązuje niejednoznaczność dotyczącą urządzeń wejściowych składających się zarówno z myszy, jak i panelu dotykowego. W tym przypadku touchpad nie jest używany do sterowania wskaźnikiem, ponieważ mysz już nim steruje. - W przeciwnym razie typ urządzenia jest ustawiony na pointer . To ustawienie domyślne zapewnia, że tabliczki dotykowe, które nie zostały wyznaczone do żadnego innego specjalnego przeznaczenia, sterują wskaźnikiem.
guziki
Przyciski to opcjonalne elementy sterujące, których aplikacje mogą używać do wykonywania dodatkowych funkcji. Przyciski na urządzeniach dotykowych zachowują się podobnie do przycisków myszy i można ich używać głównie z urządzeniami dotykowymi ze wskaźnikiem lub rysikiem.
Obsługiwane są następujące przyciski:
-
BTN_LEFT
: Mapowane doMotionEvent.BUTTON_PRIMARY
. -
BTN_RIGHT
: Mapowane doMotionEvent.BUTTON_SECONDARY
. -
BTN_MIDDLE
: Mapowane doMotionEvent.BUTTON_MIDDLE
. -
BTN_BACK
iBTN_SIDE
: Mapowane doMotionEvent.BUTTON_BACK
. Naciśnięcie tego przycisku powoduje także syntezę naciśnięcia klawisza z kodem klawiszaKeyEvent.KEYCODE_BACK
. -
BTN_FORWARD
iBTN_EXTRA
: Mapowane doMotionEvent.BUTTON_FORWARD
. Naciśnięcie tego przycisku powoduje także syntezę naciśnięcia klawisza z kodem klawiszaKeyEvent.KEYCODE_FORWARD
. -
BTN_STYLUS
: Mapowane doMotionEvent.BUTTON_SECONDARY
. -
BTN_STYLUS2
: Mapowane doMotionEvent.BUTTON_TERTIARY
.
Narzędzia i typy narzędzi
Narzędzie to palec, rysik lub inne urządzenie używane do interakcji z urządzeniem dotykowym. Niektóre urządzenia dotykowe potrafią rozróżnić różne typy narzędzi.
W innych miejscach systemu Android, np. w interfejsie API MotionEvent
, narzędzie jest często określane jako wskaźnik .
Obsługiwane są następujące typy narzędzi:
-
BTN_TOOL_FINGER
iMT_TOOL_FINGER
: Mapowane doMotionEvent.TOOL_TYPE_FINGER
. -
BTN_TOOL_PEN
iMT_TOOL_PEN
: Mapowane doMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_RUBBER
: Mapowane doMotionEvent.TOOL_TYPE_ERASER
. -
BTN_TOOL_BRUSH
: Mapowane doMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_PENCIL
: Mapowane doMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_AIRBRUSH
: Mapowane doMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_MOUSE
: Mapowane doMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_LENS
: Mapowane doMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
iBTN_TOOL_QUADTAP
: Mapowane doMotionEvent.TOOL_TYPE_FINGER
.
Utrzymywanie kursora a dotykanie narzędzi
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ą wykryć obecność narzędzia unoszącego się nad urządzeniem dotykowym. Te, które to robią, takie jak digitalizatory rysikowe oparte na częstotliwości radiowej, często potrafią wykryć, kiedy narzędzie znajduje się w ograniczonym zasięgu digitalizatora.
Komponent InputReader
odróżnia narzędzia dotykające od narzędzi przesuwanych. Podobnie narzędzia dotykowe i narzędzia po najechaniu myszką są zgłaszane aplikacjom na różne sposoby.
Narzędzia dotykowe są zgłaszane aplikacjom jako zdarzenia dotykowe przy użyciu funkcji MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
i MotionEvent.ACTION_POINTER_UP
.
Narzędzia do przesuwania są zgłaszane aplikacjom jako ogólne zdarzenia ruchu przy użyciu MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
i MotionEvent.ACTION_HOVER_EXIT
.
Wymagania sterownika urządzenia dotykowego
- Sterowniki urządzeń dotykowych powinny rejestrować tylko osie i kody klawiszy dla osi i przycisków, które obsługują. Zarejestrowanie nieobsługiwanych osi lub kodów klawiszy może zmylić algorytm klasyfikacji urządzenia lub spowodować, że system błędnie wykryje możliwości urządzenia. Na przykład, jeśli urządzenie zgłasza kod klucza
BTN_TOUCH
, system zakłada, żeBTN_TOUCH
jest zawsze używany do wskazania, czy narzędzie dotyka ekranu. DlategoBTN_TOUCH
nie powinien być używany do wskazania, że narzędzie znajduje się jedynie w zasięgu i unosi się w powietrzu. - Urządzenia obsługujące jeden dotyk korzystają z następujących zdarzeń wejściowych systemu Linux:
-
ABS_X
: (WYMAGANE) Podaje współrzędną X narzędzia. -
ABS_Y
: (WYMAGANE) Podaje współrzędną Y narzędzia. -
ABS_PRESSURE
: (opcjonalnie) Podaje fizyczny nacisk przyłożony do końcówki narzędzia lub siłę sygnału kontaktu dotykowego. -
ABS_TOOL_WIDTH
: (opcjonalnie) Podaje pole przekroju poprzecznego lub szerokość kontaktu dotykowego lub samego narzędzia. -
ABS_DISTANCE
: (opcjonalnie) Podaje odległość narzędzia od powierzchni urządzenia dotykowego. -
ABS_TILT_X
: (opcjonalne) Raportuje nachylenie narzędzia od powierzchni urządzenia dotykowego wzdłuż osi X. -
ABS_TILT_Y
: (opcjonalnie) Raportuje nachylenie narzędzia od powierzchni urządzenia dotykowego wzdłuż osi Y. -
BTN_TOUCH
: (WYMAGANE) Wskazuje, czy narzędzie dotyka urządzenia. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcjonalnie) Raportuje stany przycisków . -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (opcjonalnie ) Podaje typ narzędzia .
-
- Urządzenia wielodotykowe korzystają z następujących zdarzeń wejściowych systemu Linux:
-
ABS_MT_POSITION_X
: (WYMAGANE) Podaje współrzędną X narzędzia. -
ABS_MT_POSITION_Y
: (WYMAGANE) Podaje współrzędną Y narzędzia. -
ABS_MT_PRESSURE
: (opcjonalnie) Podaje fizyczny nacisk przyłożony do końcówki 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
: (opcjonalnie) Podaje długość krótszego wymiaru kontaktu dotykowego. Oś ta nie powinna być używana, jeśliABS_MT_TOUCH_MAJOR
raportuje pomiar powierzchni. -
ABS_MT_WIDTH_MAJOR
: (opcjonalnie) Podaje pole przekroju poprzecznego samego narzędzia lub długość dłuższego wymiaru samego narzędzia. Nie używaj tej osi, jeśli nie znasz wymiarów samego narzędzia. -
ABS_MT_WIDTH_MINOR
: (opcjonalnie) Podaje długość krótszego wymiaru samego narzędzia. Oś ta nie powinna być używana, jeśliABS_MT_WIDTH_MAJOR
raportuje pomiar powierzchni lub jeśli wymiary samego narzędzia nie są znane. -
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) Podaje 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 używana do niezależnej identyfikacji i śledzenia każdego narzędzia, gdy aktywnych jest wiele narzędzi. Na przykład, gdy urządzenia dotyka wiele palców, każdemu z nich należy przypisać odrębny identyfikator śledzenia, który będzie używany tak długo, jak palec pozostaje w kontakcie. Identyfikatory śledzenia można ponownie wykorzystać, gdy powiązane z nimi narzędzia znajdą się poza zasięgiem. -
ABS_MT_SLOT
: (opcjonalnie) Podaje identyfikator gniazda narzędzia, gdy używany jest protokół wielodotykowy systemu Linux „B”. Więcej szczegółów można znaleźć w dokumentacji protokołu wielodotykowego systemu Linux. -
BTN_TOUCH
: (WYMAGANE) Wskazuje, czy narzędzie dotyka urządzenia. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcjonalnie) Raportuje stany przycisków . -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (opcjonalnie ) Podaje typ narzędzia .
-
- Jeśli zdefiniowano osie zarówno dla protokołu jednodotykowego, jak i wielodotykowego, używane będą tylko osie wielodotykowe, a osie jednodotykowe są ignorowane.
Wartości minimalne i maksymalne osi
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
iABS_MT_POSITION_Y
definiują granice obszaru aktywnego urządzenia w jednostkach powierzchni właściwych dla urządzenia. W przypadku ekranu dotykowego obszar aktywny opisuje część urządzenia dotykowego, która faktycznie zakrywa wyświetlacz.W przypadku ekranu dotykowego system automatycznie interpoluje zgłoszone pozycje dotyku w jednostkach powierzchni, aby uzyskać pozycje dotyku w pikselach wyświetlacza, zgodnie z następującym obliczeniem:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Ekran dotykowy może zgłaszać dotknięcia poza raportowanym obszarem aktywnym.
Dotknięcia inicjowane poza obszarem aktywnym nie są dostarczane do aplikacji, ale można ich używać do kluczy wirtualnych.
Dotknięcia inicjowane w obszarze aktywnym lub wchodzące i wychodzące z obszaru wyświetlania są dostarczane do aplikacji. W związku z tym, jeśli dotknięcie rozpocznie się w granicach aplikacji, a następnie wyjdzie 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 oczekiwane zachowanie.
Urządzenie dotykowe nigdy nie powinno mocować współrzędnych dotykowych do granic obszaru aktywnego. Jeśli dotyk opuści obszar aktywny, powinien zostać zgłoszony jako znajdujący się poza obszarem aktywnym lub w ogóle nie powinien być zgłaszany.
Na przykład, jeśli palec użytkownika dotyka lewego górnego rogu ekranu dotykowego, może zgłosić współrzędne (minX, minY). Jeśli palec w dalszym ciągu będzie się przesuwał poza aktywny obszar, ekran dotykowy powinien albo rozpocząć zgłaszanie współrzędnych ze składowymi mniejszymi niż minX i minY, np. (minX - 2, minY - 3), albo powinien całkowicie przestać raportować dotyk. Innymi słowy, ekran dotykowy nie powinien raportować (minX, minY), gdy palec użytkownika rzeczywiście dotyka poza obszarem aktywnym.
Przymocowanie współrzędnych dotykowych 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 z obszaru wyświetlania.
Wartości zgłaszane przez
ABS_PRESSURE
lubABS_MT_PRESSURE
, jeśli w ogóle są zgłaszane, muszą być niezerowe, gdy narzędzie dotyka urządzenia, i zerowe w przeciwnym razie, aby wskazać, że narzędzie się unosi.Zgłaszanie informacji o ciśnieniu jest opcjonalne , ale zdecydowanie zalecane. Aplikacje mogą wykorzystywać informacje o ciśnieniu do implementowania rysunków wrażliwych na nacisk 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 i zerowe w przeciwnym razie, ale nie jest to wymagane. Na przykład urządzenie dotykowe może mierzyć rozmiar kontaktów dotykowych palcem, ale nie kontaktów dotykowych rysikiem.Zgłaszanie informacji o rozmiarze jest opcjonalne , ale zdecydowanie zalecane. Aplikacje mogą wykorzystywać informacje o ciśnieniu do implementowania rysunków uwzględniających rozmiar 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 pozostać niezerowa nawet przy bezpośrednim kontakcie narzędzia. Dokładne raportowane wartości zależą od sposobu, w jaki sprzęt mierzy odległość.Zgłaszanie informacji o odległości jest opcjonalne , ale zalecane w przypadku urządzeń typu rysik.
Wartości zgłaszane przez
ABS_TILT_X
iABS_TILT_Y
powinny wynosić zero, gdy narzędzie jest ustawione prostopadle do urządzenia. Niezerowe pochylenie oznacza, że narzędzie jest trzymane pod kątem.Zakłada się, że kąty pochylenia wzdłuż osi X i Y są określone w stopniach od prostopadłej. Punkt środkowy (idealnie prostopadły) jest wyznaczany przez
(max + min) / 2
dla każdej osi. Wartości mniejsze niż punkt środkowy reprezentują przechylenie w górę lub w lewo, wartości większe niż punkt środkowy oznaczają przechylenie w dół lub w prawo.InputReader
konwertuje komponenty pochylenia X i Y na prostopadły kąt pochylenia w zakresie od 0 doPI / 2
radianów oraz płaski kąt orientacji w zakresie od-PI
doPI
radianów. Ta reprezentacja skutkuje opisem orientacji zgodnym z tym, co jest używane do opisu dotknięć palców.Zgłaszanie informacji o pochyleniu jest opcjonalne , ale zalecane w przypadku urządzeń typu rysik.
Jeśli typ narzędzia jest zgłaszany przez
ABS_MT_TOOL_TYPE
, zastępuje to wszelkie informacje o typie narzędzia zgłaszane przezBTN_TOOL_*
. Jeśli w ogóle nie są dostępne żadne informacje o typie narzędzia, domyślnym typem narzędzia jestMotionEvent.TOOL_TYPE_FINGER
.Narzędzie zostaje uznane za aktywne na podstawie następujących warunków:
Podczas korzystania z protokołu pojedynczego dotyku narzędzie jest aktywne, jeśli
BTN_TOUCH
lubBTN_TOOL_*
ma wartość 1.Warunek ten oznacza, że
InputReader
musi posiadać przynajmniej pewne informacje o naturze narzędzia, czy jest ono dotykające, czy przynajmniej o jego typie. Jeśli nie są dostępne żadne informacje, przyjmuje się, że narzędzie jest nieaktywne (poza zakresem).- W przypadku korzystania z protokołu wielodotyku „A” narzędzie jest aktywne zawsze, gdy pojawia się w najnowszym raporcie synchronizacji. Kiedy narzędzie przestaje pojawiać się w raportach synchronizacji, przestaje istnieć.
- W przypadku korzystania z protokołu wielodotyku „B” narzędzie jest aktywne tak długo, jak długo ma aktywne gniazdo. Po wyczyszczeniu gniazda narzędzie przestaje istnieć.
- O tym, że narzędzie unosi się w powietrzu, decyduje się na podstawie następujących warunków:
- Jeśli narzędziem jest
BTN_TOOL_MOUSE
lubBTN_TOOL_LENS
, narzędzie nie unosi się w powietrzu, nawet jeśli spełniony jest którykolwiek z poniższych warunków. - Jeśli narzędzie jest aktywne i kierowca zgłasza informacje o ciśnieniu, a zgłaszane ciśnienie wynosi zero, wówczas narzędzie się unosi.
- Jeśli narzędzie jest aktywne i sterownik obsługuje kod klucza
BTN_TOUCH
, aBTN_TOUCH
ma wartość zero, to narzędzie się znajduje.
- Jeśli narzędziem jest
-
InputReader
obsługuje zarówno protokół wielodotykowy „A”, jak i „B”. Nowe sterowniki powinny używać protokołu „B”, ale którykolwiek z nich działa. Począwszy od wersji Androida 4.0, może być konieczna zmiana sterowników ekranu dotykowego, aby były zgodne ze specyfikacją protokołu wejściowego systemu Linux.
Mogą być wymagane następujące zmiany:
Gdy narzędzie stanie się nieaktywne (palec pójdzie „w górę”), powinno przestać pojawiać się w kolejnych raportach synchronizacji wielodotykowej. Kiedy wszystkie narzędzia staną się nieaktywne (wszystkie palce podniosą się do góry), sterownik powinien wysłać pusty pakiet raportu synchronizacji, taki jak
SYN_MT_REPORT
, po którym następujeSYN_REPORT
.Poprzednie wersje Androida oczekiwały raportowania zdarzeń „up” poprzez wysłanie wartości ciśnienia wynoszącej 0. Stare zachowanie było niezgodne ze specyfikacją protokołu wejściowego systemu Linux i nie jest już obsługiwane.
Informacje o ciśnieniu fizycznym lub sile sygnału należy zgłaszać za pomocą
ABS_MT_PRESSURE
.Poprzednie wersje Androida pobierały informacje o ciśnieniu z
ABS_MT_TOUCH_MAJOR
. Stare zachowanie 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ą
ABS_MT_TOUCH_MAJOR
.Poprzednie wersje Androida pobierały informacje o rozmiarze z
ABS_MT_TOOL_MAJOR
. Stare zachowanie było niezgodne ze specyfikacją protokołu wejściowego systemu Linux i nie jest już obsługiwane.
Obsługa urządzenia dotykowego
Poniżej znajduje się krótkie podsumowanie obsługi urządzenia dotykowego w systemie Android.
-
EventHub
odczytuje surowe zdarzenia ze sterownikaevdev
. -
InputReader
wykorzystuje nieprzetworzone zdarzenia i aktualizuje stan wewnętrzny dotyczący pozycji i innych cech każdego narzędzia. Śledzi także stany przycisków. - Jeżeli naciśnięto lub puszczono przycisk BACK lub FORWARD ,
InputReader
powiadamiaInputDispatcher
o kluczowym zdarzeniu. -
InputReader
sprawdza, czy nastąpiło naciśnięcie klawisza wirtualnego. Jeśli tak, powiadamiaInputDispatcher
o kluczowym zdarzeniu. -
InputReader
określa, czy dotyk został zainicjowany w granicach wyświetlacza. Jeśli tak, powiadamiaInputDispatcher
o zdarzeniu dotykowym. - Jeśli nie ma żadnych narzędzi dotykających, ale istnieje co najmniej jedno narzędzie przesuwające,
InputReader
powiadamiaInputDispatcher
o zdarzeniu najechania. - Jeśli typem urządzenia dotykowego jest pointer ,
InputReader
wykrywa gest wskaźnika, odpowiednio przesuwa wskaźnik i plamki oraz powiadamiaInputDispatcher
o zdarzeniu wskaźnika. -
InputDispatcher
używaWindowManagerPolicy
do określenia, czy zdarzenia powinny zostać wywołane i czy powinny obudzić urządzenie. NastępnieInputDispatcher
dostarcza zdarzenia do odpowiednich aplikacji.
Dotknij konfiguracji urządzenia
Zachowanie urządzenia dotykowego zależy od osi urządzenia, przycisków, właściwości wejściowych, konfiguracji urządzenia wejściowego, mapy klawiszy wirtualnych i układu klawiszy.
Więcej szczegółów na temat plików biorących udział w konfiguracji klawiatury można znaleźć w poniższych sekcjach:
Nieruchomości
System wykorzystuje wiele właściwości konfiguracyjnych urządzenia wejściowego do konfiguracji i kalibracji zachowania urządzenia dotykowego.
Jednym z powodów jest to, że sterowniki urządzeń dotykowych często zgłaszają charakterystykę dotknięć za pomocą jednostek specyficznych dla urządzenia.
Na przykład wiele urządzeń dotykowych mierzy obszar kontaktu dotykowego przy użyciu wewnętrznej skali specyficznej dla urządzenia, takiej jak całkowita liczba węzłów czujnikowych, które zostały wyzwolone przez dotyk. Ta nieprzetworzona wartość rozmiaru nie byłaby istotna dla aplikacji, ponieważ musiałyby znać rozmiar fizyczny i inne cechy węzłów czujnika urządzenia dotykowego.
System wykorzystuje parametry kalibracji zakodowane w plikach konfiguracyjnych urządzenia wejściowego do dekodowania, przekształcania i normalizowania wartości zgłaszanych przez urządzenie dotykowe w prostszą standardową reprezentację zrozumiałą dla aplikacji.
Konwencje dokumentacyjne
Dla celów dokumentacyjnych stosujemy poniższe konwencje opisujące wartości stosowane przez system podczas procesu kalibracji.
Surowe wartości osi
Poniższe wyrażenia oznaczają nieprzetworzone wartości zgłaszane przez sterownik urządzenia dotykowego jako zdarzenia EV_ABS
.
-
raw.x
- Wartość osi
ABS_X
lubABS_MT_POSITION_X
. -
raw.y
- Wartość osi
ABS_Y
lubABS_MT_POSITION_Y
. -
raw.pressure
- Wartość osi
ABS_PRESSURE
lubABS_MT_PRESSURE
lub 0 jeśli nie jest dostępne. -
raw.touchMajor
- Wartość osi
ABS_MT_TOUCH_MAJOR
lub 0 jeżeli nie jest dostępne. -
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
lub 0 jeśli nie jest dostępne. -
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
, lub 0 jeśli nie jest dostępne. -
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.
Surowe zakresy osi
Poniższe wyrażenia oznaczają granice wartości surowych. Uzyskuje się je poprzez wywołanie EVIOCGABS
ioctl dla każdej osi.
-
raw.*.min
- Włączająca minimalna wartość surowej osi.
-
raw.*.max
- Łączna maksymalna wartość nieprzetworzonej osi.
-
raw.*.range
- Odpowiednik
raw.*.max - raw.*.min
. -
raw.*.fuzz
- Dokładność surowej osi. np. fuzz = 1 oznacza, że wartości są z dokładnością do +/- 1 jednostki.
-
raw.width
- Łączna szerokość obszaru dotykowego, równoważna
raw.x.range + 1
. -
raw.height
- Łączna wysokość obszaru dotykowego, równoważna
raw.y.range + 1
.
Zakresy wyjściowe
Poniższe wyrażenia oznaczają charakterystykę wyjściowego układu współrzędnych. System wykorzystuje interpolację liniową do tłumaczenia informacji o położeniu dotyku z jednostek powierzchni używanych przez urządzenie dotykowe na jednostki wyjściowe zgłaszane aplikacjom, takim jak piksele wyświetlacza.
-
output.width
- Szerokość wyjściowa. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to szerokość wyświetlacza w pikselach. W przypadku płytek dotykowych (niepowiązanych z wyświetlaczem) szerokość wyjściowa jest równa
raw.width
, co oznacza, że nie jest wykonywana żadna interpolacja. -
output.height
- Wysokość wyjściowa. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to wysokość wyświetlacza w pikselach. W przypadku płytek dotykowych (niepowiązanych z wyświetlaczem) wysokość wyjściowa jest równa
raw.height
, co oznacza, że nie jest wykonywana żadna interpolacja. -
output.diag
- Długość przekątnej wyjściowego układu współrzędnych, równoważna
sqrt(output.width ^2 + output.height ^2)
.
Podstawowa konfiguracja
Narzędzie do mapowania wejścia dotykowego wykorzystuje wiele właściwości konfiguracyjnych znajdujących się w pliku konfiguracyjnym urządzenia wejściowego w celu określenia wartości kalibracyjnych. W poniższej tabeli opisano niektóre właściwości konfiguracyjne ogólnego przeznaczenia. Wszystkie pozostałe właściwości opisano w poniższych sekcjach wraz z polami, które służą do kalibracji.
typ.urządzenia dotykowego
Definicja: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Określa typ urządzenia dotykowego.
Jeśli wartość to
touchScreen
, urządzeniem dotykowym jest ekran dotykowy powiązany z wyświetlaczem.Jeśli wartością jest
touchPad
, urządzeniem dotykowym jest panel dotykowy niepowiązany z wyświetlaczem.Jeśli wartością jest
pointer
, urządzeniem dotykowym jest panel dotykowy niepowiązany z wyświetlaczem, a jego ruchy są wykorzystywane do pośrednich gestów wskaźnika wielodotykowego .Jeśli wartość jest
default
, system automatycznie wykrywa typ urządzenia zgodnie z algorytmem klasyfikacji.
Więcej informacji na temat wpływu typu urządzenia na zachowanie urządzenia dotykowego można znaleźć w sekcji Klasyfikacja .
W systemie Android 3 i niższych założono, że wszystkie urządzenia dotykowe są ekranami dotykowymi.
orientacja dotykowaŚwiadomy
Definicja: touch.orientationAware
= 0
| 1
Określa, czy urządzenie dotykowe powinno reagować na zmiany orientacji wyświetlacza.
Jeśli wartość wynosi
1
, pozycje dotykowe zgłaszane przez urządzenie dotykowe są obracane za każdym razem, gdy zmienia się orientacja wyświetlacza.Jeśli wartość wynosi
0
, pozycje dotykowe zgłaszane przez urządzenie dotykowe są odporne na zmiany orientacji wyświetlacza.
Wartość domyślna to 1
jeśli urządzenie jest ekranem dotykowym, 0
w przeciwnym razie.
System rozróżnia wewnętrzne i zewnętrzne ekrany i wyświetlacze dotykowe. Wewnętrzny ekran dotykowy obsługujący orientację jest obracany w zależności od orientacji wyświetlacza wewnętrznego. Zewnętrzny ekran dotykowy obsługujący orientację jest obracany w zależności od orientacji wyświetlacza zewnętrznego.
Funkcja świadomości orientacji umożliwia obracanie ekranów dotykowych na urządzeniach takich jak Nexus One. Na przykład, gdy urządzenie zostanie obrócone w kierunku zgodnym z ruchem wskazówek zegara o 90 stopni w stosunku do jego naturalnej orientacji, bezwzględne pozycje dotknięć zostaną ponownie odwzorowane w taki sposób, że dotknięcie w lewym górnym rogu bezwzględnego układu współrzędnych ekranu dotykowego będzie zgłaszane jako dotknięcie w lewym górnym rogu róg obróconego układu współrzędnych wyświetlacza. Dzieje się tak, aby dotknięcia były zgłaszane w tym samym układzie współrzędnych, którego używają aplikacje do rysowania elementów wizualnych.
Przed wprowadzeniem Honeycomb zakładano, że wszystkie urządzenia dotykowe rozpoznają orientację.
tryb dotykowy.gest
Definicja: touch.gestureMode
= pointer
| spots
| default
Określa tryb prezentacji gestów wskaźnika. Ta właściwość konfiguracyjna ma zastosowanie tylko wtedy, gdy urządzenie dotykowe jest typu pointer .
Jeśli wartością jest
pointer
, gesty panelu dotykowego są prezentowane za pomocą kursora podobnego do wskaźnika myszy.Jeśli wartością są
spots
, gesty panelu dotykowego są przedstawiane za pomocą kotwicy reprezentującej środek ciężkości gestu oraz zestawu okrągłych plamek reprezentujących położenie poszczególnych palców.
Wartością domyślną jest pointer
, gdy ustawiona jest właściwość wejściowa INPUT_PROP_SEMI_MT
, lub spots
inny sposób.
Pola X i Y
Pola X i Y dostarczają informacji o położeniu środka obszaru styku.
Obliczenie
Obliczenia są proste: informacje o położeniu ze sterownika dotykowego są interpolowane liniowo do wyjściowego układu współrzędnych.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
touchMajor, touchMinor, ToolMajor, ToolMinor, pola rozmiaru
Pola touchMajor
i touchMinor
opisują przybliżone wymiary powierzchni styku w jednostkach wyjściowych (pikselach).
Pola toolMajor
i toolMinor
opisują przybliżone wymiary samego narzędzia w jednostkach wyjściowych (pikselach).
Pole size
opisuje znormalizowany rozmiar dotyku w odniesieniu do największego możliwego dotyku, jaki może wyczuć urządzenie dotykowe. Najmniejszy możliwy znormalizowany rozmiar to 0,0 (brak kontaktu lub niemożliwy do zmierzenia), a największy możliwy znormalizowany rozmiar to 1,0 (obszar czujnika jest nasycony).
Gdy można zmierzyć zarówno przybliżoną długość, jak i szerokość, wówczas pole touchMajor
określa dłuższy wymiar, a pole touchMinor
określa krótszy wymiar powierzchni styku. Gdy można zmierzyć jedynie przybliżoną średnicę powierzchni styku, wówczas pola touchMajor
i touchMinor
są sobie równe.
Podobnie pole toolMajor
określa dłuższy wymiar, a pole toolMinor
określa krótszy wymiar pola przekroju poprzecznego narzędzia.
Jeśli rozmiar dotykowy jest niedostępny, ale rozmiar narzędzia jest dostępny, wówczas rozmiar narzędzia jest ustawiany na równy rozmiarowi dotykowemu. I odwrotnie, jeśli rozmiar narzędzia jest niedostępny, ale rozmiar dotyku jest dostępny, wówczas rozmiar dotyku jest ustawiany na równy rozmiarowi narzędzia.
Urządzenia dotykowe mierzą lub zgłaszają rozmiar dotyku i rozmiar narzędzia na różne sposoby. Obecna implementacja obsługuje trzy różne rodzaje pomiarów: średnicę, powierzchnię i geometryczną ramkę ograniczającą w jednostkach powierzchni.
Definicja: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Określa rodzaj pomiaru używany przez sterownik dotyku do raportowania rozmiaru dotyku i rozmiaru narzędzia.
Jeśli wartość wynosi
none
, rozmiar jest ustawiany na zero.Jeśli wartość jest
geometric
, zakłada się, że rozmiar jest określony w tych samych jednostkach powierzchni co pozycja, dlatego jest skalowany w ten sam sposób.Jeśli wartością jest
diameter
, przyjmuje się, że rozmiar jest proporcjonalny do średnicy (szerokości) dotyku lub narzędzia.Jeśli wartością jest
area
, zakłada się, że rozmiar jest proporcjonalny do obszaru dotyku lub narzędzia.Jeśli wartość jest
default
, system zastosuje kalibracjęgeometric
, jeśli dostępna jest ośraw.touchMajor
lubraw.toolMajor
, w przeciwnym razie zastosuje kalibracjęnone
.
dotykowy.rozmiar.skala
Definicja: touch.size.scale
= <nieujemna liczba zmiennoprzecinkowa>
Określa stały współczynnik skali używany w kalibracji.
Wartość domyślna to 1.0
.
odchylenie.rozmiaru dotyku
Definicja: touch.size.bias
= <nieujemna liczba zmiennoprzecinkowa>
Określa stałą wartość odchylenia używaną w kalibracji.
Wartość domyślna to 0.0
.
touch.size.issumed
Definicja: touch.size.isSummed
= 0
| 1
Określa, czy rozmiar ma być raportowany jako suma rozmiarów wszystkich aktywnych kontaktów, czy też indywidualnie dla każdego kontaktu.
Jeśli wartość wynosi
1
, raportowany rozmiar jest dzielony przez liczbę kontaktów przed użyciem.Jeśli wartość wynosi
0
, raportowany rozmiar jest używany bez zmian.
Wartość domyślna to 0
.
Niektóre urządzenia dotykowe, w szczególności urządzenia „Semi-MT”, nie są w stanie rozróżnić indywidualnych wymiarów wielu styków, dlatego zgłaszają pomiar rozmiaru reprezentujący ich całkowitą powierzchnię lub szerokość. W przypadku takich urządzeń tę właściwość należy ustawić tylko na 1
. W razie wątpliwości ustaw tę wartość na 0
.
Obliczenie
Obliczenia pól touchMajor
, touchMinor
, toolMajor
, toolMinor
i size
zależą od określonych parametrów kalibracji.
If raw.touchMajor and raw.toolMajor are available: touchMajor = raw.touchMajor touchMinor = raw.touchMinor toolMajor = raw.toolMajor toolMinor = raw.toolMinor Else If raw.touchMajor is available: toolMajor = touchMajor = raw.touchMajor toolMinor = touchMinor = raw.touchMinor Else If raw.toolMajor is available: touchMajor = toolMajor = raw.toolMajor touchMinor = toolMinor = raw.toolMinor Else touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 End If size = avg(touchMajor, touchMinor) If touch.size.isSummed == 1: touchMajor = touchMajor / numberOfActiveContacts touchMinor = touchMinor / numberOfActiveContacts toolMajor = toolMajor / numberOfActiveContacts toolMinor = toolMinor / numberOfActiveContacts size = size / numberOfActiveContacts End If If touch.size.calibration == "none": touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 Else If touch.size.calibration == "geometric": outputScale = average(output.width / raw.width, output.height / raw.height) touchMajor = touchMajor * outputScale touchMinor = touchMinor * outputScale toolMajor = toolMajor * outputScale toolMinor = toolMinor * outputScale Else If touch.size.calibration == "area": touchMajor = sqrt(touchMajor) touchMinor = touchMajor toolMajor = sqrt(toolMajor) toolMinor = toolMajor Else If touch.size.calibration == "diameter": touchMinor = touchMajor toolMinor = toolMajor End If If touchMajor != 0: output.touchMajor = touchMajor * touch.size.scale + touch.size.bias Else output.touchMajor = 0 End If If touchMinor != 0: output.touchMinor = touchMinor * touch.size.scale + touch.size.bias Else output.touchMinor = 0 End If If toolMajor != 0: output.toolMajor = toolMajor * touch.size.scale + touch.size.bias Else output.toolMajor = 0 End If If toolMinor != 0: output.toolMinor = toolMinor * touch.size.scale + touch.size.bias Else output.toolMinor = 0 End If output.size = size
pole ciśnienia
Pole pressure
opisuje przybliżony nacisk fizyczny wywierany na urządzenie dotykowe jako znormalizowaną wartość z zakresu od 0,0 (brak dotyku) do 1,0 (normalny nacisk).
Zerowe ciśnienie wskazuje, że narzędzie unosi się w powietrzu.
kalibracja.ciśnienia dotykowego
Definicja: touch.pressure.calibration
= none
| physical
| amplitude
| default
Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania ciśnienia.
Jeśli wartość wynosi
none
, ciśnienie jest nieznane, dlatego jest ustawiane na 1,0 w przypadku dotknięcia i 0,0 w przypadku najechania myszką.Jeśli wartość jest
physical
, zakłada się, że oś nacisku mierzy rzeczywistą fizyczną intensywność nacisku wywieranego na tabliczkę dotykową.Jeżeli wartością jest
amplitude
, zakłada się, że oś ciśnienia mierzy amplitudę sygnału, która jest powiązana z rozmiarem styku i przyłożonym naciskiem.Jeśli wartość jest
default
, system zastosuje kalibracjęphysical
, jeśli dostępna jest oś ciśnienia, w przeciwnym razie nie zastosujenone
.
skala.dotyku.ciśnienia
Definicja: touch.pressure.scale
= <nieujemna liczba zmiennoprzecinkowa>
Określa stały współczynnik skali używany w kalibracji.
Wartość domyślna to 1.0 / raw.pressure.max
.
Obliczenie
Obliczenie pola pressure
zależy od określonych parametrów kalibracyjnych.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
pola orientacji i pochylenia
Pole orientation
opisuje orientację dotyku i narzędzia jako pomiar kątowy. Orientacja 0
wskazuje, że oś główna jest zorientowana pionowo, -PI/2
wskazuje, że oś główna jest zorientowana w lewo, PI/2
oznacza, że oś główna jest zorientowana w prawo. Gdy dostępne jest narzędzie 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. Nachylenie 0
oznacza, że narzędzie jest prostopadłe do powierzchni. Nachylenie PI/2
wskazuje, że narzędzie leży płasko na powierzchni.
kalibracja.dotyku.orientacja
Definicja: touch.orientation.calibration
= none
| interpolated
| vector
| default
Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania orientacji.
- Jeśli wartość wynosi
none
, orientacja jest nieznana, dlatego ustawiana jest na 0. - Jeśli wartość jest
interpolated
, orientacja jest interpolowana liniowo w taki sposób, że surowa wartośćraw.orientation.min
jest odwzorowywana na-PI/2
, a surowa wartośćraw.orientation.max
jest odwzorowywana naPI/2
. Środkowa wartość(raw.orientation.min + raw.orientation.max) / 2
jest mapowana na0
. - Jeśli wartością jest
vector
, orientacja jest interpretowana jako wektor upakowany składający się z dwóch 4-bitowych pól ze znakiem. Ta reprezentacja jest używana w częściach protokołu Atmel Object Based Protocol. Po zdekodowaniu wektor daje kąt orientacji i wielkość ufności. Wielkość ufności jest używana do skalowania informacji o rozmiarze, chyba że jest ona geometryczna. - Jeśli wartość jest
default
, system użyje kalibracjiinterpolated
, jeśli dostępna jest oś orientacji, w przeciwnym razie nie zastosujenone
.
Obliczenie
Obliczenie pól orientation
i tilt
zależy od określonych parametrów kalibracji i dostępnych danych wejściowych.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
pole odległości
Pole distance
opisuje odległość pomiędzy narzędziem a powierzchnią urządzenia dotykowego. Wartość 0,0 wskazuje na bezpośredni kontakt, a większe wartości wskazują na rosnącą odległość od powierzchni.
kalibracja.odległości dotyku
Definicja: touch.distance.calibration
= none
| scaled
| default
Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania odległości.
Jeśli wartość wynosi
none
, odległość jest nieznana, dlatego ustawia się ją na 0.Jeżeli wartość jest
scaled
, zgłoszona odległość jest mnożona przez stały współczynnik skali.Jeśli wartość jest
default
, system zastosuje kalibracjęscaled
jeśli dostępna jest oś odległości, w przeciwnym razie nie zastosujenone
.
skala.odległości dotyku
Definicja: touch.distance.scale
= <nieujemna liczba zmiennoprzecinkowa>
Określa stały współczynnik skali używany w kalibracji.
Wartość domyślna to 1.0
.
Obliczenie
Obliczenie pola distance
zależy od określonych parametrów kalibracyjnych.
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 kompatybilności
Właściwości konfiguracyjne urządzeń dotykowych uległy znaczącym zmianom w systemie Android Ice Cream Sandwich 4.0. Wszystkie pliki konfiguracyjne urządzeń wejściowych dla urządzeń dotykowych muszą zostać zaktualizowane, aby móc korzystać z nowych właściwości konfiguracyjnych.
Starsze sterowniki urządzeń dotykowych również mogą wymagać aktualizacji.
Pliki map kluczy wirtualnych
Do implementacji kluczy wirtualnych można używać urządzeń dotykowych.
Można to zrobić na kilka sposobów, w zależności od możliwości kontrolera dotykowego. Niektóre kontrolery dotykowe można bezpośrednio skonfigurować do implementacji klawiszy programowych poprzez ustawienie rejestrów oprogramowania sprzętowego. Innym razem pożądane jest wykonanie mapowania współrzędnych dotykowych na kody klawiszy w oprogramowaniu.
Gdy klucze wirtualne są zaimplementowane w oprogramowaniu, jądro musi wyeksportować plik mapy kluczy wirtualnych o nazwie virtualkeys.<devicename>
jako właściwość płytki. Na przykład, jeśli sterowniki urządzeń z ekranem dotykowym zgłaszają swoją nazwę jako „touchyfeely”, wówczas plik mapy klawiszy wirtualnych musi mieć ścieżkę /sys/board_properties/virtualkeys.touchyfeely
.
Plik mapy kluczy wirtualnych opisuje współrzędne i kody klawiszy Linux dla kluczy wirtualnych 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 mapy klawiszy wirtualnych to zwykły plik tekstowy składający się z sekwencji opisów układu klawiszy wirtualnych oddzielonych znakami nowej linii lub dwukropkami.
Linie komentarza zaczynają się od „#” i trwają do końca linii.
Każdy klucz wirtualny jest opisany przez 6 elementów rozdzielonych dwukropkami:
-
0x01
: Kod wersji. Zawsze musi mieć0x01
. - <Kod klucza systemu Linux>: Kod klucza systemu Linux dla klucza wirtualnego.
- <centerX>: Współrzędna X środka klucza wirtualnego.
- <centerY>: Współrzędna Y w pikselach środka klucza wirtualnego.
- <width>: Szerokość klucza wirtualnego w pikselach.
- <wysokość>: Wysokość klucza wirtualnego w pikselach.
Wszystkie współrzędne i rozmiary są określone w układzie współrzędnych wyświetlacza.
Oto plik mapy kluczy wirtualnych, cały zapisany w jednej linii.
# 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 kluczy wirtualnych można również zapisać w wielu wierszach.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
W powyższym przykładzie ekran dotykowy ma rozdzielczość 480x800. W związku z tym wszystkie klawisze wirtualne mają współrzędną <centerY> wynoszącą 835, czyli nieco poniżej widocznego obszaru ekranu dotykowego.
Pierwszy klucz ma kod skanujący Linuksa równy 158
( KEY_BACK
), centerX wynoszący 55
, centerY wynoszący 835
, szerokość 90
i wysokość 55
.
Przykład
Plik mapy kluczy wirtualnych: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Plik układu klucza: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Plik mapy kluczowych znaków: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Pośrednie gesty wskaźnika wielodotykowego
W trybie wskaźnika system interpretuje następujące gesty:
- Stuknięcie jednym palcem: kliknięcie.
- Ruch jednym palcem: przesuwanie wskaźnika.
- Ruch jednym palcem i naciśnięcie przycisku: przeciągnij wskaźnik.
- Ruch dwoma palcami Oba palce poruszają się w tym samym kierunku: przeciągnij obszar pod wskaźnikiem w tym kierunku. Sam wskaźnik się nie porusza.
- Ruch dwoma palcami oba palce zbliżają się do siebie lub rozsuwają w różnych kierunkach: przesuwanie/skalanie/obrót obszaru otaczającego wskaźnik. Sam wskaźnik się nie porusza.
- Ruch wieloma palcami: gest swobodny.
Odrzucenie palmy
Począwszy od Androida 13, system może automatycznie odrzucać dane wejściowe z dłoni, gdy włączona jest wbudowana platforma. Własne, niestandardowe rozwiązania są nadal obsługiwane, chociaż może zaistnieć potrzeba ich modyfikacji, aby zwracały flagę TOOL_TYPE_PALM
po wykryciu dłoni. Wbudowany framework działa również w połączeniu z niestandardowymi rozwiązaniami.
Rzeczywisty model analizuje pierwsze 90 ms danych gestów, bieżący wskaźnik i otaczające wskaźniki, a następnie rozważa, jak daleko od krawędzi wyświetlacza znajdują się dotknięcia. Następnie określa, dla poszczególnych wskaźników, które ze wskaźników są dłońmi. Uwzględnia także rozmiar każdego kontaktu, zgodnie z raportami touchMajor
i touchMinor
. Następnie platforma Android usuwa wskaźniki oznaczone jako dłonie ze strumienia dotykowego.
Jeśli wskaźnik został już wysłany do aplikacji, system albo:
- (Jeśli istnieją inne aktywne wskaźniki) Anuluje wskaźnik z ustawionymi
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 powodować działania użytkownika. Ta flaga jest ustawiona zarówno dla ACTION_CANCEL
, jak i ACTION_POINTER_UP
.
Jeśli wskaźnik dłoni nie został wysłany do aplikacji, system po prostu go upuści.
Włącz odrzucanie dłoni
- W sterowniku dotykowym użyj makra
input_abs_set_res
, aby ustawić rozdzielczości dla następujących 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 je obsługuje, upewnij się, że rozdzielczość jest ustawiona prawidłowo. -
- Aby potwierdzić, że pola są ustawione poprawnie, uruchom:
$ adb shell getevent -li
- Aby włączyć tę funkcję w czasie wykonywania, uruchom:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Uruchom ponownie proces
system_server
.$ adb shell stop && adb shell start
- Upewnij się, że
adb shell dumpsys input
pokazują, że wUnwantedInteractionBlocker
znajdują się elementy odrzucające dłonie. Jeśli tak nie jest, sprawdź dzienniki związane z danymi wejściowymi, aby znaleźć wskazówki dotyczące tego, co mogło być błędnie skonfigurowane.Zobacz następujący przykład w celach informacyjnych:
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 odpowiednią komendę sysprop w pliku
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
Dalsza lektura
,Android obsługuje różnorodne ekrany dotykowe i tabliczki dotykowe, w tym tablety z rysikiem i tabletami z wyświetlaczem cyfrowym.
Ekrany dotykowe to urządzenia dotykowe powiązane z wyświetlaczem w taki sposób, że użytkownik ma wrażenie, że bezpośrednio manipuluje elementami na ekranie.
Płytki dotykowe to urządzenia dotykowe, które nie są powiązane z wyświetlaczem, takie jak tablet z digitalizatorem. Płytki dotykowe są zwykle używane do wskazywania lub do bezwzględnego pośredniego pozycjonowania lub sterowania interfejsem użytkownika za pomocą gestów.
Urządzenia dotykowe mogą mieć przyciski, których funkcje są podobne do przycisków myszy.
Urządzeniami dotykowymi można czasami manipulować 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 kluczy wirtualnych. Na przykład w niektórych urządzeniach z systemem Android obszar czujnika ekranu dotykowego wystaje 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 opiera się na dużej liczbie właściwości konfiguracyjnych, aby opisać charakterystykę i pożądane zachowanie każdego urządzenia.
Klasyfikacja urządzeń dotykowych
Urządzenie wejściowe jest klasyfikowane jako urządzenie wielodotykowe, jeśli spełnione są oba poniższe warunki:
- Urządzenie wejściowe zgłasza obecność osi absolutnych
ABS_MT_POSITION_X
iABS_MT_POSITION_Y
. - Urządzenie wejściowe nie ma żadnych przycisków gamepada. Ten warunek rozwiązuje niejasność związaną z niektórymi gamepadami, które zgłaszają osie z kodami pokrywającymi się z osiami MT.
Urządzenie wejściowe jest klasyfikowane jako urządzenie jednodotykowe, jeśli spełnione są oba poniższe 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 jedno i drugie.
- Urządzenie wejściowe zgłasza obecność osi absolutnych
ABS_X
iABS_Y
oraz obecność kodu kluczaBTN_TOUCH
.
Kiedy urządzenie wejściowe jest klasyfikowane jako urządzenie dotykowe, obecność kluczy wirtualnych jest określana poprzez próbę załadowania pliku mapy klawiszy wirtualnych dla tego urządzenia. Jeśli dostępna jest wirtualna mapa klawiszy, ładowany jest również plik układu klawiszy dla urządzenia. Informacje na temat lokalizacji i formatu tych plików znajdziesz w [Pliki wirtualnej mapy klawiszy](#virtual-key-map-files).
Następnie system ładuje plik konfiguracyjny urządzenia wejściowego dla urządzenia dotykowego.
Wszystkie wbudowane urządzenia dotykowe powinny mieć pliki konfiguracyjne urządzeń wejściowych. Jeśli nie ma pliku konfiguracyjnego urządzenia wejściowego, system wybiera domyślną konfigurację, odpowiednią dla dotykowych urządzeń peryferyjnych ogólnego przeznaczenia, takich jak zewnętrzne ekrany dotykowe USB lub Bluetooth HID lub tabliczki dotykowe. Te ustawienia domyślne nie są przeznaczone dla wbudowanych ekranów dotykowych i mogą powodować nieprawidłowe działanie.
Po załadowaniu konfiguracji urządzenia wejściowego system klasyfikuje urządzenie wejściowe jako ekran dotykowy , panel dotykowy lub urządzenie wskazujące .
- Urządzenie z ekranem dotykowym służy do bezpośredniej manipulacji obiektami na ekranie. Użytkownik bezpośrednio dotyka ekranu, dzięki czemu system nie wymaga żadnych dodatkowych afordancji wskazujących, którymi obiektami manipuluje.
- Urządzenie touchpad służy do dostarczania aplikacji informacji o bezwzględnym położeniu w przypadku dotknięcia danego obszaru czujnika. Może się przydać w przypadku tabletów z digitalizatorem.
- Urządzenie wskazujące służy do pośredniego manipulowania obiektami na ekranie za pomocą kursora. Palce są interpretowane jako gesty wskaźnika wielodotykowego. Inne narzędzia, takie jak rysiki, są interpretowane przy użyciu pozycji bezwzględnych. Aby uzyskać więcej informacji, zobacz Pośrednie gesty wskaźnika wielodotykowego .
Poniższe zasady służą do klasyfikacji urządzenia wejściowego jako ekranu dotykowego, panelu dotykowego lub urządzenia wskazującego.
- Jeśli właściwość
touch.deviceType
jest ustawiona, typ urządzenia jest ustawiany zgodnie ze wskazaniami. - Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej
INPUT_PROP_DIRECT
(poprzez ioctlEVIOCGPROP
), wówczas typem urządzenia jest ustawiony na ekran dotykowy . W tym warunku zakłada się, że urządzenia dotykowe z bezpośrednim wejściem są podłączone do wyświetlacza, który również jest podłączony. - Jeśli urządzenie wejściowe zgłasza obecność właściwości wejściowej
INPUT_PROP_POINTER
(poprzez ioctlEVIOCGPROP
), wówczas typ urządzenia jest ustawiony na pointer . - Jeśli urządzenie wejściowe zgłosi obecność osi względnych
REL_X
lubREL_Y
, wówczas typem urządzenia jest ustawiony na touchpad . Ten warunek rozwiązuje niejednoznaczność dotyczącą urządzeń wejściowych składających się zarówno z myszy, jak i panelu dotykowego. W tym przypadku touchpad nie jest używany do sterowania wskaźnikiem, ponieważ mysz już nim steruje. - W przeciwnym razie typ urządzenia jest ustawiony na pointer . To ustawienie domyślne zapewnia, że tabliczki dotykowe, które nie zostały wyznaczone do żadnego innego specjalnego przeznaczenia, sterują wskaźnikiem.
guziki
Przyciski to opcjonalne elementy sterujące, których aplikacje mogą używać do wykonywania dodatkowych funkcji. Przyciski na urządzeniach dotykowych zachowują się podobnie do przycisków myszy i można ich używać głównie z urządzeniami dotykowymi ze wskaźnikiem lub rysikiem.
Obsługiwane są następujące przyciski:
-
BTN_LEFT
: Mapowane doMotionEvent.BUTTON_PRIMARY
. -
BTN_RIGHT
: Mapowane doMotionEvent.BUTTON_SECONDARY
. -
BTN_MIDDLE
: Mapowane doMotionEvent.BUTTON_MIDDLE
. -
BTN_BACK
iBTN_SIDE
: Mapowane doMotionEvent.BUTTON_BACK
. Naciśnięcie tego przycisku powoduje także syntezę naciśnięcia klawisza z kodem klawiszaKeyEvent.KEYCODE_BACK
. -
BTN_FORWARD
iBTN_EXTRA
: Mapowane doMotionEvent.BUTTON_FORWARD
. Naciśnięcie tego przycisku powoduje także syntezę naciśnięcia klawisza z kodem klawiszaKeyEvent.KEYCODE_FORWARD
. -
BTN_STYLUS
: Mapowane doMotionEvent.BUTTON_SECONDARY
. -
BTN_STYLUS2
: Mapowane doMotionEvent.BUTTON_TERTIARY
.
Narzędzia i typy narzędzi
Narzędzie to palec, rysik lub inne urządzenie używane do interakcji z urządzeniem dotykowym. Niektóre urządzenia dotykowe potrafią rozróżnić różne typy narzędzi.
W innych miejscach systemu Android, np. w interfejsie API MotionEvent
, narzędzie jest często określane jako wskaźnik .
Obsługiwane są następujące typy narzędzi:
-
BTN_TOOL_FINGER
iMT_TOOL_FINGER
: Mapowane doMotionEvent.TOOL_TYPE_FINGER
. -
BTN_TOOL_PEN
iMT_TOOL_PEN
: Mapowane doMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_RUBBER
: Mapowane doMotionEvent.TOOL_TYPE_ERASER
. -
BTN_TOOL_BRUSH
: Mapowane doMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_PENCIL
: Mapowane doMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_AIRBRUSH
: Mapowane doMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_MOUSE
: Mapowane doMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_LENS
: Mapowane doMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
iBTN_TOOL_QUADTAP
: Mapowane doMotionEvent.TOOL_TYPE_FINGER
.
Utrzymywanie kursora a dotykanie narzędzi
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ą wykryć obecność narzędzia unoszącego się nad urządzeniem dotykowym. Te, które to robią, takie jak digitalizatory rysikowe oparte na częstotliwości radiowej, często potrafią wykryć, kiedy narzędzie znajduje się w ograniczonym zasięgu digitalizatora.
Komponent InputReader
odróżnia narzędzia dotykające od narzędzi przesuwanych. Podobnie narzędzia dotykowe i narzędzia po najechaniu myszką są zgłaszane aplikacjom na różne sposoby.
Narzędzia dotykowe są zgłaszane aplikacjom jako zdarzenia dotykowe przy użyciu funkcji MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
i MotionEvent.ACTION_POINTER_UP
.
Narzędzia do przesuwania są zgłaszane aplikacjom jako ogólne zdarzenia ruchu przy użyciu MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
i MotionEvent.ACTION_HOVER_EXIT
.
Wymagania sterownika urządzenia dotykowego
- Sterowniki urządzeń dotykowych powinny rejestrować tylko osie i kody klawiszy dla osi i przycisków, które obsługują. Zarejestrowanie nieobsługiwanych osi lub kodów klawiszy może zmylić algorytm klasyfikacji urządzenia lub spowodować, że system błędnie wykryje możliwości urządzenia. Na przykład, jeśli urządzenie zgłasza kod klucza
BTN_TOUCH
, system zakłada, żeBTN_TOUCH
jest zawsze używany do wskazania, czy narzędzie dotyka ekranu. DlategoBTN_TOUCH
nie powinien być używany do wskazania, że narzędzie znajduje się jedynie w zasięgu i unosi się w powietrzu. - Urządzenia obsługujące jeden dotyk korzystają z następujących zdarzeń wejściowych systemu Linux:
-
ABS_X
: (WYMAGANE) Podaje współrzędną X narzędzia. -
ABS_Y
: (WYMAGANE) Podaje współrzędną Y narzędzia. -
ABS_PRESSURE
: (opcjonalnie) Podaje fizyczny nacisk przyłożony do końcówki narzędzia lub siłę sygnału kontaktu dotykowego. -
ABS_TOOL_WIDTH
: (opcjonalnie) Podaje pole przekroju poprzecznego lub szerokość kontaktu dotykowego lub samego narzędzia. -
ABS_DISTANCE
: (opcjonalnie) Podaje odległość narzędzia od powierzchni urządzenia dotykowego. -
ABS_TILT_X
: (opcjonalne) Raportuje nachylenie narzędzia od powierzchni urządzenia dotykowego wzdłuż osi X. -
ABS_TILT_Y
: (opcjonalnie) Raportuje nachylenie narzędzia od powierzchni urządzenia dotykowego wzdłuż osi Y. -
BTN_TOUCH
: (WYMAGANE) Wskazuje, czy narzędzie dotyka urządzenia. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcjonalnie) Raportuje stany przycisków . -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (opcjonalnie ) Podaje typ narzędzia .
-
- Urządzenia wielodotykowe korzystają z następujących zdarzeń wejściowych systemu Linux:
-
ABS_MT_POSITION_X
: (WYMAGANE) Podaje współrzędną X narzędzia. -
ABS_MT_POSITION_Y
: (WYMAGANE) Podaje współrzędną Y narzędzia. -
ABS_MT_PRESSURE
: (opcjonalnie) Podaje fizyczny nacisk przyłożony do końcówki 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
: (opcjonalnie) Podaje długość krótszego wymiaru kontaktu dotykowego. Oś ta nie powinna być używana, jeśliABS_MT_TOUCH_MAJOR
raportuje pomiar powierzchni. -
ABS_MT_WIDTH_MAJOR
: (opcjonalnie) Podaje pole przekroju poprzecznego samego narzędzia lub długość dłuższego wymiaru samego narzędzia. Nie używaj tej osi, jeśli nie znasz wymiarów samego narzędzia. -
ABS_MT_WIDTH_MINOR
: (opcjonalnie) Podaje długość krótszego wymiaru samego narzędzia. Oś ta nie powinna być używana, jeśliABS_MT_WIDTH_MAJOR
raportuje pomiar powierzchni lub jeśli wymiary samego narzędzia nie są znane. -
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) Podaje 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 używana do niezależnej identyfikacji i śledzenia każdego narzędzia, gdy aktywnych jest wiele narzędzi. Na przykład, gdy urządzenia dotyka wiele palców, każdemu z nich należy przypisać odrębny identyfikator śledzenia, który będzie używany tak długo, jak palec pozostaje w kontakcie. Identyfikatory śledzenia można ponownie wykorzystać, gdy powiązane z nimi narzędzia znajdą się poza zasięgiem. -
ABS_MT_SLOT
: (opcjonalnie) Podaje identyfikator gniazda narzędzia, gdy używany jest protokół wielodotykowy systemu Linux „B”. Więcej szczegółów można znaleźć w dokumentacji protokołu wielodotykowego systemu Linux. -
BTN_TOUCH
: (WYMAGANE) Wskazuje, czy narzędzie dotyka urządzenia. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcjonalnie) Raportuje stany przycisków . -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (opcjonalnie ) Podaje typ narzędzia .
-
- Jeśli zdefiniowano osie zarówno dla protokołu jednodotykowego, jak i wielodotykowego, używane będą tylko osie wielodotykowe, a osie jednodotykowe są ignorowane.
Wartości minimalne i maksymalne osi
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
iABS_MT_POSITION_Y
definiują granice obszaru aktywnego urządzenia w jednostkach powierzchni właściwych dla urządzenia. W przypadku ekranu dotykowego obszar aktywny opisuje część urządzenia dotykowego, która faktycznie zakrywa wyświetlacz.W przypadku ekranu dotykowego system automatycznie interpoluje zgłoszone pozycje dotyku w jednostkach powierzchni, aby uzyskać pozycje dotyku w pikselach wyświetlacza, zgodnie z następującym obliczeniem:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Ekran dotykowy może zgłaszać dotknięcia poza raportowanym obszarem aktywnym.
Dotknięcia inicjowane poza obszarem aktywnym nie są dostarczane do aplikacji, ale można ich używać do kluczy wirtualnych.
Dotknięcia inicjowane w obszarze aktywnym lub wchodzące i wychodzące z obszaru wyświetlania są dostarczane do aplikacji. W związku z tym, jeśli dotknięcie rozpocznie się w granicach aplikacji, a następnie wyjdzie 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 oczekiwane zachowanie.
Urządzenie dotykowe nigdy nie powinno mocować współrzędnych dotykowych do granic obszaru aktywnego. Jeśli dotyk opuści obszar aktywny, powinien zostać zgłoszony jako znajdujący się poza obszarem aktywnym lub w ogóle nie powinien być zgłaszany.
Na przykład, jeśli palec użytkownika dotyka lewego górnego rogu ekranu dotykowego, może zgłosić współrzędne (minX, minY). Jeśli palec w dalszym ciągu będzie się przesuwał poza aktywny obszar, ekran dotykowy powinien albo rozpocząć zgłaszanie współrzędnych ze składowymi mniejszymi niż minX i minY, np. (minX - 2, minY - 3), albo powinien całkowicie przestać raportować dotyk. Innymi słowy, ekran dotykowy nie powinien raportować (minX, minY), gdy palec użytkownika rzeczywiście dotyka poza obszarem aktywnym.
Przymocowanie współrzędnych dotykowych 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 z obszaru wyświetlania.
Wartości zgłaszane przez
ABS_PRESSURE
lubABS_MT_PRESSURE
, jeśli w ogóle są zgłaszane, muszą być niezerowe, gdy narzędzie dotyka urządzenia, i zerowe w przeciwnym razie, aby wskazać, że narzędzie się unosi.Zgłaszanie informacji o ciśnieniu jest opcjonalne , ale zdecydowanie zalecane. Aplikacje mogą wykorzystywać informacje o ciśnieniu do implementowania rysunków wrażliwych na nacisk 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 i zerowe w przeciwnym razie, ale nie jest to wymagane. Na przykład urządzenie dotykowe może mierzyć rozmiar kontaktów dotykowych palcem, ale nie kontaktów dotykowych rysikiem.Zgłaszanie informacji o rozmiarze jest opcjonalne , ale zdecydowanie zalecane. Aplikacje mogą wykorzystywać informacje o ciśnieniu do implementowania rysunków uwzględniających rozmiar 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 pozostać niezerowa nawet przy bezpośrednim kontakcie narzędzia. Dokładne raportowane wartości zależą od sposobu, w jaki sprzęt mierzy odległość.Zgłaszanie informacji o odległości jest opcjonalne , ale zalecane w przypadku urządzeń typu rysik.
Wartości zgłaszane przez
ABS_TILT_X
iABS_TILT_Y
powinny wynosić zero, gdy narzędzie jest ustawione prostopadle do urządzenia. Niezerowe pochylenie oznacza, że narzędzie jest trzymane pod kątem.Zakłada się, że kąty pochylenia wzdłuż osi X i Y są określone w stopniach od prostopadłej. Punkt środkowy (idealnie prostopadły) jest wyznaczany przez
(max + min) / 2
dla każdej osi. Wartości mniejsze niż punkt środkowy reprezentują przechylenie w górę lub w lewo, wartości większe niż punkt środkowy oznaczają przechylenie w dół lub w prawo.InputReader
konwertuje komponenty pochylenia X i Y na prostopadły kąt pochylenia w zakresie od 0 doPI / 2
radianów oraz płaski kąt orientacji w zakresie od-PI
doPI
radianów. Ta reprezentacja skutkuje opisem orientacji zgodnym z tym, co jest używane do opisu dotknięć palców.Zgłaszanie informacji o pochyleniu jest opcjonalne , ale zalecane w przypadku urządzeń typu rysik.
Jeśli typ narzędzia jest zgłaszany przez
ABS_MT_TOOL_TYPE
, zastępuje to wszelkie informacje o typie narzędzia zgłaszane przezBTN_TOOL_*
. Jeśli w ogóle nie są dostępne żadne informacje o typie narzędzia, domyślnym typem narzędzia jestMotionEvent.TOOL_TYPE_FINGER
.Narzędzie zostaje uznane za aktywne na podstawie następujących warunków:
Podczas korzystania z protokołu pojedynczego dotyku narzędzie jest aktywne, jeśli
BTN_TOUCH
lubBTN_TOOL_*
ma wartość 1.Warunek ten oznacza, że
InputReader
musi posiadać przynajmniej pewne informacje o naturze narzędzia, czy jest ono dotykające, czy przynajmniej o jego typie. Jeśli nie są dostępne żadne informacje, przyjmuje się, że narzędzie jest nieaktywne (poza zakresem).- W przypadku korzystania z protokołu wielodotyku „A” narzędzie jest aktywne zawsze, gdy pojawia się w najnowszym raporcie synchronizacji. Kiedy narzędzie przestaje pojawiać się w raportach synchronizacji, przestaje istnieć.
- W przypadku korzystania z protokołu wielodotyku „B” narzędzie jest aktywne tak długo, jak długo ma aktywne gniazdo. Po wyczyszczeniu gniazda narzędzie przestaje istnieć.
- O tym, że narzędzie unosi się w powietrzu, decyduje się na podstawie następujących warunków:
- Jeśli narzędziem jest
BTN_TOOL_MOUSE
lubBTN_TOOL_LENS
, narzędzie nie unosi się w powietrzu, nawet jeśli spełniony jest którykolwiek z poniższych warunków. - Jeśli narzędzie jest aktywne i kierowca zgłasza informacje o ciśnieniu, a zgłaszane ciśnienie wynosi zero, wówczas narzędzie się unosi.
- Jeśli narzędzie jest aktywne i sterownik obsługuje kod klucza
BTN_TOUCH
, aBTN_TOUCH
ma wartość zero, to narzędzie się znajduje.
- Jeśli narzędziem jest
-
InputReader
obsługuje zarówno protokół wielodotykowy „A”, jak i „B”. Nowe sterowniki powinny używać protokołu „B”, ale którykolwiek z nich działa. Począwszy od wersji Androida 4.0, może być konieczna zmiana sterowników ekranu dotykowego, aby były zgodne ze specyfikacją protokołu wejściowego systemu Linux.
Mogą być wymagane następujące zmiany:
Gdy narzędzie stanie się nieaktywne (palec pójdzie „w górę”), powinno przestać pojawiać się w kolejnych raportach synchronizacji wielodotykowej. Kiedy wszystkie narzędzia staną się nieaktywne (wszystkie palce podniosą się do góry), sterownik powinien wysłać pusty pakiet raportu synchronizacji, taki jak
SYN_MT_REPORT
, po którym następujeSYN_REPORT
.Poprzednie wersje Androida oczekiwały raportowania zdarzeń „up” poprzez wysłanie wartości ciśnienia wynoszącej 0. Stare zachowanie było niezgodne ze specyfikacją protokołu wejściowego systemu Linux i nie jest już obsługiwane.
Informacje o ciśnieniu fizycznym lub sile sygnału należy zgłaszać za pomocą
ABS_MT_PRESSURE
.Poprzednie wersje Androida pobierały informacje o ciśnieniu z
ABS_MT_TOUCH_MAJOR
. Stare zachowanie 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ą
ABS_MT_TOUCH_MAJOR
.Poprzednie wersje Androida pobierały informacje o rozmiarze z
ABS_MT_TOOL_MAJOR
. Stare zachowanie było niezgodne ze specyfikacją protokołu wejściowego systemu Linux i nie jest już obsługiwane.
Obsługa urządzenia dotykowego
Poniżej znajduje się krótkie podsumowanie obsługi urządzenia dotykowego w systemie Android.
-
EventHub
odczytuje surowe zdarzenia ze sterownikaevdev
. -
InputReader
wykorzystuje nieprzetworzone zdarzenia i aktualizuje stan wewnętrzny dotyczący pozycji i innych cech każdego narzędzia. Śledzi także stany przycisków. - Jeżeli naciśnięto lub puszczono przycisk BACK lub FORWARD ,
InputReader
powiadamiaInputDispatcher
o kluczowym zdarzeniu. -
InputReader
sprawdza, czy nastąpiło naciśnięcie klawisza wirtualnego. Jeśli tak, powiadamiaInputDispatcher
o kluczowym zdarzeniu. -
InputReader
określa, czy dotyk został zainicjowany w granicach wyświetlacza. Jeśli tak, powiadamiaInputDispatcher
o zdarzeniu dotykowym. - Jeśli nie ma żadnych narzędzi dotykających, ale istnieje co najmniej jedno narzędzie przesuwające,
InputReader
powiadamiaInputDispatcher
o zdarzeniu najechania. - Jeśli typem urządzenia dotykowego jest pointer ,
InputReader
wykrywa gest wskaźnika, odpowiednio przesuwa wskaźnik i plamki oraz powiadamiaInputDispatcher
o zdarzeniu wskaźnika. -
InputDispatcher
używaWindowManagerPolicy
do określenia, czy zdarzenia powinny zostać wywołane i czy powinny obudzić urządzenie. NastępnieInputDispatcher
dostarcza zdarzenia do odpowiednich aplikacji.
Dotknij konfiguracji urządzenia
Zachowanie urządzenia dotykowego zależy od osi urządzenia, przycisków, właściwości wejściowych, konfiguracji urządzenia wejściowego, mapy klawiszy wirtualnych i układu klawiszy.
Więcej szczegółów na temat plików biorących udział w konfiguracji klawiatury można znaleźć w poniższych sekcjach:
Nieruchomości
System wykorzystuje wiele właściwości konfiguracyjnych urządzenia wejściowego do konfiguracji i kalibracji zachowania urządzenia dotykowego.
Jednym z powodów jest to, że sterowniki urządzeń dotykowych często zgłaszają charakterystykę dotknięć za pomocą jednostek specyficznych dla urządzenia.
Na przykład wiele urządzeń dotykowych mierzy obszar kontaktu dotykowego przy użyciu wewnętrznej skali specyficznej dla urządzenia, takiej jak całkowita liczba węzłów czujnikowych, które zostały wyzwolone przez dotyk. Ta nieprzetworzona wartość rozmiaru nie byłaby istotna dla aplikacji, ponieważ musiałyby znać rozmiar fizyczny i inne cechy węzłów czujnika urządzenia dotykowego.
System wykorzystuje parametry kalibracji zakodowane w plikach konfiguracyjnych urządzenia wejściowego do dekodowania, przekształcania i normalizowania wartości zgłaszanych przez urządzenie dotykowe w prostszą standardową reprezentację zrozumiałą dla aplikacji.
Konwencje dokumentacyjne
Dla celów dokumentacyjnych stosujemy poniższe konwencje opisujące wartości stosowane przez system podczas procesu kalibracji.
Surowe wartości osi
Poniższe wyrażenia oznaczają nieprzetworzone wartości zgłaszane przez sterownik urządzenia dotykowego jako zdarzenia EV_ABS
.
-
raw.x
- Wartość osi
ABS_X
lubABS_MT_POSITION_X
. -
raw.y
- Wartość osi
ABS_Y
lubABS_MT_POSITION_Y
. -
raw.pressure
- Wartość osi
ABS_PRESSURE
lubABS_MT_PRESSURE
lub 0 jeśli nie jest dostępne. -
raw.touchMajor
- Wartość osi
ABS_MT_TOUCH_MAJOR
lub 0 jeżeli nie jest dostępne. -
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
lub 0 jeśli nie jest dostępne. -
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
, lub 0 jeśli nie jest dostępne. -
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.
Surowe zakresy osi
Poniższe wyrażenia oznaczają granice wartości surowych. Uzyskuje się je poprzez wywołanie EVIOCGABS
ioctl dla każdej osi.
-
raw.*.min
- Włączająca minimalna wartość surowej osi.
-
raw.*.max
- Łączna maksymalna wartość nieprzetworzonej osi.
-
raw.*.range
- Odpowiednik
raw.*.max - raw.*.min
. -
raw.*.fuzz
- Dokładność surowej osi. np. fuzz = 1 oznacza, że wartości są z dokładnością do +/- 1 jednostki.
-
raw.width
- Łączna szerokość obszaru dotykowego, równoważna
raw.x.range + 1
. -
raw.height
- Łączna wysokość obszaru dotykowego, równoważna
raw.y.range + 1
.
Zakresy wyjściowe
Poniższe wyrażenia oznaczają charakterystykę wyjściowego układu współrzędnych. System wykorzystuje interpolację liniową do tłumaczenia informacji o położeniu dotyku z jednostek powierzchni używanych przez urządzenie dotykowe na jednostki wyjściowe zgłaszane aplikacjom, takim jak piksele wyświetlacza.
-
output.width
- Szerokość wyjściowa. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to szerokość wyświetlacza w pikselach. W przypadku płytek dotykowych (niepowiązanych z wyświetlaczem) szerokość wyjściowa jest równa
raw.width
, co oznacza, że nie jest wykonywana żadna interpolacja. -
output.height
- Wysokość wyjściowa. W przypadku ekranów dotykowych (powiązanych z wyświetlaczem) jest to wysokość wyświetlacza w pikselach. W przypadku płytek dotykowych (niepowiązanych z wyświetlaczem) wysokość wyjściowa jest równa
raw.height
, co oznacza, że nie jest wykonywana żadna interpolacja. -
output.diag
- Długość przekątnej wyjściowego układu współrzędnych, równoważna
sqrt(output.width ^2 + output.height ^2)
.
Podstawowa konfiguracja
Narzędzie do mapowania wejścia dotykowego wykorzystuje wiele właściwości konfiguracyjnych znajdujących się w pliku konfiguracyjnym urządzenia wejściowego w celu określenia wartości kalibracyjnych. W poniższej tabeli opisano niektóre właściwości konfiguracyjne ogólnego przeznaczenia. Wszystkie pozostałe właściwości opisano w poniższych sekcjach wraz z polami, które służą do kalibracji.
typ.urządzenia dotykowego
Definicja: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Określa typ urządzenia dotykowego.
Jeśli wartość to
touchScreen
, urządzeniem dotykowym jest ekran dotykowy powiązany z wyświetlaczem.Jeśli wartością jest
touchPad
, urządzeniem dotykowym jest panel dotykowy niepowiązany z wyświetlaczem.Jeśli wartością jest
pointer
, urządzeniem dotykowym jest panel dotykowy niepowiązany z wyświetlaczem, a jego ruchy są wykorzystywane do pośrednich gestów wskaźnika wielodotykowego .Jeśli wartość jest
default
, system automatycznie wykrywa typ urządzenia zgodnie z algorytmem klasyfikacji.
Więcej informacji na temat wpływu typu urządzenia na zachowanie urządzenia dotykowego można znaleźć w sekcji Klasyfikacja .
W systemie Android 3 i niższych założono, że wszystkie urządzenia dotykowe są ekranami dotykowymi.
orientacja dotykowaŚwiadomy
Definicja: touch.orientationAware
= 0
| 1
Określa, czy urządzenie dotykowe powinno reagować na zmiany orientacji wyświetlacza.
Jeśli wartość wynosi
1
, pozycje dotykowe zgłaszane przez urządzenie dotykowe są obracane za każdym razem, gdy zmienia się orientacja wyświetlacza.Jeśli wartość wynosi
0
, pozycje dotykowe zgłaszane przez urządzenie dotykowe są odporne na zmiany orientacji wyświetlacza.
Wartość domyślna to 1
jeśli urządzenie jest ekranem dotykowym, 0
w przeciwnym razie.
System rozróżnia wewnętrzne i zewnętrzne ekrany i wyświetlacze dotykowe. Wewnętrzny ekran dotykowy obsługujący orientację jest obracany w zależności od orientacji wyświetlacza wewnętrznego. Zewnętrzny ekran dotykowy obsługujący orientację jest obracany w zależności od orientacji wyświetlacza zewnętrznego.
Funkcja świadomości orientacji umożliwia obracanie ekranów dotykowych na urządzeniach takich jak Nexus One. Na przykład, gdy urządzenie zostanie obrócone w kierunku zgodnym z ruchem wskazówek zegara o 90 stopni w stosunku do jego naturalnej orientacji, bezwzględne pozycje dotknięć zostaną ponownie odwzorowane w taki sposób, że dotknięcie w lewym górnym rogu bezwzględnego układu współrzędnych ekranu dotykowego będzie zgłaszane jako dotknięcie w lewym górnym rogu róg obróconego układu współrzędnych wyświetlacza. Dzieje się tak, aby dotknięcia były zgłaszane w tym samym układzie współrzędnych, którego używają aplikacje do rysowania elementów wizualnych.
Przed wprowadzeniem Honeycomb zakładano, że wszystkie urządzenia dotykowe rozpoznają orientację.
tryb dotykowy.gest
Definicja: touch.gestureMode
= pointer
| spots
| default
Określa tryb prezentacji gestów wskaźnika. Ta właściwość konfiguracyjna ma zastosowanie tylko wtedy, gdy urządzenie dotykowe jest typu pointer .
Jeśli wartością jest
pointer
, gesty panelu dotykowego są prezentowane za pomocą kursora podobnego do wskaźnika myszy.Jeśli wartością są
spots
, gesty panelu dotykowego są przedstawiane za pomocą kotwicy reprezentującej środek ciężkości gestu oraz zestawu okrągłych plamek reprezentujących położenie poszczególnych palców.
Wartością domyślną jest pointer
, gdy ustawiona jest właściwość wejściowa INPUT_PROP_SEMI_MT
, lub spots
inny sposób.
Pola X i Y
Pola X i Y dostarczają informacji o położeniu środka obszaru styku.
Obliczenie
Obliczenia są proste: informacje o położeniu ze sterownika dotykowego są interpolowane liniowo do wyjściowego układu współrzędnych.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
touchMajor, touchMinor, ToolMajor, ToolMinor, pola rozmiaru
Pola touchMajor
i touchMinor
opisują przybliżone wymiary powierzchni styku w jednostkach wyjściowych (pikselach).
Pola toolMajor
i toolMinor
opisują przybliżone wymiary samego narzędzia w jednostkach wyjściowych (pikselach).
Pole size
opisuje znormalizowany rozmiar dotyku w odniesieniu do największego możliwego dotyku, jaki może wyczuć urządzenie dotykowe. Najmniejszy możliwy znormalizowany rozmiar to 0,0 (brak kontaktu lub niemożliwy do zmierzenia), a największy możliwy znormalizowany rozmiar to 1,0 (obszar czujnika jest nasycony).
Gdy można zmierzyć zarówno przybliżoną długość, jak i szerokość, wówczas pole touchMajor
określa dłuższy wymiar, a pole touchMinor
określa krótszy wymiar powierzchni styku. Gdy można zmierzyć jedynie przybliżoną średnicę powierzchni styku, wówczas pola touchMajor
i touchMinor
są sobie równe.
Podobnie pole toolMajor
określa dłuższy wymiar, a pole toolMinor
określa krótszy wymiar pola przekroju poprzecznego narzędzia.
Jeśli rozmiar dotykowy jest niedostępny, ale rozmiar narzędzia jest dostępny, wówczas rozmiar narzędzia jest ustawiany na równy rozmiarowi dotykowemu. I odwrotnie, jeśli rozmiar narzędzia jest niedostępny, ale rozmiar dotyku jest dostępny, wówczas rozmiar dotyku jest ustawiany na równy rozmiarowi narzędzia.
Urządzenia dotykowe mierzą lub zgłaszają rozmiar dotyku i rozmiar narzędzia na różne sposoby. Obecna implementacja obsługuje trzy różne rodzaje pomiarów: średnicę, powierzchnię i geometryczną ramkę ograniczającą w jednostkach powierzchni.
Definicja: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Określa rodzaj pomiaru używany przez sterownik dotyku do raportowania rozmiaru dotyku i rozmiaru narzędzia.
Jeśli wartość wynosi
none
, rozmiar jest ustawiany na zero.Jeśli wartość jest
geometric
, zakłada się, że rozmiar jest określony w tych samych jednostkach powierzchni co pozycja, dlatego jest skalowany w ten sam sposób.Jeśli wartością jest
diameter
, przyjmuje się, że rozmiar jest proporcjonalny do średnicy (szerokości) dotyku lub narzędzia.Jeśli wartością jest
area
, zakłada się, że rozmiar jest proporcjonalny do obszaru dotyku lub narzędzia.Jeśli wartość jest
default
, system zastosuje kalibracjęgeometric
, jeśli dostępna jest ośraw.touchMajor
lubraw.toolMajor
, w przeciwnym razie zastosuje kalibracjęnone
.
dotykowy.rozmiar.skala
Definicja: touch.size.scale
= <nieujemna liczba zmiennoprzecinkowa>
Określa stały współczynnik skali używany w kalibracji.
Wartość domyślna to 1.0
.
odchylenie.rozmiaru dotyku
Definicja: touch.size.bias
= <nieujemna liczba zmiennoprzecinkowa>
Określa stałą wartość odchylenia używaną w kalibracji.
Wartość domyślna to 0.0
.
touch.size.issumed
Definicja: touch.size.isSummed
= 0
| 1
Określa, czy rozmiar ma być raportowany jako suma rozmiarów wszystkich aktywnych kontaktów, czy też indywidualnie dla każdego kontaktu.
Jeśli wartość wynosi
1
, raportowany rozmiar jest dzielony przez liczbę kontaktów przed użyciem.Jeśli wartość wynosi
0
, raportowany rozmiar jest używany bez zmian.
Wartość domyślna to 0
.
Niektóre urządzenia dotykowe, w szczególności urządzenia „Semi-MT”, nie są w stanie rozróżnić indywidualnych wymiarów wielu styków, dlatego zgłaszają pomiar rozmiaru reprezentujący ich całkowitą powierzchnię lub szerokość. W przypadku takich urządzeń tę właściwość należy ustawić tylko na 1
. W razie wątpliwości ustaw tę wartość na 0
.
Obliczenie
Obliczenia pól touchMajor
, touchMinor
, toolMajor
, toolMinor
i size
zależą od określonych parametrów kalibracji.
If raw.touchMajor and raw.toolMajor are available: touchMajor = raw.touchMajor touchMinor = raw.touchMinor toolMajor = raw.toolMajor toolMinor = raw.toolMinor Else If raw.touchMajor is available: toolMajor = touchMajor = raw.touchMajor toolMinor = touchMinor = raw.touchMinor Else If raw.toolMajor is available: touchMajor = toolMajor = raw.toolMajor touchMinor = toolMinor = raw.toolMinor Else touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 End If size = avg(touchMajor, touchMinor) If touch.size.isSummed == 1: touchMajor = touchMajor / numberOfActiveContacts touchMinor = touchMinor / numberOfActiveContacts toolMajor = toolMajor / numberOfActiveContacts toolMinor = toolMinor / numberOfActiveContacts size = size / numberOfActiveContacts End If If touch.size.calibration == "none": touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 Else If touch.size.calibration == "geometric": outputScale = average(output.width / raw.width, output.height / raw.height) touchMajor = touchMajor * outputScale touchMinor = touchMinor * outputScale toolMajor = toolMajor * outputScale toolMinor = toolMinor * outputScale Else If touch.size.calibration == "area": touchMajor = sqrt(touchMajor) touchMinor = touchMajor toolMajor = sqrt(toolMajor) toolMinor = toolMajor Else If touch.size.calibration == "diameter": touchMinor = touchMajor toolMinor = toolMajor End If If touchMajor != 0: output.touchMajor = touchMajor * touch.size.scale + touch.size.bias Else output.touchMajor = 0 End If If touchMinor != 0: output.touchMinor = touchMinor * touch.size.scale + touch.size.bias Else output.touchMinor = 0 End If If toolMajor != 0: output.toolMajor = toolMajor * touch.size.scale + touch.size.bias Else output.toolMajor = 0 End If If toolMinor != 0: output.toolMinor = toolMinor * touch.size.scale + touch.size.bias Else output.toolMinor = 0 End If output.size = size
pole ciśnienia
Pole pressure
opisuje przybliżony nacisk fizyczny wywierany na urządzenie dotykowe jako znormalizowaną wartość z zakresu od 0,0 (brak dotyku) do 1,0 (normalny nacisk).
Zerowe ciśnienie wskazuje, że narzędzie unosi się w powietrzu.
kalibracja.ciśnienia dotykowego
Definicja: touch.pressure.calibration
= none
| physical
| amplitude
| default
Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania ciśnienia.
Jeśli wartość wynosi
none
, ciśnienie jest nieznane, dlatego jest ustawiane na 1,0 w przypadku dotknięcia i 0,0 w przypadku najechania myszką.Jeśli wartość jest
physical
, zakłada się, że oś nacisku mierzy rzeczywistą fizyczną intensywność nacisku wywieranego na tabliczkę dotykową.Jeżeli wartością jest
amplitude
, zakłada się, że oś ciśnienia mierzy amplitudę sygnału, która jest powiązana z rozmiarem styku i przyłożonym naciskiem.Jeśli wartość jest
default
, system zastosuje kalibracjęphysical
, jeśli dostępna jest oś ciśnienia, w przeciwnym razie nie zastosujenone
.
skala.dotyku.ciśnienia
Definicja: touch.pressure.scale
= <nieujemna liczba zmiennoprzecinkowa>
Określa stały współczynnik skali używany w kalibracji.
Wartość domyślna to 1.0 / raw.pressure.max
.
Obliczenie
Obliczenie pola pressure
zależy od określonych parametrów kalibracyjnych.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
pola orientacji i pochylenia
Pole orientation
opisuje orientację dotyku i narzędzia jako pomiar kątowy. Orientacja 0
wskazuje, że oś główna jest zorientowana pionowo, -PI/2
wskazuje, że oś główna jest zorientowana w lewo, PI/2
oznacza, że oś główna jest zorientowana w prawo. Gdy dostępne jest narzędzie 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. Nachylenie 0
oznacza, że narzędzie jest prostopadłe do powierzchni. Nachylenie PI/2
wskazuje, że narzędzie leży płasko na powierzchni.
kalibracja.dotyku.orientacja
Definicja: touch.orientation.calibration
= none
| interpolated
| vector
| default
Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania orientacji.
- Jeśli wartość wynosi
none
, orientacja jest nieznana, dlatego ustawiana jest na 0. - Jeśli wartość jest
interpolated
, orientacja jest interpolowana liniowo w taki sposób, że surowa wartośćraw.orientation.min
jest odwzorowywana na-PI/2
, a surowa wartośćraw.orientation.max
jest odwzorowywana naPI/2
. Środkowa wartość(raw.orientation.min + raw.orientation.max) / 2
jest mapowana na0
. - Jeśli wartością jest
vector
, orientacja jest interpretowana jako wektor upakowany składający się z dwóch 4-bitowych pól ze znakiem. Ta reprezentacja jest używana w częściach protokołu Atmel Object Based Protocol. Po zdekodowaniu wektor daje kąt orientacji i wielkość ufności. Wielkość ufności jest używana do skalowania informacji o rozmiarze, chyba że jest ona geometryczna. - Jeśli wartość jest
default
, system użyje kalibracjiinterpolated
, jeśli dostępna jest oś orientacji, w przeciwnym razie nie zastosujenone
.
Obliczenie
Obliczenie pól orientation
i tilt
zależy od określonych parametrów kalibracji i dostępnych danych wejściowych.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
pole odległości
Pole distance
opisuje odległość pomiędzy narzędziem a powierzchnią urządzenia dotykowego. Wartość 0,0 wskazuje na bezpośredni kontakt, a większe wartości wskazują na rosnącą odległość od powierzchni.
kalibracja.odległości dotyku
Definicja: touch.distance.calibration
= none
| scaled
| default
Określa rodzaj pomiaru używany przez sterownik dotykowy do raportowania odległości.
Jeśli wartość wynosi
none
, odległość jest nieznana, dlatego ustawia się ją na 0.Jeżeli wartość jest
scaled
, zgłoszona odległość jest mnożona przez stały współczynnik skali.Jeśli wartość jest
default
, system zastosuje kalibracjęscaled
jeśli dostępna jest oś odległości, w przeciwnym razie nie zastosujenone
.
skala.odległości dotyku
Definicja: touch.distance.scale
= <nieujemna liczba zmiennoprzecinkowa>
Określa stały współczynnik skali używany w kalibracji.
Wartość domyślna to 1.0
.
Obliczenie
Obliczenie pola distance
zależy od określonych parametrów kalibracyjnych.
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 kompatybilności
Właściwości konfiguracyjne urządzeń dotykowych uległy znaczącym zmianom w systemie Android Ice Cream Sandwich 4.0. Wszystkie pliki konfiguracyjne urządzeń wejściowych dla urządzeń dotykowych muszą zostać zaktualizowane, aby móc korzystać z nowych właściwości konfiguracyjnych.
Starsze sterowniki urządzeń dotykowych również mogą wymagać aktualizacji.
Pliki map kluczy wirtualnych
Do implementacji kluczy wirtualnych można używać urządzeń dotykowych.
Można to zrobić na kilka sposobów, w zależności od możliwości kontrolera dotykowego. Niektóre kontrolery dotykowe można bezpośrednio skonfigurować do implementacji klawiszy programowych poprzez ustawienie rejestrów oprogramowania sprzętowego. Innym razem pożądane jest wykonanie mapowania współrzędnych dotykowych na kody klawiszy w oprogramowaniu.
Gdy klucze wirtualne są zaimplementowane w oprogramowaniu, jądro musi wyeksportować plik mapy kluczy wirtualnych o nazwie virtualkeys.<devicename>
jako właściwość płytki. Na przykład, jeśli sterowniki urządzeń z ekranem dotykowym zgłaszają swoją nazwę jako „touchyfeely”, plik mapy klawiszy wirtualnych musi mieć ścieżkę /sys/board_properties/virtualkeys.touchyfeely
.
Plik mapy kluczy wirtualnych opisuje współrzędne i kody klawiszy Linux dla kluczy wirtualnych 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 mapy klawiszy wirtualnych to zwykły plik tekstowy składający się z sekwencji opisów układu klawiszy wirtualnych oddzielonych znakami nowej linii lub dwukropkami.
Linie komentarza zaczynają się od „#” i trwają do końca linii.
Każdy klucz wirtualny jest opisany przez 6 elementów rozdzielonych dwukropkami:
-
0x01
: Kod wersji. Zawsze musi mieć0x01
. - <Kod klucza systemu Linux>: Kod klucza systemu Linux dla klucza wirtualnego.
- <centerX>: Współrzędna X środka klucza wirtualnego.
- <centerY>: Współrzędna Y w pikselach środka klucza wirtualnego.
- <width>: Szerokość klucza wirtualnego w pikselach.
- <wysokość>: Wysokość klucza wirtualnego w pikselach.
Wszystkie współrzędne i rozmiary są określone w układzie współrzędnych wyświetlacza.
Oto plik mapy kluczy wirtualnych, cały zapisany w jednej linii.
# 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 kluczy wirtualnych można również zapisać w wielu wierszach.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
W powyższym przykładzie ekran dotykowy ma rozdzielczość 480x800. W związku z tym wszystkie klawisze wirtualne mają współrzędną <centerY> wynoszącą 835, czyli nieco poniżej widocznego obszaru ekranu dotykowego.
Pierwszy klucz ma kod skanujący Linuksa równy 158
( KEY_BACK
), centerX wynoszący 55
, centerY wynoszący 835
, szerokość 90
i wysokość 55
.
Przykład
Plik mapy kluczy wirtualnych: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Plik układu klucza: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Plik mapy kluczowych znaków: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Pośrednie gesty wskaźnika wielodotykowego
W trybie wskaźnika system interpretuje następujące gesty:
- Stuknięcie jednym palcem: kliknięcie.
- Ruch jednym palcem: przesuwanie wskaźnika.
- Ruch jednym palcem i naciśnięcie przycisku: przeciągnij wskaźnik.
- Ruch dwoma palcami Oba palce poruszają się w tym samym kierunku: przeciągnij obszar pod wskaźnikiem w tym kierunku. Sam wskaźnik się nie porusza.
- Ruch dwoma palcami oba palce zbliżają się do siebie lub rozsuwają w różnych kierunkach: przesuwanie/skalanie/obrót obszaru otaczającego wskaźnik. Sam wskaźnik się nie porusza.
- Ruch wieloma palcami: gest swobodny.
Odrzucenie palmy
Począwszy od Androida 13, system może automatycznie odrzucać dane wejściowe z dłoni, gdy włączona jest wbudowana platforma. Własne, niestandardowe rozwiązania są nadal obsługiwane, chociaż może zaistnieć potrzeba ich modyfikacji, aby zwracały flagę TOOL_TYPE_PALM
po wykryciu dłoni. Wbudowany framework działa również w połączeniu z niestandardowymi rozwiązaniami.
Rzeczywisty model analizuje pierwsze 90 ms danych gestów, bieżący wskaźnik i otaczające wskaźniki, a następnie rozważa, jak daleko od krawędzi wyświetlacza znajdują się dotknięcia. Następnie określa, dla poszczególnych wskaźników, które ze wskaźników są dłońmi. Uwzględnia także rozmiar każdego kontaktu, zgodnie z raportami touchMajor
i touchMinor
. Następnie platforma Android usuwa wskaźniki oznaczone jako dłonie ze strumienia dotykowego.
Jeśli wskaźnik został już wysłany do aplikacji, system albo:
- (Jeśli istnieją inne aktywne wskaźniki) Anuluje wskaźnik z ustawionymi
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 powodować działania użytkownika. Ta flaga jest ustawiona zarówno dla ACTION_CANCEL
, jak i ACTION_POINTER_UP
.
Jeśli wskaźnik dłoni nie został wysłany do aplikacji, system po prostu go upuści.
Włącz odrzucanie dłoni
- W sterowniku dotykowym użyj makra
input_abs_set_res
, aby ustawić rozdzielczości dla następujących 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 je obsługuje, upewnij się, że rozdzielczość jest ustawiona prawidłowo. -
- Aby potwierdzić, że pola są ustawione poprawnie, uruchom:
$ adb shell getevent -li
- Aby włączyć tę funkcję w czasie wykonywania, uruchom:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Uruchom ponownie proces
system_server
.$ adb shell stop && adb shell start
- Upewnij się, że
adb shell dumpsys input
pokazują, że wUnwantedInteractionBlocker
znajdują się elementy odrzucające dłonie. Jeśli tak nie jest, sprawdź dzienniki związane z danymi wejściowymi, aby znaleźć wskazówki dotyczące tego, co mogło być błędnie skonfigurowane.Zobacz następujący przykład w celach informacyjnych:
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 odpowiednią komendę sysprop w pliku
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1