Android supporta una varietà di touch screen e touch pad, inclusi tablet digitalizzatori basati su stilo.
I touch screen sono dispositivi touch associati a un display in modo tale che l'utente abbia l'impressione di manipolare direttamente gli elementi sullo schermo.
I touch pad sono dispositivi touch non associati a un display, come un tablet digitalizzatore. I touch pad vengono generalmente utilizzati per il puntamento o per il posizionamento indiretto assoluto o il controllo basato sui gesti di un'interfaccia utente.
I dispositivi touch possono avere pulsanti le cui funzioni sono simili ai pulsanti del mouse.
I dispositivi touch a volte possono essere manipolati utilizzando una varietà di strumenti diversi come le dita o uno stilo a seconda della tecnologia del sensore touch sottostante.
I dispositivi touch vengono talvolta utilizzati per implementare le chiavi virtuali. Ad esempio, su alcuni dispositivi Android, l'area del sensore touch screen si estende oltre il bordo del display e ha un duplice scopo come parte di un tastierino sensibile al tocco.
A causa della grande varietà di dispositivi touch, Android si affida a un gran numero di proprietà di configurazione per descrivere le caratteristiche e il comportamento desiderato di ciascun dispositivo.
Toccare la classificazione dei dispositivi
Un dispositivo di input è classificato come dispositivo multi-touch se sussistono entrambe le seguenti condizioni:
- Il dispositivo di input segnala la presenza degli assi assoluti
ABS_MT_POSITION_X
eABS_MT_POSITION_Y
. - Il dispositivo di input non ha pulsanti del gamepad. Questa condizione risolve un'ambiguità con alcuni gamepad che riportano gli assi con codici che si sovrappongono a quelli degli assi MT.
Un dispositivo di input è classificato come dispositivo a tocco singolo se valgono entrambe le seguenti condizioni:
- Il dispositivo di input non è classificato come dispositivo multi-touch. Un dispositivo di input è classificato come dispositivo a tocco singolo o come dispositivo multitocco, mai entrambi.
- Il dispositivo di input segnala la presenza degli assi assoluti
ABS_X
eABS_Y
e la presenza del codice tastoBTN_TOUCH
.
Quando un dispositivo di input è classificato come dispositivo touch, la presenza di tasti virtuali viene determinata tentando di caricare il file della mappa dei tasti virtuali per il dispositivo. Se è disponibile una mappa dei tasti virtuale, viene caricato anche il file di layout dei tasti per il dispositivo. Fare riferimento a [File mappa tasti virtuali](#file-mappa-tasti-virtuali) per informazioni sulla posizione e il formato di questi file.
Successivamente, il sistema carica il file di configurazione del dispositivo di input per il dispositivo touch.
Tutti i dispositivi touch integrati dovrebbero avere file di configurazione del dispositivo di input. Se non è presente alcun file di configurazione del dispositivo di input, il sistema sceglie una configurazione predefinita appropriata per periferiche touch generiche come touch screen o touch pad HID USB o Bluetooth esterni. Queste impostazioni predefinite non sono progettate per i touch screen integrati e possono comportare un comportamento errato.
Dopo aver caricato la configurazione del dispositivo di input, il sistema classifica il dispositivo di input come dispositivo touch screen , touch pad o puntatore .
- Un dispositivo touch screen viene utilizzato per la manipolazione diretta degli oggetti sullo schermo. L'utente tocca direttamente lo schermo, quindi il sistema non richiede alcuna affordance aggiuntiva per indicare gli oggetti da manipolare.
- Un dispositivo touch pad viene utilizzato per fornire informazioni di posizionamento assoluto a un'app sui tocchi su una determinata area del sensore. Può essere utile per i tablet digitalizzatori.
- Un dispositivo puntatore viene utilizzato per la manipolazione indiretta di oggetti sullo schermo utilizzando un cursore. Le dita vengono interpretate come gesti del puntatore multi-touch. Altri strumenti, come gli stili, vengono interpretati utilizzando posizioni assolute. Per ulteriori informazioni, vedere Gesti del puntatore multi-touch indiretto .
Le seguenti regole vengono utilizzate per classificare il dispositivo di input come dispositivo touch screen, touch pad o puntatore.
- Se è impostata la proprietà
touch.deviceType
, il tipo di dispositivo viene impostato come indicato. - Se il dispositivo di input segnala la presenza della proprietà di input
INPUT_PROP_DIRECT
(tramite l'ioctlEVIOCGPROP
), allora il tipo di dispositivo è impostato su touch screen . Questa condizione presuppone che i dispositivi touch con input diretto siano collegati a un display anch'esso collegato. - Se il dispositivo di input segnala la presenza della proprietà di input
INPUT_PROP_POINTER
(tramite l'ioctlEVIOCGPROP
), il tipo di dispositivo è impostato su pointer . - Se il dispositivo di input segnala la presenza degli assi relativi
REL_X
oREL_Y
, allora il tipo di dispositivo è impostato su touch pad . Questa condizione risolve un'ambiguità per i dispositivi di input costituiti sia da un mouse che da un touch pad. In questo caso, il touch pad non viene utilizzato per controllare il puntatore poiché è già controllato dal mouse. - Altrimenti, il tipo di dispositivo viene impostato su pointer . Questa impostazione predefinita garantisce che i touch pad che non sono stati designati per altri scopi speciali controllino il puntatore.
Pulsanti
I pulsanti sono controlli opzionali che le app possono utilizzare per eseguire funzioni aggiuntive. I pulsanti sui dispositivi touch si comportano in modo simile ai pulsanti del mouse e vengono utilizzati principalmente con dispositivi touch di tipo puntatore o con uno stilo.
Sono supportati i seguenti pulsanti:
-
BTN_LEFT
: mappato suMotionEvent.BUTTON_PRIMARY
. -
BTN_RIGHT
: mappato suMotionEvent.BUTTON_SECONDARY
. -
BTN_MIDDLE
: mappato suMotionEvent.BUTTON_MIDDLE
. -
BTN_BACK
eBTN_SIDE
: mappati suMotionEvent.BUTTON_BACK
. Premendo questo pulsante si sintetizza anche la pressione di un tasto con il codice tastoKeyEvent.KEYCODE_BACK
. -
BTN_FORWARD
eBTN_EXTRA
: mappati suMotionEvent.BUTTON_FORWARD
. Premendo questo pulsante si sintetizza anche la pressione di un tasto con il codice tastoKeyEvent.KEYCODE_FORWARD
. -
BTN_STYLUS
: mappato suMotionEvent.BUTTON_SECONDARY
. -
BTN_STYLUS2
: mappato suMotionEvent.BUTTON_TERTIARY
.
Strumenti e tipi di strumenti
Uno strumento è un dito, uno stilo o un altro apparato utilizzato per interagire con il dispositivo touch. Alcuni dispositivi touch possono distinguere tra diversi tipi di strumenti.
Altrove in Android, come nell'API MotionEvent
, uno strumento viene spesso definito puntatore .
Sono supportati i seguenti tipi di strumenti:
-
BTN_TOOL_FINGER
eMT_TOOL_FINGER
: mappato suMotionEvent.TOOL_TYPE_FINGER
. -
BTN_TOOL_PEN
eMT_TOOL_PEN
: mappato suMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_RUBBER
: mappato suMotionEvent.TOOL_TYPE_ERASER
. -
BTN_TOOL_BRUSH
: mappato suMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_PENCIL
: mappato suMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_AIRBRUSH
: mappato suMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_MOUSE
: mappato suMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_LENS
: mappato suMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
eBTN_TOOL_QUADTAP
: mappati suMotionEvent.TOOL_TYPE_FINGER
.
Passare il mouse o toccare gli strumenti
Gli strumenti possono essere in contatto con il dispositivo touch o nel raggio d'azione e sospesi sopra di esso. Non tutti i dispositivi touch sono in grado di rilevare la presenza di uno strumento sospeso sopra il dispositivo touch. Quelli che lo fanno, come i digitalizzatori a stilo basati su RF, spesso possono rilevare quando lo strumento si trova entro un raggio limitato dal digitalizzatore.
Il componente InputReader
distingue gli strumenti di tocco dagli strumenti al passaggio del mouse. Allo stesso modo, gli strumenti di tocco e gli strumenti di passaggio del mouse vengono segnalati alle app in modi diversi.
Gli strumenti di tocco vengono segnalati alle app come eventi di tocco utilizzando MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
e MotionEvent.ACTION_POINTER_UP
.
Gli strumenti al passaggio del mouse vengono segnalati alle app come eventi di movimento generici utilizzando MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
e MotionEvent.ACTION_HOVER_EXIT
.
Toccare Requisiti del driver del dispositivo
- I driver dei dispositivi touch dovrebbero registrare solo gli assi e i codici chiave per gli assi e i pulsanti che supportano. La registrazione di assi o codici chiave non supportati può confondere l'algoritmo di classificazione del dispositivo o far sì che il sistema rilevi in modo errato le funzionalità del dispositivo. Ad esempio, se il dispositivo riporta il codice chiave
BTN_TOUCH
, il sistema presuppone cheBTN_TOUCH
sia sempre utilizzato per indicare se lo strumento sta toccando lo schermo. Pertanto,BTN_TOUCH
non dovrebbe essere utilizzato per indicare che lo strumento si trova semplicemente nel raggio d'azione e in bilico. - I dispositivi a tocco singolo utilizzano i seguenti eventi di input Linux:
-
ABS_X
: (OBBLIGATORIO) Riporta la coordinata X dell'utensile. -
ABS_Y
: (OBBLIGATORIO) Riporta la coordinata Y dell'utensile. -
ABS_PRESSURE
: (opzionale) Riporta la pressione fisica applicata alla punta dello strumento o la potenza del segnale del contatto tattile. -
ABS_TOOL_WIDTH
: (opzionale) Riporta l'area della sezione trasversale o larghezza del contatto tattile o dello strumento stesso. -
ABS_DISTANCE
: (opzionale) Riporta la distanza dell'utensile dalla superficie del dispositivo touch. -
ABS_TILT_X
: (opzionale) Riporta l'inclinazione dello strumento dalla superficie del dispositivo touch lungo l'asse X. -
ABS_TILT_Y
: (opzionale) Riporta l'inclinazione dello strumento dalla superficie del dispositivo touch lungo l'asse Y. -
BTN_TOUCH
: (OBBLIGATORIO) Indica se lo strumento sta toccando il dispositivo. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opzionale) Riporta gli stati dei pulsanti . -
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
: (facoltativo) Rapporto Questo è il tipo di strumento .
-
- I dispositivi multi-touch utilizzano i seguenti eventi di input Linux:
-
ABS_MT_POSITION_X
: (RICHIESTO) Riporta la coordinata X dell'utensile. -
ABS_MT_POSITION_Y
: (RICHIESTO) Riporta la coordinata Y dell'utensile. -
ABS_MT_PRESSURE
: (opzionale) Riporta la pressione fisica applicata alla punta dello strumento o la potenza del segnale del contatto tattile. -
ABS_MT_TOUCH_MAJOR
: (opzionale) Riporta l'area della sezione trasversale del contatto tattile o la lunghezza della dimensione più lunga del contatto tattile. -
ABS_MT_TOUCH_MINOR
: (opzionale) Riporta la lunghezza della dimensione più corta del contatto tattile. Questo asse non deve essere utilizzato seABS_MT_TOUCH_MAJOR
riporta una misurazione dell'area. -
ABS_MT_WIDTH_MAJOR
: (opzionale) Riporta l'area della sezione trasversale dell'utensile stesso, oppure la lunghezza della dimensione maggiore dell'utensile stesso. Non utilizzare questo asse a meno che non si conoscano le dimensioni dell'utensile stesso. -
ABS_MT_WIDTH_MINOR
: (opzionale) Riporta la lunghezza della dimensione più corta dell'utensile stesso. Questo asse non deve essere utilizzato seABS_MT_WIDTH_MAJOR
riporta una misurazione dell'area o se le dimensioni dell'utensile stesso sono sconosciute. -
ABS_MT_ORIENTATION
: (opzionale) Riporta l'orientamento dell'utensile. -
ABS_MT_DISTANCE
: (opzionale) Riporta la distanza dell'utensile dalla superficie del dispositivo touch. -
ABS_MT_TOOL_TYPE
: (facoltativo) riporta il tipo di strumento comeMT_TOOL_FINGER
oMT_TOOL_PEN
. -
ABS_MT_TRACKING_ID
: (facoltativo) riporta l'ID di tracciamento dello strumento. L'ID di tracciamento è un numero intero arbitrario non negativo utilizzato per identificare e tracciare ogni strumento in modo indipendente quando sono attivi più strumenti. Ad esempio, quando più dita toccano il dispositivo, a ogni dito dovrebbe essere assegnato un ID di tracciamento distinto che viene utilizzato finché il dito rimane in contatto. Gli ID di tracciamento possono essere riutilizzati quando gli strumenti associati escono dal raggio d'azione. -
ABS_MT_SLOT
: (opzionale) Riporta l'ID dello slot dello strumento, quando si utilizza il protocollo multi-touch Linux 'B'. Fare riferimento alla documentazione del protocollo multi-touch Linux per maggiori dettagli. -
BTN_TOUCH
: (OBBLIGATORIO) Indica se lo strumento sta toccando il dispositivo. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opzionale) Riporta gli stati dei pulsanti . -
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
: (facoltativo) Rapporto Questo è il tipo di strumento .
-
- Se vengono definiti assi sia per il protocollo single-touch che per quello multi-touch, verranno utilizzati solo gli assi multi-touch e gli assi single-touch verranno ignorati.
I valori minimo e massimo degli assi
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
eABS_MT_POSITION_Y
definiscono i limiti dell'area attiva del dispositivo in unità di superficie specifiche del dispositivo. Nel caso di un touch screen, l'area attiva descrive la parte del dispositivo touch che effettivamente copre il display.Per un touch screen, il sistema interpola automaticamente le posizioni del tocco riportate in unità di superficie per ottenere le posizioni del tocco in pixel di visualizzazione secondo il seguente calcolo:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Un touch screen potrebbe segnalare tocchi al di fuori dell'area attiva segnalata.
I tocchi avviati al di fuori dell'area attiva non vengono inviati alle app ma possono essere utilizzati per i tasti virtuali.
I tocchi avviati all'interno dell'area attiva o che entrano ed escono dall'area di visualizzazione vengono inviati alle app. Di conseguenza, se un tocco inizia entro i limiti di un'app e poi si sposta all'esterno dell'area attiva, l'app potrebbe ricevere eventi tocco con coordinate di visualizzazione negative o oltre i limiti del display. Questo è il comportamento previsto.
Un dispositivo touch non dovrebbe mai vincolare le coordinate touch ai limiti dell'area attiva. Se un tocco esce dall'area attiva, dovrebbe essere segnalato come esterno all'area attiva oppure non dovrebbe essere segnalato affatto.
Ad esempio, se il dito dell'utente tocca l'angolo superiore sinistro del touch screen, potrebbe essere segnalata una coordinata di (minX, minY). Se il dito continua a spostarsi ulteriormente al di fuori dell'area attiva, il touch screen dovrebbe iniziare a segnalare le coordinate con componenti inferiori a minX e minY, ad esempio (minX - 2, minY - 3), oppure dovrebbe smettere di segnalare del tutto il tocco. In altre parole, il touch screen non dovrebbe segnalare (minX, minY) quando il dito dell'utente sta effettivamente toccando l'esterno dell'area attiva.
Il fissaggio delle coordinate tattili al bordo del display crea un confine rigido artificiale attorno al bordo dello schermo che impedisce al sistema di tracciare in modo fluido i movimenti che entrano o escono dai limiti dell'area di visualizzazione.
I valori riportati da
ABS_PRESSURE
oABS_MT_PRESSURE
, se vengono riportati, devono essere diversi da zero quando lo strumento tocca il dispositivo e zero altrimenti per indicare che lo strumento è in sospensione.La segnalazione delle informazioni sulla pressione è facoltativa ma fortemente consigliata. Le app possono utilizzare le informazioni sulla pressione per implementare disegni sensibili alla pressione e altri effetti.
I valori riportati da
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
oABS_MT_WIDTH_MINOR
dovrebbero essere diversi da zero quando lo strumento tocca il dispositivo e zero altrimenti, ma ciò non è obbligatorio. Ad esempio, il dispositivo touch potrebbe essere in grado di misurare la dimensione dei contatti touch con le dita ma non dei contatti touch con lo stilo.La segnalazione delle informazioni sulle dimensioni è facoltativa ma fortemente consigliata. Le app possono utilizzare le informazioni sulla pressione per implementare disegni sensibili alle dimensioni e altri effetti.
I valori riportati da
ABS_DISTANCE
oABS_MT_DISTANCE
dovrebbero avvicinarsi allo zero quando lo strumento tocca il dispositivo. La distanza può rimanere diversa da zero anche quando l'utensile è a diretto contatto. I valori esatti riportati dipendono dal modo in cui l'hardware misura la distanza.La segnalazione delle informazioni sulla distanza è facoltativa ma consigliata per i dispositivi con stilo.
I valori riportati da
ABS_TILT_X
eABS_TILT_Y
dovrebbero essere zero quando lo strumento è perpendicolare al dispositivo. Un'inclinazione diversa da zero indica che l'utensile è tenuto in posizione inclinata.Si presuppone che gli angoli di inclinazione lungo gli assi X e Y siano specificati in gradi dalla perpendicolare. Il punto centrale (perfettamente perpendicolare) è dato da
(max + min) / 2
per ciascun asse. I valori più piccoli del punto centrale rappresentano un'inclinazione verso l'alto o verso sinistra, i valori più grandi del punto centrale rappresentano un'inclinazione verso il basso o verso destra.InputReader
converte i componenti di inclinazione X e Y in un angolo di inclinazione perpendicolare che va da 0 aPI / 2
radianti e un angolo di orientamento planare che va da-PI
aPI
radianti. Questa rappresentazione si traduce in una descrizione dell'orientamento compatibile con ciò che viene utilizzato per descrivere il tocco delle dita.La segnalazione delle informazioni sull'inclinazione è facoltativa ma consigliata per i dispositivi con stilo.
Se il tipo di strumento viene riportato da
ABS_MT_TOOL_TYPE
, sostituisce qualsiasi informazione sul tipo di strumento riportata daBTN_TOOL_*
. Se non sono disponibili informazioni sul tipo di strumento, il tipo di strumento predefinito èMotionEvent.TOOL_TYPE_FINGER
.Uno strumento viene determinato per essere attivo in base alle seguenti condizioni:
Quando si utilizza il protocollo single-touch, lo strumento è attivo se
BTN_TOUCH
oBTN_TOOL_*
è 1.Questa condizione implica che
InputReader
debba avere almeno alcune informazioni sulla natura dello strumento, se sta toccando, o almeno sul tipo di strumento. Se non sono disponibili informazioni, si presuppone che lo strumento sia inattivo (fuori portata).- Quando si utilizza il protocollo multi-touch "A", lo strumento è attivo ogni volta che appare nel rapporto di sincronizzazione più recente. Quando lo strumento smette di essere visualizzato nei report di sincronizzazione, cessa di esistere.
- Quando si utilizza il protocollo multitouch "B", lo strumento è attivo finché ha uno slot attivo. Quando lo slot viene cancellato, lo strumento cessa di esistere.
- Si determina che uno strumento sia sospeso in base alle seguenti condizioni:
- Se lo strumento è
BTN_TOOL_MOUSE
oBTN_TOOL_LENS
, lo strumento non è in bilico, anche se una delle seguenti condizioni è vera. - Se lo strumento è attivo e il conducente segnala informazioni sulla pressione e la pressione riportata è zero, lo strumento è in volo stazionario.
- Se lo strumento è attivo e il driver supporta il codice chiave
BTN_TOUCH
eBTN_TOUCH
ha un valore pari a zero, lo strumento è in bilico.
- Se lo strumento è
-
InputReader
supporta sia il protocollo multi-touch 'A' che 'B'. I nuovi driver dovrebbero utilizzare il protocollo "B", ma funziona entrambi. A partire da Android 4.0, potrebbe essere necessario modificare i driver del touch screen per conformarsi alle specifiche del protocollo di input di Linux.
Potrebbero essere necessarie le seguenti modifiche:
Quando uno strumento diventa inattivo (il dito va "su"), non dovrebbe più essere visualizzato nei successivi rapporti di sincronizzazione multi-touch. Quando tutti gli strumenti diventano inattivi (tutte le dita vanno verso l'alto), il driver dovrebbe inviare un pacchetto di report di sincronizzazione vuoto, come
SYN_MT_REPORT
seguito daSYN_REPORT
.Le versioni precedenti di Android prevedevano che gli eventi "up" venissero segnalati inviando un valore di pressione pari a 0. Il vecchio comportamento era incompatibile con la specifica del protocollo di input di Linux e non è più supportato.
Le informazioni sulla pressione fisica o sull'intensità del segnale devono essere riportate utilizzando
ABS_MT_PRESSURE
.Le versioni precedenti di Android recuperavano le informazioni sulla pressione da
ABS_MT_TOUCH_MAJOR
. Il vecchio comportamento era incompatibile con la specifica del protocollo di input Linux e non è più supportato.- Le informazioni sulla dimensione del tocco devono essere segnalate utilizzando
ABS_MT_TOUCH_MAJOR
.Le versioni precedenti di Android recuperavano le informazioni sulle dimensioni da
ABS_MT_TOOL_MAJOR
. Il vecchio comportamento era incompatibile con la specifica del protocollo di input Linux e non è più supportato.
Toccare il funzionamento del dispositivo
Di seguito è riportato un breve riepilogo del funzionamento del dispositivo touch su Android.
-
EventHub
legge gli eventi non elaborati dal driverevdev
. -
InputReader
consuma gli eventi grezzi e aggiorna lo stato interno sulla posizione e altre caratteristiche di ciascuno strumento. Tiene traccia anche degli stati dei pulsanti. - Se INDIETRO o AVANTI è stato premuto o rilasciato,
InputReader
notificaInputDispatcher
l'evento chiave. -
InputReader
determina se si è verificata la pressione di un tasto virtuale. In tal caso, notificaInputDispatcher
l'evento chiave. -
InputReader
determina se il tocco è stato avviato entro i limiti del display. In tal caso, notificaInputDispatcher
l'evento touch. - Se non sono presenti strumenti di tocco ma è presente almeno uno strumento al passaggio del mouse,
InputReader
notificaInputDispatcher
l'evento al passaggio del mouse. - Se il tipo di dispositivo touch è pointer ,
InputReader
esegue il rilevamento del movimento del puntatore, sposta il puntatore e lo individua di conseguenza e notificaInputDispatcher
l'evento del puntatore. -
InputDispatcher
utilizzaWindowManagerPolicy
per determinare se gli eventi devono essere inviati e se devono riattivare il dispositivo. Quindi,InputDispatcher
distribuisce gli eventi alle app appropriate.
Tocca la configurazione del dispositivo
Il comportamento del dispositivo touch è determinato dagli assi, dai pulsanti, dalle proprietà di input, dalla configurazione del dispositivo di input, dalla mappa dei tasti virtuali e dal layout dei tasti.
Fare riferimento alle sezioni seguenti per maggiori dettagli sui file che partecipano alla configurazione della tastiera:
Proprietà
Il sistema si basa su molte proprietà di configurazione del dispositivo di input per configurare e calibrare il comportamento del dispositivo touch.
Uno dei motivi è che i driver dei dispositivi touch spesso riportano le caratteristiche dei touch utilizzando unità specifiche del dispositivo.
Ad esempio, molti dispositivi touch misurano l'area di contatto tattile utilizzando una scala interna specifica del dispositivo, come il numero totale di nodi sensore attivati dal tocco. Questo valore di dimensione non elaborata non sarebbe significativo per le app perché avrebbero bisogno di conoscere la dimensione fisica e altre caratteristiche dei nodi del sensore del dispositivo touch.
Il sistema utilizza parametri di calibrazione codificati nei file di configurazione del dispositivo di input per decodificare, trasformare e normalizzare i valori riportati dal dispositivo touch in una rappresentazione standard più semplice che le app possono comprendere.
Convenzioni sulla documentazione
A scopo di documentazione, utilizziamo le seguenti convenzioni per descrivere i valori utilizzati dal sistema durante il processo di calibrazione.
Valori degli assi grezzi
Le seguenti espressioni indicano i valori grezzi segnalati dal driver del dispositivo touch come eventi EV_ABS
.
-
raw.x
- Il valore dell'asse
ABS_X
oABS_MT_POSITION_X
. -
raw.y
- Il valore dell'asse
ABS_Y
oABS_MT_POSITION_Y
. -
raw.pressure
- Il valore dell'asse
ABS_PRESSURE
oABS_MT_PRESSURE
oppure 0 se non disponibile. -
raw.touchMajor
- Il valore dell'asse
ABS_MT_TOUCH_MAJOR
o 0 se non disponibile. -
raw.touchMinor
- Il valore dell'asse
ABS_MT_TOUCH_MINOR
oraw.touchMajor
se non disponibile. -
raw.toolMajor
- Il valore dell'asse
ABS_TOOL_WIDTH
oABS_MT_WIDTH_MAJOR
oppure 0 se non disponibile. -
raw.toolMinor
- Il valore dell'asse
ABS_MT_WIDTH_MINOR
oraw.toolMajor
se non disponibile. -
raw.orientation
- Il valore dell'asse
ABS_MT_ORIENTATION
o 0 se non disponibile. -
raw.distance
- Il valore dell'asse
ABS_DISTANCE
oABS_MT_DISTANCE
oppure 0 se non disponibile. -
raw.tiltX
- Il valore dell'asse
ABS_TILT_X
o 0 se non disponibile. -
raw.tiltY
- Il valore dell'asse
ABS_TILT_Y
o 0 se non disponibile.
Intervalli degli assi grezzi
Le seguenti espressioni denotano i limiti dei valori grezzi. Si ottengono chiamando EVIOCGABS
ioctl per ciascun asse.
-
raw.*.min
- Il valore minimo inclusivo dell'asse grezzo.
-
raw.*.max
- Il valore massimo inclusivo dell'asse grezzo.
-
raw.*.range
- Equivalente a
raw.*.max - raw.*.min
. -
raw.*.fuzz
- La precisione dell'asse grezzo. per esempio. fuzz = 1 implica che i valori siano accurati fino a +/- 1 unità.
-
raw.width
- La larghezza inclusa dell'area di tocco, equivalente a
raw.x.range + 1
. -
raw.height
- L'altezza inclusa dell'area di tocco, equivalente a
raw.y.range + 1
.
Intervalli di uscita
Le seguenti espressioni denotano le caratteristiche del sistema di coordinate di output. Il sistema utilizza l'interpolazione lineare per tradurre le informazioni sulla posizione del tocco dalle unità di superficie utilizzate dal dispositivo touch nelle unità di output segnalate alle app come i pixel del display.
-
output.width
- La larghezza di uscita. Per i touch screen (associati a un display), questa è la larghezza del display in pixel. Per i touchpad (non associati a un display), la larghezza dell'output è uguale
raw.width
, a indicare che non viene eseguita alcuna interpolazione. -
output.height
- L'altezza di uscita. Per i touch screen (associati a un display), questa è l'altezza del display in pixel. Per i touch pad (non associati a un display), l'altezza di output è uguale
raw.height
, a indicare che non viene eseguita alcuna interpolazione. -
output.diag
- La lunghezza diagonale del sistema di coordinate di output, equivalente a
sqrt(output.width ^2 + output.height ^2)
.
Configurazione di base
Il mappatore input tocco utilizza molte proprietà di configurazione nel file di configurazione del dispositivo di input per specificare i valori di calibrazione. La tabella seguente descrive alcune proprietà di configurazione per scopi generali. Tutte le altre proprietà sono descritte nelle sezioni seguenti insieme ai campi utilizzati per calibrare.
touch.deviceType
Definizione: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Specifica il tipo di dispositivo touch.
Se il valore è
touchScreen
, il dispositivo touch è uno schermo touch associato a un display.Se il valore è
touchPad
, il dispositivo touch è un touch pad non associato a un display.Se il valore è
pointer
, il dispositivo touch è un touch pad non associato a un display e i suoi movimenti vengono utilizzati per i gesti indiretti del puntatore multi-touch .Se il valore è
default
, il sistema rileva automaticamente la tipologia del dispositivo secondo l'algoritmo di classificazione.
Fare riferimento alla sezione Classificazione per maggiori dettagli su come il tipo di dispositivo influenza il comportamento del dispositivo touch.
In Android 3 e versioni precedenti, si presupponeva che tutti i dispositivi touch fossero touch screen.
touch.orientationAware
Definizione: touch.orientationAware
= 0
| 1
Specifica se il dispositivo touch deve reagire alle modifiche dell'orientamento del display.
Se il valore è
1
, le posizioni di tocco segnalate dal dispositivo touch vengono ruotate ogni volta che cambia l'orientamento del display.Se il valore è
0
, le posizioni touch segnalate dal dispositivo touch sono immuni alle modifiche dell'orientamento del display.
Il valore predefinito è 1
se il dispositivo è touch screen, 0
altrimenti.
Il sistema distingue tra touch screen e display interni ed esterni. Un touch screen interno con rilevamento dell'orientamento viene ruotato in base all'orientamento del display interno. Un touch screen esterno con rilevamento dell'orientamento viene ruotato in base all'orientamento del display esterno.
La consapevolezza dell'orientamento viene utilizzata per supportare la rotazione dei touch screen su dispositivi come Nexus One. Ad esempio, quando il dispositivo viene ruotato in senso orario di 90 gradi rispetto al suo orientamento naturale, le posizioni assolute dei tocchi vengono rimappate in modo tale che un tocco nell'angolo in alto a sinistra del sistema di coordinate assolute del touch screen venga segnalato come un tocco nell'angolo in alto a sinistra angolo del sistema di coordinate ruotate del display. Questo viene fatto in modo che i tocchi vengano segnalati con lo stesso sistema di coordinate utilizzato dalle app per disegnare i propri elementi visivi.
Prima di Honeycomb, si presumeva che tutti i dispositivi touch fossero sensibili all'orientamento.
touch.gestureMode
Definizione: touch.gestureMode
= pointer
| spots
| default
Specifica la modalità di presentazione per i movimenti del puntatore. Questa proprietà di configurazione è rilevante solo quando il dispositivo touch è di tipo puntatore .
Se il valore è
pointer
, i gesti del touch pad vengono presentati tramite un cursore simile al puntatore del mouse.Se il valore è
spots
, i gesti del touch pad sono presentati da un'ancora che rappresenta il baricentro del gesto e da una serie di punti circolari che rappresentano la posizione delle singole dita.
Il valore predefinito è pointer
quando è impostata la proprietà di input INPUT_PROP_SEMI_MT
, altrimenti spots
.
Campi X e Y
I campi X e Y forniscono informazioni sulla posizione del centro dell'area di contatto.
Calcolo
Il calcolo è semplice: le informazioni sulla posizione provenienti dal driver touch vengono interpolate linearmente nel sistema di coordinate di output.
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, campi dimensione
I campi touchMajor
e touchMinor
descrivono le dimensioni approssimative dell'area di contatto in unità di output (pixel).
I campi toolMajor
e toolMinor
descrivono le dimensioni approssimative dello strumento stesso in unità di output (pixel).
Il campo size
descrive la dimensione normalizzata del tocco rispetto al tocco più grande possibile che il dispositivo touch può rilevare. La dimensione normalizzata più piccola possibile è 0,0 (nessun contatto o non è misurabile) e la dimensione normalizzata più grande possibile è 1,0 (l'area del sensore è satura).
Quando è possibile misurare sia la lunghezza che la larghezza approssimative, il campo touchMajor
specifica la dimensione più lunga e il campo touchMinor
specifica la dimensione più breve dell'area di contatto. Quando è possibile misurare solo il diametro approssimativo dell'area di contatto, i campi touchMajor
e touchMinor
sono uguali.
Allo stesso modo, il campo toolMajor
specifica la dimensione più lunga e il campo toolMinor
specifica la dimensione più breve dell'area della sezione trasversale dello strumento.
Se la dimensione del tocco non è disponibile ma la dimensione dello strumento è disponibile, la dimensione dello strumento viene impostata uguale alla dimensione del tocco. Al contrario, se la dimensione dell'utensile non è disponibile ma la dimensione del tocco è disponibile, la dimensione del tocco viene impostata uguale alla dimensione dell'utensile.
I dispositivi touch misurano o segnalano la dimensione del tocco e la dimensione dello strumento in vari modi. L'attuale implementazione supporta tre diversi tipi di misurazioni: diametro, area e riquadro di delimitazione geometrica in unità di superficie.
Definizione: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Specifica il tipo di misurazione utilizzata dal driver del tocco per riportare la dimensione del tocco e la dimensione dello strumento.
Se il valore è
none
, la dimensione è impostata su zero.Se il valore è
geometric
, si presuppone che la dimensione sia specificata nelle stesse unità di superficie della posizione, quindi viene ridimensionata nello stesso modo.Se il valore è
diameter
, si presuppone che la dimensione sia proporzionale al diametro (larghezza) del tocco o dello strumento.Se il valore è
area
, si presuppone che la dimensione sia proporzionale all'area del tocco o dello strumento.Se il valore è
default
, il sistema utilizza la calibrazionegeometric
se è disponibile l'asseraw.touchMajor
oraw.toolMajor
, altrimenti utilizza la calibrazionenone
.
toccare.la.scala.delle.dimensioni
Definizione: touch.size.scale
= <un numero in virgola mobile non negativo>
Specifica un fattore di scala costante utilizzato nella calibrazione.
Il valore predefinito è 1.0
.
tocco.dimensione.bias
Definizione: touch.size.bias
= <un numero in virgola mobile non negativo>
Specifica un valore di bias costante utilizzato nella calibrazione.
Il valore predefinito è 0.0
.
touch.size.isSummed
Definizione: touch.size.isSummed
= 0
| 1
Specifica se la dimensione viene segnalata come somma delle dimensioni di tutti i contatti attivi o se viene segnalata individualmente per ciascun contatto.
Se il valore è
1
, la dimensione riportata viene divisa per il numero di contatti prima dell'uso.Se il valore è
0
, la dimensione segnalata viene utilizzata così com'è.
Il valore predefinito è 0
.
Alcuni dispositivi touch, in particolare i dispositivi "Semi-MT", non sono in grado di distinguere le dimensioni individuali di più contatti, quindi riportano una misurazione delle dimensioni che rappresenta la loro area o larghezza totale. Questa proprietà deve essere impostata su 1
solo per tali dispositivi. In caso di dubbio, imposta questo valore su 0
.
Calcolo
Il calcolo dei campi touchMajor
, touchMinor
, toolMajor
, toolMinor
e size
dipende dai parametri di calibrazione specificati.
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
campo di pressione
Il campo pressure
descrive la pressione fisica approssimativa applicata al dispositivo touch come un valore normalizzato compreso tra 0,0 (nessun tocco) e 1,0 (pressione normale).
Una pressione pari a zero indica che l'utensile è sospeso.
calibrazione.della.pressione.toccata
Definizione: touch.pressure.calibration
= none
| physical
| amplitude
| default
Specifica il tipo di misurazione utilizzata dal driver touch per riportare la pressione.
Se il valore è
none
, la pressione è sconosciuta, quindi è impostata su 1,0 quando si tocca e 0,0 quando si resta in bilico.Se il valore è
physical
, si presuppone che l'asse della pressione misuri l'effettiva intensità fisica della pressione applicata al touch pad.Se il valore è
amplitude
, si presuppone che l'asse della pressione misuri l'ampiezza del segnale, che è correlata alla dimensione del contatto e alla pressione applicata.Se il valore è
default
, il sistema utilizza la calibrazionephysical
se l'asse di pressione è disponibile, altrimenti ne utilizzanone
.
toccare.la.scala.della.pressione
Definizione: touch.pressure.scale
= <a Numero punto galleggiante non negativo>
Specifica un fattore di scala costante utilizzato nella calibrazione.
Il valore predefinito è 1.0 / raw.pressure.max
.
Calcolo
Il calcolo del campo pressure
dipende dai parametri di calibrazione specificati.
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
Campi di orientamento e inclinazione
Il campo orientation
descrive l'orientamento del tatto e dello strumento come misurazione angolare. Un orientamento di 0
indica che l'asse maggiore è orientato verticalmente, -PI/2
indica che l'asse maggiore è orientato a sinistra, PI/2
indica che l'asse maggiore è orientato a destra. Quando è presente uno strumento Stylus, la gamma di orientamento può essere descritta in una gamma di cerchi completi da -PI
o PI
.
Il campo tilt
descrive l'inclinazione dello strumento come misurazione angolare. Un'inclinazione di 0
indica che lo strumento è perpendicolare alla superficie. Un'inclinazione di PI/2
indica che lo strumento è piatto sulla superficie.
touch.orientation.Calibration
Definizione: touch.orientation.calibration
= none
| interpolated
| vector
| default
Specifica il tipo di misurazione utilizzata dal driver Touch per segnalare l'orientamento.
- Se il valore non è
none
, l'orientamento è sconosciuto, quindi è impostato su 0. - Se il valore viene
interpolated
, l'orientamento è interpolato linearmente in modo tale che un valore grezzo diraw.orientation.min
maps a-PI/2
e un valore grezzo diraw.orientation.max
mappe aPI/2
. Il valore centrale di(raw.orientation.min + raw.orientation.max) / 2
mappe a0
. - Se il valore è
vector
, l'orientamento viene interpretato come un vettore affollato che componente di due campi a 4 bit firmati. Questa rappresentazione viene utilizzata su parti di protocollo basato su oggetti Atmel. Se decodificato, il vettore produce un angolo di orientamento e un'entità di fiducia. La grandezza di fiducia viene utilizzata per ridimensionare le informazioni sulle dimensioni, a meno che non siano geometriche. - Se il valore è
default
, il sistema utilizza la calibrazioneinterpolated
se l'asse di orientamento disponibile, altrimenti non ne utilizzanone
.
Calcolo
Il calcolo dei campi di orientation
e tilt
dipende dai parametri di calibrazione specificati e dall'ingresso disponibili.
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
campo di distanza
Il campo distance
descrive la distanza tra lo strumento e la superficie del dispositivo touch. Un valore di 0,0 indica il contatto diretto e i valori maggiori indicano l'aumento della distanza dalla superficie.
touch.distance.calibration
Definizione: touch.distance.calibration
= none
| scaled
| default
Specifica il tipo di misurazione utilizzata dal driver Touch per segnalare la distanza.
Se il valore non è
none
, la distanza è sconosciuta, quindi è impostata su 0.Se il valore viene
scaled
, la distanza riportata viene moltiplicata per un fattore di scala costante.Se il valore è
default
, il sistema utilizza la calibrazionescaled
se l'asse di distanza disponibile, altrimenti non ne usanone
.
touch.distance.scale
Definizione: touch.distance.scale
= <a Numero punto galleggiante non negativo>
Specifica un fattore di scala costante utilizzato nella calibrazione.
Il valore predefinito è 1.0
.
Calcolo
Il calcolo del campo distance
dipende dai parametri di calibrazione specificati.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Esempio
# 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
Note di compatibilità
Le proprietà di configurazione per i dispositivi touch sono cambiate in modo significativo in Android Ice Cream Sandwich 4.0. Tutti i file di configurazione del dispositivo di input per i dispositivi touch devono essere aggiornati per utilizzare le nuove proprietà di configurazione.
Potrebbe anche essere necessario aggiornare i driver di dispositivi touch più vecchi.
File di mappa delle chiavi virtuali
I dispositivi touch possono essere utilizzati per implementare le chiavi virtuali.
Esistono diversi modi per farlo, a seconda delle capacità del controller touch. Alcuni controller touch possono essere configurati direttamente per implementare tasti soft impostando i registri del firmware. Altre volte è desiderabile eseguire la mappatura dalle coordinate touch ai codici chiave nel software.
Quando le chiavi virtuali sono implementate nel software, il kernel deve esportare un file di mappa della chiave virtuale chiamato virtualkeys.<devicename>
come proprietà della scheda. Ad esempio, se i driver del dispositivo touchscreen riportano il suo nome come "touchyfeely", il file della mappa della chiave virtuale deve avere il percorso /sys/board_properties/virtualkeys.touchyfeely
.
Un file di mappa della chiave virtuale descrive le coordinate e i codici chiave Linux dei tasti virtuali sul touchscreen.
Oltre al file della mappa della chiave virtuale, deve esserci un file di layout della chiave corrispondente e il file della mappa dei caratteri chiave per mappare i codici chiave Linux sui codici chiave Android e per specificare il tipo di dispositivo tastiera (di solito SPECIAL_FUNCTION
).
Sintassi
Un file di mappa delle chiavi virtuali è un file di testo semplice costituito da una sequenza di descrizioni del layout della chiave virtuale separate da nuove linee o da due punti.
Le righe dei commenti iniziano con "#" e continuano fino alla fine della linea.
Ogni chiave virtuale è descritta da 6 componenti delimitati al colon:
-
0x01
: un codice di versione. Deve sempre essere0x01
. - <Codice chiave Linux>: il codice chiave Linux della chiave virtuale.
- <Centerx>: la coordinata X pixel del centro della chiave virtuale.
- <Centery>: la coordinata Y pixel del centro della chiave virtuale.
- <Dample>: la larghezza della chiave virtuale nei pixel.
- <height>: l'altezza della chiave virtuale nei pixel.
Tutte le coordinate e le dimensioni sono specificate in termini di sistema di coordinate del display.
Ecco un file di mappa della chiave virtuale tutto scritto su una riga.
# 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
Lo stesso file di mappa della chiave virtuale può anche essere scritto su più righe.
# 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
Nell'esempio sopra, il touchscreen ha una risoluzione di 480x800. Di conseguenza, tutte le chiavi virtuali hanno una coordinata <Centery> di 835, che è un po 'sotto l'area visibile del touchscreen.
La prima chiave ha un codice di scansione Linux di 158
( KEY_BACK
), Centerx di 55
, Centery di 835
, larghezza di 90
e altezza di 55
.
Esempio
File di mappa della chiave virtuale: /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
File di layout chiave: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
File della mappa dei caratteri chiave: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Gesti indiretti multi-touch puntatore
In modalità puntatore, il sistema interpreta i seguenti gesti:
- Tocca del dito singolo: clicca.
- Motion per dito singolo: sposta il puntatore.
- Pulsante Motion Plus Single Finger Premere: trascina il puntatore.
- Motion a due dita entrambe le dita si muovono nella stessa direzione: trascina l'area sotto il puntatore in quella direzione. Il puntatore stesso non si muove.
- Motion a due dita entrambe le dita si muovono l'una verso l'altra o a parte in diverse direzioni: Pan/Scala/Ruota l'area che circonda il puntatore. Il puntatore stesso non si muove.
- Motion multiplo di dito: gesto a forma libera.
Rifiuto di palma
A partire da Android 13, il sistema può rifiutare automaticamente gli input dai palmi quando il framework integrato è abilitato. Le soluzioni interne e personalizzate sono ancora supportate, sebbene potrebbero dover essere modificate per restituire il flag TOOL_TYPE_PALM
quando viene rilevato un palmo. Il framework integrato funziona anche in combinazione con soluzioni personalizzate.
Il modello effettivo esamina i primi 90 ms di dati gestiti, al puntatore attuale e ai puntatori circostanti, quindi considera quanto sono lontani dal bordo del display i tocchi. Determina quindi, su base per pointer, quale dei puntatori sono palmi. Tiene anche conto delle dimensioni di ciascun contatto, come riportato da touchMajor
e touchMinor
. Il framework Android rimuove quindi i puntatori contrassegnati da palmi del flusso di touch.
Se un puntatore è stato già inviato alle app, anche il sistema:
- (Se ci sono altri puntatori attivi) annulla il puntatore con
ACTION_POINTER_UP
eFLAG_CANCELED
set. - (Se questo è l'unico puntatore) annulla il puntatore con
ACTION_CANCEL
.
Un'API pubblica, MotionEvent.FLAG_CANCELED
, indica che l'evento corrente non dovrebbe attivare l'azione dell'utente. Questo flag è impostato sia per ACTION_CANCEL
che ACTION_POINTER_UP
.
Se il puntatore di palme non è stato inviato alle app, il sistema lascia semplicemente cadere il puntatore.
Abilita il rifiuto del palmo
- Nel driver touch, utilizzare la macro
input_abs_set_res
per impostare le risoluzioni per i seguenti campi (le unità sono pixel per mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Il supporto per
ABS_MT_TOUCH_MINOR
è facoltativo. Tuttavia, se il tuo dispositivo lo supporta, assicurarsi che la risoluzione sia impostata correttamente. -
- Per confermare che i campi sono impostati correttamente, eseguire:
$ adb shell getevent -li
- Per abilitare la funzione durante il runtime, eseguire:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Riavvia il processo
system_server
.$ adb shell stop && adb shell start
- Conferma che
adb shell dumpsys input
mostra che ci sono rifiuti di palma all'internoUnwantedInteractionBlocker
. In caso contrario, controllare i registri relativi all'input per trovare indizi su ciò che potrebbe essere configurato male.Vedere il seguente esempio per riferimento:
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: {} - Per abilitare permanentemente la funzione, aggiungi il comando SysProp corrispondente nel file
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
Ulteriori letture
,Android supporta una varietà di touchscreen e touch pad, tra cui compresse di digitalizzatore a base di stilo.
Gli schermi touch sono dispositivi touch associati a un display in modo tale che l'utente abbia l'impressione di manipolare direttamente gli elementi sullo schermo.
I touch pad sono dispositivi touch che non sono associati a un display, come un tablet digitalizzatore. I touch pad vengono in genere utilizzati per puntare o per il posizionamento indiretto assoluto o il controllo basato su gesti di un'interfaccia utente.
I dispositivi touch possono avere pulsanti le cui funzioni sono simili ai pulsanti del mouse.
I dispositivi touch possono talvolta essere manipolati utilizzando una varietà di strumenti diversi come dita o uno stilo a seconda della tecnologia del sensore di touch sottostante.
I dispositivi touch vengono talvolta utilizzati per implementare le chiavi virtuali. Ad esempio, su alcuni dispositivi Android, l'area del sensore touchscreen si estende oltre il bordo del display e serve a doppio scopo come parte di un tastiello sensibile al tocco.
A causa della grande varietà di dispositivi touch, Android si basa su un gran numero di proprietà di configurazione per descrivere le caratteristiche e il comportamento desiderato di ciascun dispositivo.
Toccare la classificazione del dispositivo
Un dispositivo di input è classificato come dispositivo multi-touch se entrambe le seguenti condizioni detengono:
- Il dispositivo di input riporta la presenza di
ABS_MT_POSITION_X
eABS_MT_POSITION_Y
ASSOLE ASSE. - Il dispositivo di input non ha pulsanti GamePad. Questa condizione risolve un'ambiguità con alcuni gamepad che riportano assi con codici che si sovrappongono a quelli degli assi MT.
Un dispositivo di input è classificato come un dispositivo a touch singolo se entrambe le seguenti condizioni detengono:
- Il dispositivo di input non è classificato come dispositivo multi-touch. Un dispositivo di input è classificato come dispositivo a touch singolo o come dispositivo multi-touch, mai entrambi.
- Il dispositivo di input riporta la presenza degli assi assoluti
ABS_X
eABS_Y
e la presenza del codice chiaveBTN_TOUCH
.
Quando un dispositivo di input è classificato come dispositivo touch, la presenza di chiavi virtuali viene determinata tentando di caricare il file della mappa della chiave virtuale per il dispositivo. Se è disponibile una mappa della chiave virtuale, viene caricato anche il file di layout chiave per il dispositivo. Fare riferimento a [Virtual Key Map File] (#Virtual-Ke-Map-Files) per informazioni sulla posizione e sul formato di questi file.
Successivamente, il sistema carica il file di configurazione del dispositivo di input per il dispositivo touch.
Tutti i dispositivi touch integrati devono avere file di configurazione del dispositivo di input. Se non è presente alcun file di configurazione del dispositivo di input, il sistema sceglie una configurazione predefinita appropriata per le periferiche touch per scopi generali come USB esterno o touch-schermate Bluetooth HID o touch pad. Questi impostazioni predefinite non sono progettate per i touchscreen integrati e possono provocare comportamenti errati.
Dopo la configurazione del dispositivo di input caricato, il sistema classifica il dispositivo di input come touchscreen , touch pad o dispositivo puntatore .
- Un dispositivo touchscreen viene utilizzato per la manipolazione diretta degli oggetti sullo schermo. L'utente tocca direttamente lo schermo, quindi il sistema non richiede alcuna prestazione aggiuntiva per indicare che gli oggetti sono manipolati.
- Un dispositivo touch pad viene utilizzato per fornire informazioni di posizionamento assoluto a un'app sui tocchi su una determinata area del sensore. Può essere utile per le compresse di digitalizzatore.
- Un dispositivo puntatore viene utilizzato per la manipolazione indiretta degli oggetti sullo schermo usando un cursore. Le dita sono interpretate come gesti di puntatore multi-touch. Altri strumenti, come gli stili, vengono interpretati usando posizioni assolute. Vedere Gesti indiretti a puntatore multi-touch per ulteriori informazioni.
Le seguenti regole vengono utilizzate per classificare il dispositivo di input come touchscreen, touch pad o dispositivo puntatore.
- Se è impostata la proprietà
touch.deviceType
, il tipo di dispositivo è impostato come indicato. - Se il dispositivo di input riporta la presenza della proprietà input
INPUT_PROP_DIRECT
(tramiteEVIOCGPROP
IOCTL), il tipo di dispositivo è impostato su touchscreen . Questa condizione presuppone che i dispositivi di touch di input diretti siano collegati a un display che è anche collegato. - Se il dispositivo di input riporta la presenza della proprietà input
INPUT_PROP_POINTER
(tramiteEVIOCGPROP
IOCTL), il tipo di dispositivo è impostato su puntatore . - Se il dispositivo di input riporta la presenza degli assi relativi
REL_X
oREL_Y
, il tipo di dispositivo è impostato su TOUCT PAD . Questa condizione risolve un'ambiguità per i dispositivi di input che consistono sia di mouse che di un touch pad. In questo caso, il touch pad non è utilizzato per controllare il puntatore perché il mouse lo controlla già. - Altrimenti, il tipo di dispositivo è impostato su puntatore . Questo impostazione predefinita garantisce che i touch pad non siano stati designati nessun altro scopo speciale controllano il puntatore.
Pulsanti
I pulsanti sono controlli opzionali che le app possono utilizzare per eseguire funzioni aggiuntive. I pulsanti sui dispositivi touch si comportano in modo simile ai pulsanti del mouse e sono principalmente utili con dispositivi touch tipi di punta o con uno stilo.
I seguenti pulsanti sono supportati:
-
BTN_LEFT
: mappatoMotionEvent.BUTTON_PRIMARY
. -
BTN_RIGHT
: mappatoMotionEvent.BUTTON_SECONDARY
. -
BTN_MIDDLE
: mappato suMotionEvent.BUTTON_MIDDLE
. -
BTN_BACK
eBTN_SIDE
: mappato aMotionEvent.BUTTON_BACK
. Premendo questo pulsante sintetizza anche un tasto Premere con il tasto CodiceKeyEvent.KEYCODE_BACK
. -
BTN_FORWARD
eBTN_EXTRA
: mappatoMotionEvent.BUTTON_FORWARD
. Premendo questo pulsante sintetizza anche un tasto Premere con il tasto CodiceKeyEvent.KEYCODE_FORWARD
. -
BTN_STYLUS
: mappatoMotionEvent.BUTTON_SECONDARY
. -
BTN_STYLUS2
: mappatoMotionEvent.BUTTON_TERTIARY
.
Strumenti e tipi di strumenti
Uno strumento è un dito, uno stilo o un altro apparato che viene utilizzato per interagire con il dispositivo touch. Alcuni dispositivi touch possono distinguere tra diversi tipi di strumenti.
Altrove in Android, come nell'API MotionEvent
, uno strumento viene spesso definito un puntatore .
Sono supportati i seguenti tipi di strumenti:
-
BTN_TOOL_FINGER
eMT_TOOL_FINGER
: mappato aMotionEvent.TOOL_TYPE_FINGER
. -
BTN_TOOL_PEN
eMT_TOOL_PEN
: mappato suMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_RUBBER
: mappatoMotionEvent.TOOL_TYPE_ERASER
. -
BTN_TOOL_BRUSH
: mappatoMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_PENCIL
: mappatoMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_AIRBRUSH
: mappatoMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_MOUSE
: mappatoMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_LENS
: mappatoMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
eBTN_TOOL_QUADTAP
: mappato aMotionEvent.TOOL_TYPE_FINGER
.
Hovering contro strumenti toccanti
Gli strumenti possono essere in contatto con il dispositivo touch o in gamma e sospeso sopra di esso. Non tutti i dispositivi touch possono percepire la presenza di uno strumento che si libra sopra il dispositivo touch. Quelli che lo fanno, come i digitalizzatori di stilo a base di RF, possono spesso rilevare quando lo strumento si trova all'interno di una gamma limitata del digitalizzatore.
Il componente InputReader
distingue gli strumenti di toccante dagli strumenti per il bilico. Allo stesso modo, gli strumenti toccanti e gli strumenti per il bilico vengono segnalati alle app in diversi modi.
Gli strumenti di tocco sono riportati alle app come eventi touch usando MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
e MotionEvent.ACTION_POINTER_UP
.
Gli strumenti di bandiera sono riportati alle app come eventi di movimento generico usando MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
e MotionEvent.ACTION_HOVER_EXIT
.
Toccare i requisiti del driver del dispositivo
- I driver di tocco del dispositivo devono registrare solo gli assi e i codici chiave per gli assi e i pulsanti che supportano. La registrazione di assi non supportati o codici chiave può confondere l'algoritmo di classificazione del dispositivo o causare il rilevamento in modo errato delle capacità del dispositivo. Ad esempio, se il dispositivo riporta il codice chiave
BTN_TOUCH
, il sistema presuppone cheBTN_TOUCH
venga sempre utilizzato per indicare se lo strumento sta toccando lo schermo. Pertanto,BTN_TOUCH
non dovrebbe essere usato per indicare che lo strumento è semplicemente nell'intervallo e si libra. - I dispositivi a touch singolo utilizzano i seguenti eventi di input Linux:
-
ABS_X
: (richiesto) riporta la coordinata X dello strumento. -
ABS_Y
: (richiesto) riporta la coordinata Y dello strumento. -
ABS_PRESSURE
: (facoltativo) riporta la pressione fisica applicata alla punta dello strumento o alla potenza del segnale del contatto touch. -
ABS_TOOL_WIDTH
: (Opzionale) Segnala l'area o la larghezza della sezione trasversale del contatto touch o dello strumento stesso. -
ABS_DISTANCE
: (facoltativo) riporta la distanza dello strumento dalla superficie del dispositivo touch. -
ABS_TILT_X
: (Opzionale) Segnala l'inclinazione dello strumento dalla superficie del dispositivo touch lungo l'asse X. -
ABS_TILT_Y
: (opzionale) riporta l'inclinazione dello strumento dalla superficie del dispositivo touch lungo l'asse Y. -
BTN_TOUCH
: (richiesto) indica se lo strumento tocca il dispositivo. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (Opzionale) ATTENI DI REPORTI. -
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
: (optional) Reports the tool type .
-
- I dispositivi multi-touch utilizzano i seguenti eventi di input Linux:
-
ABS_MT_POSITION_X
: (richiesto) Segnala la coordinata X dello strumento. -
ABS_MT_POSITION_Y
: (richiesto) riporta la coordinata Y dello strumento. -
ABS_MT_PRESSURE
: (Opzionale) Segnala la pressione fisica applicata alla punta dello strumento o la potenza del segnale del contatto touch. -
ABS_MT_TOUCH_MAJOR
: (opzionale) riporta l'area della sezione trasversale del contatto touch o la lunghezza della dimensione più lunga del contatto touch. -
ABS_MT_TOUCH_MINOR
: (Opzionale) Segnala la lunghezza della dimensione più corta del contatto touch. Questo asse non deve essere utilizzato seABS_MT_TOUCH_MAJOR
sta segnalando una misurazione dell'area. -
ABS_MT_WIDTH_MAJOR
: (facoltativo) riporta l'area della sezione trasversale dello strumento stesso o la lunghezza della dimensione più lunga dello strumento stesso. Non usare questo asse a meno che tu non conosca le dimensioni dello strumento stesso. -
ABS_MT_WIDTH_MINOR
: (opzionale) segnala la lunghezza della dimensione più corta dello strumento stesso. Questo asse non deve essere utilizzato seABS_MT_WIDTH_MAJOR
sta segnalando una misurazione dell'area o se le dimensioni dello strumento stesso sono sconosciute. -
ABS_MT_ORIENTATION
: (opzionale) riporta l'orientamento dello strumento. -
ABS_MT_DISTANCE
: (opzionale) riporta la distanza dello strumento dalla superficie del dispositivo touch. -
ABS_MT_TOOL_TYPE
: (Opzionale) Segnala il tipo di strumento comeMT_TOOL_FINGER
oMT_TOOL_PEN
. -
ABS_MT_TRACKING_ID
: (Opzionale) Segnala l'ID di tracciamento dello strumento. L'ID di monitoraggio è un intero arbitrario non negativo che viene utilizzato per identificare e tracciare ogni strumento in modo indipendente quando sono attivi più strumenti. Ad esempio, quando più dita toccano il dispositivo, a ciascun dito dovrebbe essere assegnato un ID di tracciamento distinto che viene utilizzato purché il dito rimane in contatto. L'ID di monitoraggio può essere riutilizzato quando i loro strumenti associati passano dalla portata. -
ABS_MT_SLOT
: (Opzionale) Segnala l'ID slot dello strumento, quando si utilizza il protocollo multi-touch Linux 'B'. Fare riferimento alla documentazione del protocollo multi-touch Linux per maggiori dettagli. -
BTN_TOUCH
: (richiesto) indica se lo strumento tocca il dispositivo. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (Opzionale) ATTENI DI REPORTI. -
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
: (optional) Reports the tool type .
-
- Se vengono definiti assi sia per il protocollo a touch singolo che multi-touch, vengono utilizzati solo gli assi multi-touch e gli assi singoli-touch vengono ignorati.
I valori minimi e massimi degli assi
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
eABS_MT_POSITION_Y
definiscono i limiti dell'area attiva del dispositivo nelle unità di superficie specifiche del dispositivo. Nel caso di un touchscreen, l'area attiva descrive la parte del dispositivo touch che copre effettivamente il display.Per un touchscreen, il sistema interpola automaticamente le posizioni di tocco riportate nelle unità di superficie per ottenere posizioni di tocco nei pixel di visualizzazione in base al seguente calcolo:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Un touchscreen potrebbe riportare tocchi al di fuori dell'area attiva riportata.
I tocchi avviati al di fuori dell'area attiva non vengono consegnati alle app ma possono essere utilizzati per le chiavi virtuali.
I tocchi che vengono avviati all'interno dell'area attiva o che inseriscono ed esci dall'area di visualizzazione vengono consegnati alle app. Di conseguenza, se un tocco inizia all'interno dei limiti di un'app e quindi si sposta al di fuori dell'area attiva, l'app potrebbe ricevere eventi touch con coordinate di visualizzazione che sono negative o oltre i limiti del display. Questo è un comportamento previsto.
Un dispositivo touch non dovrebbe mai bloccare il touch coordinati ai limiti dell'area attiva. Se un tocco esce nell'area attiva, dovrebbe essere segnalato come al di fuori dell'area attiva o non dovrebbe essere segnalato affatto.
Ad esempio, se il dito dell'utente tocca vicino all'angolo in alto a sinistra del touchscreen, potrebbe segnalare una coordinata di (Minx, Miny). Se il dito continua a spostarsi più fuori dall'area attiva, il touchscreen dovrebbe iniziare a segnalare coordinate con componenti inferiori a Minx e Miny, come (Minx - 2, Miny - 3) o dovrebbe smettere di segnalare del tutto il tocco. In altre parole, il touchscreen non dovrebbe essere riportato (Minx, Miny) quando il dito dell'utente si tocca davvero al di fuori dell'area attiva.
Le coordinate del tocco di serraggio sul bordo del display crea un limite duro artificiale attorno al bordo dello schermo che impedisce al sistema di monitorare senza problemi movimenti che entrano o escono dai limiti dell'area del display.
I valori riportati da
ABS_PRESSURE
oABS_MT_PRESSURE
, se riportati, devono essere diversi da zero quando lo strumento tocca il dispositivo e zero altrimenti per indicare che lo strumento è in bilico.Le informazioni sulla pressione di segnalazione sono opzionali ma fortemente raccomandate. Le app possono utilizzare le informazioni sulla pressione per implementare il disegno sensibile alla pressione e altri effetti.
I valori riportati da
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
oABS_MT_WIDTH_MINOR
dovrebbe essere diverso da zero quando lo strumento tocca il dispositivo e zero altrimenti, ma questo non è richiesto. Ad esempio, il dispositivo touch potrebbe essere in grado di misurare le dimensioni dei contatti del tocco delle dita ma non i contatti a tocco stilo.Le informazioni sulla dimensione del reporting sono opzionali ma fortemente raccomandate. Le app possono utilizzare le informazioni di pressione per implementare il disegno sensibile alle dimensioni e altri effetti.
I valori riportati da
ABS_DISTANCE
oABS_MT_DISTANCE
devono avvicinarsi a zero quando lo strumento tocca il dispositivo. La distanza può rimanere diversa da zero anche quando lo strumento è in contatto diretto. I valori esatti riportati dipendono dal modo in cui l'hardware misura la distanza.Le informazioni sulla distanza di reporting sono opzionali ma consigliate per i dispositivi stilo.
I valori riportati da
ABS_TILT_X
eABS_TILT_Y
devono essere zero quando lo strumento è perpendicolare al dispositivo. Un'inclinazione diversa da zero indica che lo strumento è tenuto a una pendenza.Si presume che gli angoli di inclinazione lungo gli assi X e Y siano specificati in gradi da perpendicolare. Il punto centrale (perfettamente perpendicolare) è dato da
(max + min) / 2
per ogni asse. I valori più piccoli del punto centrale rappresentano un'inclinazione verso l'alto o a sinistra, i valori più grandi del punto centrale rappresentano un'inclinazione verso il basso o a destra.InputReader
converte i componenti di inclinazione X e Y in un angolo di inclinazione perpendicolare che va da 0 a radiantiPI / 2
e un angolo di orientamento planare che va da-PI
a radiantiPI
. Questa rappresentazione si traduce in una descrizione dell'orientamento compatibile con ciò che viene utilizzato per descrivere i tocchi delle dita.Il reporting di informazioni di inclinazione è facoltativo ma consigliato per i dispositivi stilo.
Se il tipo di strumento viene riportato da
ABS_MT_TOOL_TYPE
, sostituisce qualsiasi informazione del tipo di strumento riportato daBTN_TOOL_*
. Se non sono disponibili informazioni sul tipo di strumento, il tipo di strumento è predefinito suMotionEvent.TOOL_TYPE_FINGER
.È determinato che uno strumento è attivo in base alle seguenti condizioni:
Quando si utilizza il protocollo singolo-touch, lo strumento è attivo se
BTN_TOUCH
oBTN_TOOL_*
è 1.Questa condizione implica che
InputReader
deve avere almeno alcune informazioni sulla natura dello strumento, sia se si sta toccando, sia almeno il suo tipo di strumento. Se non sono disponibili informazioni, si presume che lo strumento sia inattivo (fuori porta).- Quando si utilizza il protocollo multi-touch "A", lo strumento è attivo ogni volta che appare nel rapporto di sincronizzazione più recente. Quando lo strumento smette di apparire nei report di sincronizzazione, cessa di esistere.
- Quando si utilizza il protocollo multi-touch 'B', lo strumento è attivo fintanto che ha uno slot attivo. Quando lo slot è stato cancellato, lo strumento cessa di esistere.
- Si determina uno strumento in bilico in base alle seguenti condizioni:
- Se lo strumento è
BTN_TOOL_MOUSE
oBTN_TOOL_LENS
, lo strumento non è in bilico, anche se nessuna delle seguenti condizioni è vera. - Se lo strumento è attivo e il driver segnala le informazioni sulla pressione e la pressione segnalata è zero, lo strumento è in bilico.
- Se lo strumento è attivo e il driver supporta il codice chiave
BTN_TOUCH
eBTN_TOUCH
ha un valore zero, lo strumento è in bilico.
- Se lo strumento è
-
InputReader
supporta sia il protocollo multi-touch "A" che "B". I nuovi driver dovrebbero utilizzare il protocollo "B" ma entrambi funziona. A partire da Android 4.0, potrebbe essere necessario modificare i driver touchscreen per rispettare la specifica del protocollo di input Linux.
Potrebbero essere richieste le seguenti modifiche:
Quando uno strumento diventa inattivo (il dito va "in alto"), dovrebbe smettere di apparire nei successivi report di sincronizzazione multi-touch. Quando tutti gli strumenti diventano inattivi (tutte le dita aumentano "su"), il driver dovrebbe inviare un pacchetto di report di sincronizzazione vuoto, come
SYN_MT_REPORT
seguito daSYN_REPORT
.Le versioni precedenti degli eventi "UP" di Android si aspettavano da segnalare inviando un valore di pressione di 0. Il vecchio comportamento era incompatibile con la specifica del protocollo di input Linux e non è più supportato.
Le informazioni sulla pressione fisica o sulla resistenza del segnale devono essere riportate utilizzando
ABS_MT_PRESSURE
.Le versioni precedenti di Android hanno recuperato le informazioni di pressione da
ABS_MT_TOUCH_MAJOR
. Il vecchio comportamento era incompatibile con la specifica del protocollo di input Linux e non è più supportato.- Le informazioni sulla dimensione del tocco devono essere riportate utilizzando
ABS_MT_TOUCH_MAJOR
.Versioni precedenti delle informazioni sulla dimensione recuperate Android da
ABS_MT_TOOL_MAJOR
. Il vecchio comportamento era incompatibile con la specifica del protocollo di input Linux e non è più supportato.
Toccare il funzionamento del dispositivo
Di seguito è riportato un breve riepilogo dell'operazione del dispositivo touch su Android.
-
EventHub
legge eventi grezzi dal driverevdev
. -
InputReader
consuma gli eventi grezzi e aggiorna lo stato interno sulla posizione e su altre caratteristiche di ciascun strumento. Traccia anche gli stati dei pulsanti. - Se è stato premuto o rilasciato avanti o in avanti ,
InputReader
avvisaInputDispatcher
sull'evento chiave. -
InputReader
determina se si è verificata una pressione del tasto virtuale. In tal caso, avvisaInputDispatcher
sull'evento chiave. -
InputReader
determina se il tocco è stato avviato all'interno dei limiti del display. In tal caso, avvisaInputDispatcher
sull'evento touch. - Se non ci sono strumenti toccanti, ma esiste almeno uno strumento per il bordo,
InputReader
notificaInputDispatcher
sull'evento Hover. - Se il tipo di dispositivo touch è puntatore ,
InputReader
esegue il rilevamento dei gesti del puntatore, sposta il puntatore e le macchie di conseguenza e notificaInputDispatcher
sull'evento puntatore. -
InputDispatcher
utilizzaWindowManagerPolicy
per determinare se gli eventi devono essere spediti e se dovrebbero svegliare il dispositivo. Quindi,InputDispatcher
offre gli eventi alle app appropriate.
Toccare la configurazione del dispositivo
Il comportamento del dispositivo touch è determinato dagli assi, pulsanti, proprietà di input del dispositivo, configurazione del dispositivo di ingresso, mappa della chiave virtuale e layout della chiave.
Fare riferimento alle seguenti sezioni per maggiori dettagli sui file che partecipano alla configurazione della tastiera:
Proprietà
Il sistema si basa su molte proprietà di configurazione del dispositivo di input per configurare e calibrare il comportamento del dispositivo touch.
Uno dei motivi è che i driver del dispositivo per i dispositivi touch spesso riportano le caratteristiche dei tocchi utilizzando unità specifiche del dispositivo.
Ad esempio, molti dispositivi touch misurano l'area di contatto del touch utilizzando una scala interna specifica del dispositivo, come il numero totale di nodi del sensore che sono stati attivati dal tatto. Questo valore di dimensioni grezzi non sarebbe significativo per le app perché avrebbero bisogno di conoscere le dimensioni fisiche e le altre caratteristiche dei nodi del sensore del dispositivo touch.
Il sistema utilizza i parametri di calibrazione codificati nei file di configurazione del dispositivo di input per decodificare, trasformare e normalizzare i valori riportati dal dispositivo touch in una rappresentazione standard più semplice che le app possono comprendere.
Convenzioni di documentazione
Ai fini della documentazione, utilizziamo le seguenti convenzioni per descrivere i valori utilizzati dal sistema durante il processo di calibrazione.
Valori dell'asse grezzo
Le seguenti espressioni indicano i valori grezzi riportati dal driver del dispositivo touch come eventi EV_ABS
.
-
raw.x
- Il valore dell'asse
ABS_X
oABS_MT_POSITION_X
. -
raw.y
- Il valore dell'asse
ABS_Y
oABS_MT_POSITION_Y
. -
raw.pressure
- Il valore dell'asse
ABS_PRESSURE
oABS_MT_PRESSURE
o 0 se non disponibile. -
raw.touchMajor
- Il valore dell'asse
ABS_MT_TOUCH_MAJOR
o 0 se non disponibile. -
raw.touchMinor
- Il valore dell'asse
ABS_MT_TOUCH_MINOR
oraw.touchMajor
se non disponibile. -
raw.toolMajor
- Il valore dell'asse
ABS_TOOL_WIDTH
oABS_MT_WIDTH_MAJOR
o 0 se non disponibile. -
raw.toolMinor
- Il valore dell'asse
ABS_MT_WIDTH_MINOR
oraw.toolMajor
se non disponibile. -
raw.orientation
- Il valore dell'asse
ABS_MT_ORIENTATION
o 0 se non disponibile. -
raw.distance
- Il valore dell'asse
ABS_DISTANCE
oABS_MT_DISTANCE
o 0 se non disponibile. -
raw.tiltX
- Il valore dell'asse
ABS_TILT_X
o 0 se non disponibile. -
raw.tiltY
- Il valore dell'asse
ABS_TILT_Y
o 0 se non disponibile.
Intervalli dell'asse grezzo
Le seguenti espressioni indicano i limiti dei valori grezzi. Sono ottenuti chiamando EVIOCGABS
IOCTL per ogni asse.
-
raw.*.min
- Il valore minimo inclusivo dell'asse grezzo.
-
raw.*.max
- Il valore massimo inclusivo dell'asse grezzo.
-
raw.*.range
- Equivalente a
raw.*.max - raw.*.min
. -
raw.*.fuzz
- L'accuratezza dell'asse grezzo. per esempio. fuzz = 1 implica che i valori sono accurati a +/- 1 unità.
-
raw.width
- La larghezza inclusiva dell'area di touch, equivalente a
raw.x.range + 1
. -
raw.height
- L'altezza inclusiva dell'area di touch, equivalente a
raw.y.range + 1
.
Intervalli di output
Le seguenti espressioni indicano le caratteristiche del sistema di coordinate di output. The system uses linear interpolation to translate touch position information from the surface units used by the touch device into the output units that are reported to apps such as display pixels.
-
output.width
- The output width. For touch screens (associated with a display), this is the display width in pixels. For touch pads (not associated with a display), the output width equals
raw.width
, indicating that no interpolation is performed. -
output.height
- The output height. For touch screens (associated with a display), this is the display height in pixels. For touch pads (not associated with a display), the output height equals
raw.height
, indicating that no interpolation is performed. -
output.diag
- The diagonal length of the output coordinate system, equivalent to
sqrt(output.width ^2 + output.height ^2)
.
Basic configuration
The touch input mapper uses many configuration properties in the input device configuration file to specify calibration values. The following table describes some general purpose configuration properties. All other properties are described in the following sections along with the fields they are used to calibrate.
touch.deviceType
Definition: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Specifies the touch device type.
If the value is
touchScreen
, the touch device is a touch screen associated with a display.If the value is
touchPad
, the touch device is a touch pad not associated with a display.If the value is
pointer
, the touch device is a touch pad not associated with a display, and its motions are used for indirect multi-touch pointer gestures .If the value is
default
, the system automatically detects the device type according to the classification algorithm.
Refer to the Classification section for more details about how the device type influences the behavior of the touch device.
In Android 3 and lower, all touch devices were assumed to be touch screens.
touch.orientationAware
Definition: touch.orientationAware
= 0
| 1
Specifies whether the touch device should react to display orientation changes.
If the value is
1
, touch positions reported by the touch device are rotated whenever the display orientation changes.If the value is
0
, touch positions reported by the touch device are immune to display orientation changes.
The default value is 1
if the device is a touch screen, 0
otherwise.
The system distinguishes between internal and external touch screens and displays. An orientation aware internal touch screen is rotated based on the orientation of the internal display. An orientation aware external touch screen is rotated based on the orientation of the external display.
Orientation awareness is used to support rotation of touch screens on devices like the Nexus One. For example, when the device is rotated clockwise 90 degrees from its natural orientation, the absolute positions of touches are remapped such that a touch in the top-left corner of the touch screen's absolute coordinate system is reported as a touch in the top-left corner of the display's rotated coordinate system. This is done so that touches are reported with the same coordinate system that apps use to draw their visual elements.
Prior to Honeycomb, all touch devices were assumed to be orientation aware.
touch.gestureMode
Definition: touch.gestureMode
= pointer
| spots
| default
Specifies the presentation mode for pointer gestures. This configuration property is only relevant when the touch device is of type pointer .
If the value is
pointer
, the touch pad gestures are presented by way of a cursor similar to a mouse pointer.If the value is
spots
, the touch pad gestures are presented by an anchor that represents the centroid of the gesture and a set of circular spots that represent the position of individual fingers.
The default value is pointer
when the INPUT_PROP_SEMI_MT
input property is set, or spots
otherwise.
X and Y fields
The X and Y fields provide positional information for the center of the contact area.
Calcolo
The calculation is straightforward: positional information from the touch driver is linearly interpolated to the output coordinate system.
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, size fields
The touchMajor
and touchMinor
fields describe the approximate dimensions of the contact area in output units (pixels).
The toolMajor
and toolMinor
fields describe the approximate dimensions of the tool itself in output units (pixels).
The size
field describes the normalized size of the touch relative to the largest possible touch that the touch device can sense. The smallest possible normalized size is 0.0 (no contact, or it is unmeasurable), and the largest possible normalized size is 1.0 (sensor area is saturated).
When both the approximate length and breadth can be measured, then the touchMajor
field specifies the longer dimension and the touchMinor
field specifies the shorter dimension of the contact area. When only the approximate diameter of the contact area can be measured, then the touchMajor
and touchMinor
fields are equal.
Likewise, the toolMajor
field specifies the longer dimension and the toolMinor
field specifies the shorter dimension of the tool's cross-sectional area.
If the touch size is unavailable but the tool size is available, then the tool size is set equal to the touch size. Conversely, if the tool size is unavailable but the touch size is available, then the touch size is set equal to the tool size.
Touch devices measure or report the touch size and tool size in various ways. The current implementation supports three different kinds of measurements: diameter, area, and geometric bounding box in surface units.
Definition: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Specifies the kind of measurement used by the touch driver to report the touch size and tool size.
If the value is
none
, the size is set to zero.If the value is
geometric
, the size is assumed to be specified in the same surface units as the position, so it is scaled in the same manner.If the value is
diameter
, the size is assumed to be proportional to the diameter (width) of the touch or tool.If the value is
area
, the size is assumed to be proportional to the area of the touch or tool.If the value is
default
, the system uses thegeometric
calibration if theraw.touchMajor
orraw.toolMajor
axis is available, otherwise it uses thenone
calibration.
touch.size.scale
Definition: touch.size.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
touch.size.bias
Definition: touch.size.bias
= <a non-negative floating point number>
Specifies a constant bias value used in the calibration.
The default value is 0.0
.
touch.size.isSummed
Definition: touch.size.isSummed
= 0
| 1
Specifies whether the size is reported as the sum of the sizes of all active contacts, or is reported individually for each contact.
If the value is
1
, the reported size is divided by the number of contacts prior to use.If the value is
0
, the reported size is used as is.
The default value is 0
.
Some touch devices, particularly "Semi-MT" devices cannot distinguish the individual dimensions of multiple contacts so they report a size measurement that represents their total area or width. This property should only be set to 1
for such devices. If in doubt, set this value to 0
.
Calcolo
The calculation of the touchMajor
, touchMinor
, toolMajor
, toolMinor
, and size
fields depends on the specified calibration parameters.
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
pressure field
The pressure
field describes the approximate physical pressure applied to the touch device as a normalized value between 0.0 (no touch) and 1.0 (normal pressure).
A zero pressure indicates that the tool is hovering.
touch.pressure.calibration
Definition: touch.pressure.calibration
= none
| physical
| amplitude
| default
Specifies the kind of measurement used by the touch driver to report the pressure.
If the value is
none
, the pressure is unknown so it is set to 1.0 when touching and 0.0 when hovering.If the value is
physical
, the pressure axis is assumed to measure the actual physical intensity of pressure applied to the touch pad.If the value is
amplitude
, the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.If the value is
default
, the system uses thephysical
calibration if the pressure axis available, otherwise usesnone
.
touch.pressure.scale
Definition: touch.pressure.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0 / raw.pressure.max
.
Calcolo
The calculation of the pressure
field depends on the specified calibration parameters.
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
orientation and tilt fields
The orientation
field describes the orientation of the touch and tool as an angular measurement. An orientation of 0
indicates that the major axis is oriented vertically, -PI/2
indicates that the major axis is oriented to the left, PI/2
indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range can be described in a full circle range from -PI
or PI
.
The tilt
field describes the inclination of the tool as an angular measurement. A tilt of 0
indicates that the tool is perpendicular to the surface. A tilt of PI/2
indicates that the tool is flat on the surface.
touch.orientation.calibration
Definition: touch.orientation.calibration
= none
| interpolated
| vector
| default
Specifies the kind of measurement used by the touch driver to report the orientation.
- If the value is
none
, the orientation is unknown so it is set to 0. - If the value is
interpolated
, the orientation is linearly interpolated such that a raw value ofraw.orientation.min
maps to-PI/2
and a raw value ofraw.orientation.max
maps toPI/2
. The center value of(raw.orientation.min + raw.orientation.max) / 2
maps to0
. - If the value is
vector
, the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric. - If the value is
default
, the system uses theinterpolated
calibration if the orientation axis available, otherwise usesnone
.
Calcolo
The calculation of the orientation
and tilt
fields depends on the specified calibration parameters and available input.
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
distance field
The distance
field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.
touch.distance.calibration
Definition: touch.distance.calibration
= none
| scaled
| default
Specifies the kind of measurement used by the touch driver to report the distance.
If the value is
none
, the distance is unknown so it is set to 0.If the value is
scaled
, the reported distance is multiplied by a constant scale factor.If the value is
default
, the system uses thescaled
calibration if the distance axis available, otherwise usesnone
.
touch.distance.scale
Definition: touch.distance.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
Calcolo
The calculation of the distance
field depends on the specified calibration parameters.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Esempio
# 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
Compatibility notes
The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.
Older touch device drivers might also need to be updated.
Virtual key map files
Touch devices can be used to implement virtual keys.
There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.
When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename>
as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely
.
A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.
In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION
).
Sintassi
A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.
Comment lines begin with '#' and continue to the end of the line.
Each virtual key is described by 6 colon-delimited components:
-
0x01
: A version code. Must always be0x01
. - <Linux key code>: The Linux key code of the virtual key.
- <centerX>: The X pixel coordinate of the center of the virtual key.
- <centerY>: The Y pixel coordinate of the center of the virtual key.
- <width>: The width of the virtual key in pixels.
- <height>: The height of the virtual key in pixels.
All coordinates and sizes are specified in terms of the display coordinate system.
Here is a virtual key map file all written on one line.
# 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
The same virtual key map file can also be written on multiple lines.
# 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
In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.
The first key has a Linux scan code of 158
( KEY_BACK
), centerX of 55
, centerY of 835
, width of 90
, and height of 55
.
Esempio
Virtual key map file: /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
Key layout file: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Key character map file: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Indirect multi-touch pointer gestures
In pointer mode, the system interprets the following gestures:
- Single finger tap: click.
- Single finger motion: move the pointer.
- Single finger motion plus button presses: drag the pointer.
- Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
- Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
- Multiple finger motion: freeform gesture.
Palm rejection
As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM
flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.
The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the display edge the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by touchMajor
and touchMinor
. The Android framework then removes the pointers that are marked as palms from the touch stream.
If a pointer was already sent to the apps, then the system either:
- (If there are other active pointers) Cancels the pointer with
ACTION_POINTER_UP
andFLAG_CANCELED
set. - (If this is the only pointer) Cancels the pointer with
ACTION_CANCEL
.
A public API, MotionEvent.FLAG_CANCELED
, indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL
and ACTION_POINTER_UP
.
If the palm pointer wasn't sent to apps, then the system simply drops the pointer.
Enable palm rejection
- In your touch driver, use the
input_abs_set_res
macro to set the resolutions for the following fields (units are pixels per mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Support for
ABS_MT_TOUCH_MINOR
is optional. However, if your device does support it, make sure the resolution is set correctly. -
- To confirm the fields are set correctly, run:
$ adb shell getevent -li
- To enable the feature during runtime, run:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Restart the
system_server
process.$ adb shell stop && adb shell start
- Confirm that
adb shell dumpsys input
shows that there are palm rejectors insideUnwantedInteractionBlocker
. If it doesn't, check the input-related logs to find clues on what might be misconfigured.See the following example for reference:
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: {} - To permanently enable the feature, add the corresponding sysprop command in your
init**rc
file:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1