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żeli 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 długo palec pozostanie 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 specyficznych 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 rezultacie, 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 raportowane 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 i 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 równej 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 za pomocą 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ępne. -
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 (pełna siła).
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 stosowany w kalibracji.
Wartość domyślna to 1.0 / raw.pressure.max
.
Obliczenie
Obliczenie pola pressure
zależy od określonych parametrów kalibracji.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
Orientacja i pochylenie
Pole orientation
opisuje orientację dotyku i narzędzia jako pomiar kątowy. Orientacja 0
wskazuje, że główna oś jest zorientowana pionowo, -PI/2
wskazuje, że oś główna jest zorientowana na lewą, PI/2
wskazuje, że osi głównej jest zorientowana na prawą. Gdy jest obecne narzędzie rysika, zakres orientacji można opisać w pełnym zakresie koła od -PI
lub PI
.
Pole tilt
opisuje pochylenie narzędzia jako pomiar kątowy. Pochylenie 0
wskazuje, że narzędzie jest prostopadłe do powierzchni. Pochylenie PI/2
wskazuje, że narzędzie jest płaskie na powierzchni.
Touch.orientation.Calibracja
Definicja: touch.orientation.calibration
= none
| interpolated
| vector
| default
Określa rodzaj pomiaru stosowanego przez sterownik dotykowy do zgłoszenia orientacji.
- Jeśli wartość
none
, orientacja jest nieznana, więc jest ustawiona na 0. - Jeśli
PI/2
jestinterpolated
, orientacja jest linioworaw.orientation.max
w taki sposób-PI/2
że surowa wartośćraw.orientation.min
Wartość środka(raw.orientation.min + raw.orientation.max) / 2
mapy do0
. - Jeśli wartość to
vector
, orientacja jest interpretowana jako zapakowany wektor konserwujący dwa podpisane 4-bitowe pól. Ta reprezentacja jest używana w częściach protokołu opartych na obiektach Atmel. Po dekodowaniu wektor daje kąt orientacji i wielkość pewności siebie. Wielkość ufności służy do skalowania informacji o wielkości, chyba że jest ona geometryczna. - Jeśli wartość jest
default
, system wykorzystujeinterpolated
kalibrację, jeśli dostępna oś orientacyjna, w przeciwnym razie nie używanone
.
Obliczenie
Obliczenie pól orientation
i tilt
zależy od określonych parametrów kalibracji i dostępnych danych wejściowych.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
pole odległości
Pole distance
opisuje odległość między narzędziem a powierzchnią urządzenia dotykowego. Wartość 0,0 oznacza bezpośredni kontakt, a większe wartości wskazują na rosnącą odległość od powierzchni.
Touch.distance.Calibracja
Definicja: touch.distance.calibration
= none
| scaled
| default
Określa rodzaj pomiaru stosowanego przez sterownik dotykowy do zgłoszenia odległości.
Jeśli wartość
none
, odległość jest nieznana, więc jest ustawiona na 0.Jeśli wartość jest
scaled
, zgłoszona odległość jest mnożona przez współczynnik skali stałej.Jeśli wartość jest
default
, system wykorzystujescaled
kalibrację, jeśli dostępna oś odległości, w przeciwnym razie nie używanone
.
Touch.distance.scale
Definicja: touch.distance.scale
= <a nie wymagający liczb zmiennoprzecinkowy>
Określa stały współczynnik skali stosowany w kalibracji.
Wartość domyślna to 1.0
.
Obliczenie
Obliczenie pola distance
zależy od określonych parametrów kalibracji.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Przykład
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Uwagi do kompatybilności
Właściwości konfiguracyjne dla urządzeń dotykowych zmieniły się znacznie w Android Ice Cream Sandwich 4.0. Wszystkie pliki konfiguracyjne urządzeń wejściowych dla urządzeń dotykowych muszą zostać zaktualizowane, aby użyć nowych właściwości konfiguracji.
Starsze sterowniki urządzeń dotykowych mogą być również wymagane.
Wirtualne pliki map kluczy
Urządzenia dotykowe są często używane do implementacji kluczy wirtualnych.
Istnieje kilka sposobów na to, w zależności od możliwości kontrolera dotykowego. Niektóre kontrolery dotykowe można bezpośrednio skonfigurować do implementacji klawiszy miękkich poprzez ustawianie rejestrów oprogramowania układowego. Innym razem pożądane jest wykonanie mapowania od współrzędnych dotykowych po kody kluczowe w oprogramowaniu.
Gdy klucze wirtualne są wdrażane w oprogramowaniu, jądro musi wyeksportować wirtualny plik mapy klucza o nazwie virtualkeys.<devicename>
jako właściwość planszy. Na przykład, jeśli sterowniki urządzeń dotykowych zgłaszają swoją nazwę jako „Toustyfeely”, plik wirtualnej mapy klucza musi mieć ścieżkę /sys/board_properties/virtualkeys.touchyfeely
.
Plik mapy klucza wirtualnego opisuje współrzędne i kody kluczy Linuksa wirtualnych na ekranie dotykowym.
Oprócz pliku mapy klucza wirtualnego musi istnieć odpowiedni plik układu klawisza i plik mapy znaków kluczowych, aby zmapować kody kluczy Linux na kody kluczy Androida i określić typ urządzenia klawiatury (zwykle SPECIAL_FUNCTION
).
Składnia
Wirtualny plik mapy klucza to zwykły plik tekstowy składający się z sekwencji opisów układu wirtualnego klawisza oddzielonego przez nowe linie lub kolonami.
Linie komentarzy zaczynają się od „#” i przechodzą do końca linii.
Każdy klucz wirtualny jest opisany przez 6 komponentów podłączonych do okrężnicy:
-
0x01
: Kod wersji. Musi zawsze być0x01
. - <Linux Key Code>: Kod klucza Linux klucza wirtualnego.
- <CenterX>: Współrzędna X Pixel środka klucza wirtualnego.
- <entery>: Współrzędna piksela w środku klucza wirtualnego.
- <szerokość>: szerokość klucza wirtualnego w pikselach.
- <Hight>: Wysokość klucza wirtualnego w pikselach.
Wszystkie współrzędne i rozmiary są określone w kategoriach układu współrzędnych wyświetlania.
Oto wirtualny plik mapy klucza, wszystko zapisane na jednym wierszu.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
Ten sam plik mapy klucza wirtualnego można również zapisać na 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 klucze wirtualne mają współrzędną <entery> 835, która jest nieco poniżej widocznego obszaru ekranu dotykowego.
Pierwszy klucz ma kod skanowania Linux 158
( KEY_BACK
), Centerx 55
, centery 835
, szerokość 90
i wysokość 55
.
Przykład
Plik mapy klucza wirtualnego: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Kluczowy plik układu: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Kluczowy plik mapy znaków: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Pośrednie gesty wskaźnika wielokrotnego wskaźnika
W trybie wskaźnika system interpretuje następujące gesty:
- STAT PIĄTEK: kliknij.
- Ruch pojedynczy palcem: przesuń wskaźnik.
- Przycisk ruchu jednego palca Plus naciska: przeciągnij wskaźnik.
- Dwa palce oba palce poruszające się w tym samym kierunku: przeciągają obszar pod wskaźnikiem w tym kierunku. Sam wskaźnik nie porusza się.
- Dwa palce oba palce poruszające się w kierunku siebie lub w różnych kierunkach: Skal/skala/obracaj obszar otaczający wskaźnik. Sam wskaźnik nie porusza się.
- Wiele palców: gest swobodny.
Odrzucenie palmy
Od Androida 13 system może automatycznie odrzucić dane wejściowe z Palms po włączeniu wbudowanej struktury. Wciąż obsługiwane są wewnętrzne, niestandardowe rozwiązania, choć mogą być wymagane modyfikowane, aby zwrócić flagę TOOL_TYPE_PALM
po wykryciu dłoni. Wbudowana framework działa również w połączeniu z niestandardowymi rozwiązaniami.
Rzeczywisty model analizuje pierwsze 90 ms danych gestów, na bieżącym wskaźniku i na otaczających wskaźnikach, a następnie rozważa, jak daleko od krawędzi wyświetlacza są dotyk. Następnie określa, na podstawie punktu, który z wskaźników ma dłonie. Uwzględnia również rozmiar każdego kontaktu, jak donosi touchMajor
i touchMinor
. Framework Android usuwa następnie wskaźniki oznaczone jako dłonie ze strumienia dotykowego.
Jeśli wskaźnik został już wysłany do aplikacji, to system:
- (Jeśli istnieją inne aktywne wskaźniki) anuluje wskaźnik z zestawem
ACTION_POINTER_UP
iFLAG_CANCELED
. - (Jeśli jest to jedyny wskaźnik) anuluje wskaźnik za pomocą
ACTION_CANCEL
.
Publiczny interfejs API, MotionEvent.FLAG_CANCELED
, wskazuje, że bieżące zdarzenie nie powinno wywoływać działania użytkownika. Ta flaga jest ustawiona zarówno dla ACTION_CANCEL
, jak i ACTION_POINTER_UP
.
Jeśli wskaźnik dłoni nie został wysłany do aplikacji, system po prostu upuszcza wskaźnik.
Włącz odrzucenie dłoni
- W sterowniku dotykowym użyj makro
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 urządzenie go obsługuje, upewnij się, że rozdzielczość jest ustawiona poprawnie. -
- 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
- Potwierdź, że
adb shell dumpsys input
pokazuje, że wewnątrzUnwantedInteractionBlocker
insteractionblocker znajdują się odrzuty dłoni. Jeśli nie, sprawdź dzienniki związane z wejściem, aby znaleźć wskazówki na temat tego, co może być źle skonfigurowane.Zobacz następujący przykład odniesienia:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - Aby na stałe włączyć tę funkcję, dodaj odpowiednie polecenie SYSPROP w swoim pliku
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1