Android supporta una varietà di touch screen e touch pad, inclusi i tablet digitalizzati 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 che non sono associati a un display come un tablet digitalizzatore. I touch pad vengono in genere 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 tattili a volte possono essere manipolati utilizzando una varietà di strumenti diversi come le dita o uno stilo a seconda della tecnologia del sensore tattile sottostante.
I dispositivi touch vengono talvolta utilizzati per implementare tasti virtuali. Ad esempio, su alcuni dispositivi Android, l'area del sensore del 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 fa affidamento su un gran numero di proprietà di configurazione per descrivere le caratteristiche e il comportamento desiderato di ciascun dispositivo.
Tocca Classificazione dispositivo
Un dispositivo di input è classificato come dispositivo multi-touch se sono soddisfatte 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 assi con codici che si sovrappongono a quelli degli assi MT.
Un dispositivo di input è classificato come dispositivo single-touch se sono soddisfatte entrambe le seguenti condizioni:
Il dispositivo di input non è classificato come dispositivo multi-touch. Un dispositivo di input è classificato come dispositivo single-touch o come dispositivo multi-touch, mai entrambi.
Il dispositivo di input segnala la presenza degli assi assoluti
ABS_X
eABS_Y
, e la presenza del codice tastoBTN_TOUCH
.
Una volta che un dispositivo di input è stato 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 alla sezione seguente sulla posizione e il formato dei file della mappa dei tasti virtuali.
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 sceglierà una configurazione predefinita appropriata per le tipiche periferiche tattili per uso generico come touch screen USB o Bluetooth HID o touch pad. Queste impostazioni predefinite non sono progettate per i touch screen integrati e molto probabilmente provocheranno un comportamento errato.
Dopo aver caricato la configurazione del dispositivo di input, il sistema classificherà il dispositivo di input come touch screen , touch pad o dispositivo puntatore .
Un dispositivo touch screen viene utilizzato per la manipolazione diretta degli oggetti sullo schermo. Dal momento che l'utente sta toccando direttamente lo schermo, il sistema non richiede ulteriori facilitazioni per indicare gli oggetti manipolati.
Un dispositivo touch pad viene utilizzato per fornire informazioni di posizionamento assoluto a un'applicazione 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 stilo, vengono interpretati utilizzando posizioni assolute.
Vedere Gesti del puntatore multi-touch indiretti per ulteriori informazioni.
Le seguenti regole vengono utilizzate per classificare il dispositivo di input come touch screen , touch pad o dispositivo puntatore .
Se la proprietà
touch.deviceType
è impostata, il tipo di dispositivo verrà 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 sarà impostato su touch screen . Questa condizione presuppone che i dispositivi touch con input diretto siano collegati a un display anch'esso connesso.Se il dispositivo di input segnala la presenza della proprietà di input
INPUT_PROP_POINTER
(tramite l'ioctlEVIOCGPROP
), il tipo di dispositivo verrà impostato su pointer .Se il dispositivo di input segnala la presenza degli assi relativi
REL_X
oREL_Y
, allora il tipo di dispositivo sarà impostato su touch pad . Questa condizione risolve un'ambiguità per i dispositivi di input costituiti sia da un mouse che da un touchpad. In questo caso, il touch pad non verrà utilizzato per controllare il puntatore perché il mouse lo controlla già.In caso contrario, il tipo di dispositivo verrà impostato su pointer . Questa impostazione predefinita garantisce che i touch pad che non sono stati designati per altri scopi speciali servano a controllare il puntatore.
Bottoni
I pulsanti sono controlli opzionali che possono essere utilizzati dalle applicazioni per eseguire funzioni aggiuntive. I pulsanti sui dispositivi tattili si comportano in modo simile ai pulsanti del mouse e sono utilizzati principalmente con dispositivi tattili di tipo puntatore o con uno stilo.
Sono supportati i seguenti pulsanti:
BTN_LEFT
: mappato aMotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: mappato suMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: mappato aMotionEvent.BUTTON_MIDDLE
.BTN_BACK
eBTN_SIDE
: mappato suMotionEvent.BUTTON_BACK
. La pressione di questo pulsante sintetizza anche la pressione di un tasto con il codice tastoKeyEvent.KEYCODE_BACK
.BTN_FORWARD
eBTN_EXTRA
: mappato aMotionEvent.BUTTON_FORWARD
. La pressione di questo pulsante sintetizza anche la pressione di un tasto con il codice tastoKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: mappato suMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: mappato aMotionEvent.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 aMotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
eMT_TOOL_PEN
: mappato suMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_RUBBER
: mappato aMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: mappato aMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: mappato aMotionEvent.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
: mappato suMotionEvent.TOOL_TYPE_FINGER
.
Passare il mouse contro Strumenti toccanti
Gli strumenti possono essere in contatto con il dispositivo touch o nel raggio d'azione e librarsi 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, possono spesso rilevare quando lo strumento si trova all'interno di un raggio limitato del digitalizzatore.
Il componente InputReader
si occupa di distinguere gli strumenti toccanti dagli strumenti sospesi. Allo stesso modo, gli strumenti toccanti e gli strumenti al passaggio del mouse vengono segnalati alle applicazioni in modi diversi.
Gli strumenti di tocco vengono segnalati alle applicazioni 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 di passaggio del mouse vengono segnalati alle applicazioni come eventi di movimento generici utilizzando MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
e MotionEvent.ACTION_HOVER_EXIT
.
Requisiti del driver del dispositivo touch
I driver dei dispositivi tattili devono registrare assi e codici chiave solo per gli assi e i pulsanti che effettivamente supportano. La registrazione di assi o codici chiave in eccesso può confondere l'algoritmo di classificazione del dispositivo o far sì che il sistema rilevi in modo errato le capacità del dispositivo.
Ad esempio, se il dispositivo riporta il codice chiave
BTN_TOUCH
, il sistema supporrà cheBTN_TOUCH
verrà sempre utilizzato per indicare se lo strumento sta effettivamente toccando lo schermo. Pertanto,BTN_TOUCH
non deve essere utilizzato per indicare che lo strumento si trova semplicemente nell'intervallo e si trova in bilico.I dispositivi single-touch utilizzano i seguenti eventi di input di Linux:
ABS_X
: (OBBLIGATORIO) Riporta la quota X dell'utensile.ABS_Y
: (OBBLIGATORIO) Riporta la quota Y dell'utensile.ABS_PRESSURE
: (opzionale) Riporta la pressione fisica applicata alla punta dell'utensile o l'intensità del segnale del contatto tattile.ABS_TOOL_WIDTH
: (opzionale) Riporta l'area della sezione trasversale o la larghezza del contatto tattile o dell'utensile stesso.ABS_DISTANCE
: (opzionale) Riporta la distanza dell'utensile dalla superficie del dispositivo touch.ABS_TILT_X
: (opzionale) Riporta l'inclinazione dell'utensile dalla superficie del dispositivo touch lungo l'asse X.ABS_TILT_Y
: (opzionale) Riporta l'inclinazione dell'utensile 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) Segnala gli stati del pulsante .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
: (opzionale) Segnala il tipo di strumento .
I dispositivi multi-touch utilizzano i seguenti eventi di input di Linux:
ABS_MT_POSITION_X
: (OBBLIGATORIO) Riporta la coordinata X dell'utensile.ABS_MT_POSITION_Y
: (OBBLIGATORIO) Riporta la coordinata Y dell'utensile.ABS_MT_PRESSURE
: (opzionale) Riporta la pressione fisica applicata alla punta dell'utensile o l'intensità 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 minore 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. Questo asse non deve essere utilizzato se le dimensioni dell'utensile stesso non sono note.ABS_MT_WIDTH_MINOR
: (opzionale) Riporta la lunghezza della dimensione minore 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 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 ogni dito deve 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 dall'intervallo.ABS_MT_SLOT
: (facoltativo) Riporta l'ID dello slot dello strumento, quando si utilizza il protocollo multi-touch di Linux 'B'. Fare riferimento alla documentazione del protocollo multi-touch di Linux per ulteriori 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) Segnala gli stati del pulsante .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
: (opzionale) Segnala il tipo di strumento .
Se sono definiti gli assi per entrambi i protocolli single-touch e multi-touch, verranno utilizzati solo gli assi multi-touch e gli assi single-touch verranno ignorati.
I valori minimo e massimo degli
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 copre effettivamente 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 del display in base al seguente calcolo:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Un touch screen può segnalare tocchi al di fuori dell'area attiva segnalata.
I tocchi che vengono avviati al di fuori dell'area attiva non vengono consegnati alle applicazioni ma possono essere utilizzati per i tasti virtuali.
I tocchi che vengono avviati all'interno dell'area attiva o che entrano ed escono dall'area di visualizzazione vengono consegnati alle applicazioni. Di conseguenza, se un tocco inizia all'interno dei limiti di un'applicazione e quindi si sposta all'esterno dell'area attiva, l'applicazione potrebbe ricevere eventi di tocco con coordinate di visualizzazione negative o oltre i limiti del display. Questo è il comportamento previsto.
Un dispositivo tattile non dovrebbe mai fissare le coordinate tattili ai limiti dell'area attiva. Se un tocco esce dall'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 sta toccando vicino all'angolo in alto a sinistra del touch screen, potrebbe riportare 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 il tocco del tutto. In altre parole, il touch screen non dovrebbe segnalare (minX, minY) quando il dito dell'utente sta realmente toccando al di fuori dell'area attiva.
Bloccare le coordinate tattili sul bordo del display crea un confine rigido artificiale attorno al bordo dello schermo che impedisce al sistema di tracciare senza problemi i 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 in caso contrario per indicare che lo strumento è in bilico.La segnalazione delle informazioni sulla pressione è facoltativa ma fortemente consigliata. Le applicazioni 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
devono essere diversi da zero quando lo strumento tocca il dispositivo e zero in caso contrario, ma non è necessario. Ad esempio, il dispositivo tattile potrebbe essere in grado di misurare la dimensione dei contatti tattili delle dita ma non i contatti tattili dello stilo.Le informazioni sulle dimensioni dei rapporti sono facoltative ma fortemente consigliate. Le applicazioni 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 l'utensile 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 stilo.
I valori riportati da
ABS_TILT_X
eABS_TILT_Y
dovrebbero essere zero quando l'utensile è perpendicolare al dispositivo. Un'inclinazione diversa da zero viene considerata come un'indicazione che l'utensile è tenuto inclinato.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 ogni asse. I valori inferiori al punto centrale rappresentano un'inclinazione verso l'alto o verso sinistra, i valori superiori al 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 che è compatibile con ciò che viene utilizzato per descrivere i tocchi delle dita.La segnalazione delle informazioni sull'inclinazione è facoltativa ma consigliata per i dispositivi stilo.
Se il tipo di strumento è riportato da
ABS_MT_TOOL_TYPE
, sostituirà qualsiasi informazione sul tipo di strumento riportata daBTN_TOOL_*
. Se non sono disponibili informazioni sul tipo di strumento, il tipo di strumento viene impostato per impostazione predefinita suMotionEvent.TOOL_TYPE_FINGER
.Uno strumento viene determinato come 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 l'
InputReader
deve avere almeno alcune informazioni sulla natura dello strumento, se sta toccando, o almeno il suo tipo di strumento. Se non sono disponibili informazioni, si presume 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 apparire nei rapporti di sincronizzazione, cessa di esistere.
Quando si utilizza il protocollo multi-touch 'B', lo strumento è attivo finché dispone di uno slot attivo. Quando lo slot è stato cancellato, lo strumento cessa di esistere.
Uno strumento è determinato a essere 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 riporta informazioni sulla pressione e la pressione riportata è zero, lo strumento è in bilico.
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.
InputReader
supporta entrambi i protocolli multi-touch 'A' e 'B'. I nuovi driver dovrebbero utilizzare il protocollo "B", ma entrambi funzioneranno.A partire da Android Ice Cream Sandwich 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 si alza), dovrebbe smettere di apparire nei successivi rapporti di sincronizzazione multi-touch. Quando tutti gli strumenti diventano inattivi (tutte le dita vanno "su"), 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 di Linux e non è più supportato.Le informazioni sulla dimensione del tocco devono essere riportate 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 di Linux e non è più supportato.
I driver dei dispositivi touch non necessitano più di personalizzazioni specifiche per Android. Facendo affidamento sul protocollo di input Linux standard, Android può supportare una più ampia varietà di periferiche touch, come i touch screen multi-touch HID esterni, utilizzando driver non modificati.
Funzionamento del dispositivo touch
Di seguito è riportato un breve riepilogo del funzionamento del dispositivo touch su Android.
EventHub
legge gli eventi non elaborati dal driverevdev
.InputReader
utilizza gli eventi non elaborati e aggiorna lo stato interno sulla posizione e altre caratteristiche di ogni strumento. Tiene traccia anche degli stati dei pulsanti.Se i pulsanti BACK o FORWARD sono stati premuti o rilasciati,
InputReader
notifica aInputDispatcher
l'evento chiave.InputReader
determina se si è verificata la pressione di un tasto virtuale. In tal caso, notifica aInputDispatcher
l'evento chiave.InputReader
determina se il tocco è stato avviato entro i limiti del display. In tal caso, notifica aInputDispatcher
l'evento touch.Se non sono presenti strumenti a sfioramento ma è presente almeno uno strumento al passaggio del mouse,
InputReader
notifica aInputDispatcher
l'evento al passaggio del mouse.Se il tipo di dispositivo tattile è pointer ,
InputReader
esegue il rilevamento del gesto del puntatore, sposta il puntatore e individua di conseguenza e notifica aInputDispatcher
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 applicazioni appropriate.
Tocca Configurazione dispositivo
Il comportamento del dispositivo tattile è 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 del dispositivo.
Fare riferimento alle seguenti sezioni per ulteriori 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 di dispositivo per i dispositivi touch spesso riportano le caratteristiche dei tocchi utilizzando unità specifiche del dispositivo.
Ad esempio, molti dispositivi tattili misurano l'area di contatto tattile utilizzando una scala interna specifica del dispositivo, come il numero totale di nodi del sensore che sono stati attivati dal tocco. Questo valore di dimensione non elaborato non sarebbe significativo per le applicazioni perché avrebbero bisogno di conoscere le dimensioni fisiche e 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 applicazioni possono comprendere.
Convenzioni sulla documentazione
A scopo di documentazione, utilizzeremo le seguenti convenzioni per descrivere i valori utilizzati dal sistema durante il processo di calibrazione.
Valori grezzi dell'asse
Le seguenti espressioni denotano i valori non elaborati 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
, 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 di assi grezzi
Le seguenti espressioni denotano i limiti dei valori grezzi. Si ottengono 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
- La precisione dell'asse grezzo. per esempio. fuzz = 1 implica che i valori sono accurati a +/- 1 unità.
-
raw.width
- La larghezza inclusiva 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 tattile nelle unità di output che verranno segnalate ad applicazioni come i pixel del display.
-
output.width
- La larghezza dell'output. Per i touch screen (associati a un display), questa è la larghezza del display in pixel. Per i touch pad (non associati a un display), la larghezza dell'output è uguale
raw.width
, a indicare che non verrà 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 dell'output è uguale
raw.height
, a indicare che non verrà 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 touch input mapper 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 generiche. Tutte le altre proprietà sono descritte nelle sezioni seguenti insieme ai campi che vengono 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 è un touch screen associato a un display.Se il valore è
touchPad
, il dispositivo tattile è un touchpad non associato a un display.Se il valore è
pointer
, il dispositivo tattile è un touchpad non associato a uno schermo e i suoi movimenti vengono utilizzati per i gesti del puntatore multi-touch indiretti .Se il valore è
default
, il sistema rileva automaticamente il tipo di dispositivo in base all'algoritmo di classificazione.
Fare riferimento alla sezione Classificazione per maggiori dettagli su come il tipo di dispositivo influenza il comportamento del dispositivo touch.
Prima di Honeycomb, si presumeva 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 del tocco riportate dal dispositivo tattile vengono ruotate ogni volta che cambia l'orientamento del display.Se il valore è
0
, le posizioni del tocco segnalate dal dispositivo tattile sono immuni alle modifiche dell'orientamento del display.
Il valore predefinito è 1
se il dispositivo è un touch screen, 0
altrimenti.
Il sistema distingue tra touch screen e display interni ed esterni. Un touch screen interno orientabile viene ruotato in base all'orientamento del display interno. Un touch screen esterno orientabile 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 il 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 viene segnalato come un tocco nell'angolo in alto a sinistra angolo del sistema di coordinate ruotato del display. Questo viene fatto in modo che i tocchi vengano segnalati con lo stesso sistema di coordinate utilizzato dalle applicazioni per disegnare i propri elementi visivi.
Prima di Honeycomb, si presumeva che tutti i dispositivi touch fossero in grado di riconoscere l'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 pointer .
Se il valore è
pointer
, i gesti del touchpad vengono presentati tramite un cursore simile a un puntatore del mouse.Se il valore è
spots
, i gesti del touchpad sono presentati da un'ancora che rappresenta il baricentro del gesto e da un insieme di spot 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 per il centro dell'area di contatto.
Calcolo
Il calcolo è semplice: le informazioni sulla posizione provenienti dal touch driver vengono interpolate linearmente al 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
, Size
campi
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 tattile 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ù corta dell'area di contatto. Quando è possibile misurare solo il diametro approssimativo dell'area di contatto, i campi TouchMajor
e TouchMinor
saranno uguali.
Allo stesso modo, il campo ToolMajor
specifica la dimensione più lunga e il campo ToolMinor
specifica la dimensione più corta dell'area della sezione trasversale dell'utensile.
Se la dimensione del tocco non è disponibile ma la dimensione dello strumento è disponibile, la dimensione dello strumento verrà impostata uguale alla dimensione del tocco. Al contrario, se la dimensione dello strumento non è disponibile ma la dimensione del tocco è disponibile, la dimensione del tocco verrà impostata uguale alla dimensione dello strumento.
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 rettangolo di delimitazione geometrico in unità di superficie.
touch.size.calibration
Definizione: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Specifica il tipo di misurazione utilizzata dal driver tattile per segnalare la dimensione del tocco e la dimensione dello strumento.
Se il valore è
none
, la dimensione è impostata su zero.Se il valore è
geometric
, si presume che la dimensione sia specificata nelle stesse unità di superficie della posizione, quindi viene ridimensionata nello stesso modo.Se il valore è
diameter
, si presume che la dimensione sia proporzionale al diametro (larghezza) del tocco o dell'utensile.Se il valore è
area
, si presume 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
.
touch.size.scale
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
.
touch.size.bias
Definizione: touch.size.bias
= <un numero in virgola mobile non negativo>
Specifica un valore di polarizzazione costante utilizzato nella calibrazione.
Il valore predefinito è 0.0
.
touch.size.isSummed
Definizione: touch.size.isSummed
= 0
| 1
Specifica se la dimensione viene riportata come somma delle dimensioni di tutti i contatti attivi o viene segnalata singolarmente per ogni contatto.
Se il valore è
1
, la dimensione segnalata verrà divisa per il numero di contatti prima dell'uso.Se il valore è
0
, la dimensione segnalata verrà utilizzata così com'è.
Il valore predefinito è 0
.
Alcuni dispositivi touch, in particolare i dispositivi "Semi-MT", non sono in grado di distinguere le singole dimensioni di più contatti, quindi riportano una misura della dimensione 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 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 Pressure
Il campo Pressure
descrive la pressione fisica approssimativa applicata al dispositivo tattile come valore normalizzato compreso tra 0,0 (nessun tocco) e 1,0 (piena forza).
Una pressione zero indica che lo strumento è sospeso.
touch.pressure.calibration
Definizione: touch.pressure.calibration
= none
| physical
| amplitude
| default
Specifica il tipo di misurazione utilizzata dal driver tattile per segnalare la pressione.
Se il valore è
none
, la pressione è sconosciuta, quindi è impostata su 1.0 al tocco e 0.0 al passaggio del mouse.Se il valore è
physical
, si presume che l'asse della pressione misuri l'effettiva intensità fisica della pressione applicata al 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
.
Calculation
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 may 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
.
Calculation
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
.
Calculation
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
Example
# 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 will 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 may also need to be updated.
Virtual Key Map Files
Touch devices are often 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
).
Syntax
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
.
Example
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 edge of the display 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