Android supporta una serie di touchscreen e touchpad, inclusi i tablet da disegno con stilo.
I touchscreen sono dispositivi touch associati a un display in modo che l'utente abbia l'impressione di manipolare direttamente gli elementi sullo schermo.
I touchpad sono dispositivi touch non associati a un display, come un tavoletta digitizer. I touch pad vengono in genere utilizzati per il puntamento, il posizionamento indiretto assoluto o il controllo basato su gesti di un'interfaccia utente.
I dispositivi touch possono avere pulsanti con funzioni simili a quelle dei pulsanti del mouse.
A volte i dispositivi touch possono essere manipolati utilizzando una serie di strumenti diversi, come le dita o uno stilo, a seconda della tecnologia del sensore touch sottostante.
A volte i dispositivi touch vengono utilizzati per implementare i tasti virtuali. Ad esempio, su alcuni dispositivi Android, l'area del sensore del touchscreen si estende oltre il bordo del display e ha un duplice scopo in quanto parte di un tastierino 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.
Classificazione dei dispositivi touch
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 segnalano assi con codici che si sovrappongono a quelli degli assi MT.
Un dispositivo di input è classificato come dispositivo a tocco singolo 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 chiaveBTN_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 virtuali, viene caricato anche il file del layout dei tasti per il dispositivo. Per informazioni su posizione e formato di questi file, consulta [File delle mappe dei tasti virtuali](#virtual-key-map-files).
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 di uso generale, come touchscreen o touchpad HID USB o Bluetooth esterni. Questi valori predefiniti non sono progettati per i touchscreen integrati e possono comportare un comportamento errato.
Dopo aver caricato la configurazione del dispositivo di input, il sistema lo classifica come touch screen, touchpad o cursore.
- Un dispositivo con touchscreen viene utilizzato per la manipolazione diretta degli oggetti sullo schermo. L'utente tocca direttamente lo schermo, pertanto il sistema non richiede funzionalità aggiuntive per indicare gli oggetti da manipolare.
- Un dispositivo touch pad viene utilizzato per fornire a un'app informazioni sul posizionamento assoluto relative ai tocchi su una determinata area del sensore. Può essere utile per i tablet da disegno.
- Un dispositivo cursore viene utilizzato per la manipolazione indiretta degli oggetti sullo schermo tramite un cursore. Le dita sono interpretate come gesti del puntatore multi-touch. Altri strumenti, come gli stilo, vengono interpretati utilizzando posizioni assolute. Per ulteriori informazioni, consulta la sezione Gesti indiretti del cursore multi-touch.
Le seguenti regole vengono utilizzate per classificare il dispositivo di input come touchscreen, touchpad o dispositivo di puntamento.
- Se la proprietà
touch.deviceType
è impostata, il tipo di dispositivo è impostato come indicato. - Se il dispositivo di input segnala la presenza della proprietà di input
INPUT_PROP_DIRECT
(tramite l'ioctlEVIOCGPROP
), il tipo di dispositivo è impostato su touchscreen. Questa condizione presuppone che i dispositivi touch con input diretto siano collegati a un display che è anche connesso. - 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
, il tipo di dispositivo è impostato su touchpad. Questa condizione risolve un'ambiguità per i dispositivi di input costituiti sia da un mouse sia da un touchpad. In questo caso, il touchpad non viene utilizzato per controllare il cursore perché è già controllato dal mouse. - In caso contrario, il tipo di dispositivo è impostato su cursor. Questa impostazione predefinita garantisce che i touchpad a cui non è stato assegnato alcun altro scopo speciale controllino il cursore.
Pulsanti
I pulsanti sono controlli facoltative 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 utili principalmente con dispositivi touch di tipo cursore o con un pennino.
Sono supportati i seguenti pulsanti:
BTN_LEFT
: mappato aMotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: mappato aMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: mappato aMotionEvent.BUTTON_MIDDLE
.BTN_BACK
eBTN_SIDE
: mappati aMotionEvent.BUTTON_BACK
. La pressione di questo pulsante sintetizza anche la pressione di un tasto con il codice tastoKeyEvent.KEYCODE_BACK
.BTN_FORWARD
eBTN_EXTRA
: mappati aMotionEvent.BUTTON_FORWARD
. La pressione di questo pulsante sintetizza anche la pressione di un tasto con il codice tastoKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: mappato aMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: mappato aMotionEvent.BUTTON_TERTIARY
.
Strumenti e tipi di strumenti
Uno strumento è un dito, uno stilo o un altro apparecchio 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 pointer.
Sono supportati i seguenti tipi di strumenti:
BTN_TOOL_FINGER
eMT_TOOL_FINGER
: mappati aMotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
eMT_TOOL_PEN
: mappati aMotionEvent.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 aMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: mappato aMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: mappato aMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
eBTN_TOOL_QUADTAP
: mappata aMotionEvent.TOOL_TYPE_FINGER
.
Strumenti di passaggio del mouse e tocco
Gli strumenti possono essere a contatto con il dispositivo touch o nel raggio d'azione e posizionarsi sopra il dispositivo. Non tutti i dispositivi touch possono rilevare la presenza di uno strumento visualizzato sopra il dispositivo. Quelli che lo fanno, come i digitizer a stilo basati su RF, spesso possono rilevare quando lo strumento si trova in un raggio limitato del digitizer.
Il componente InputReader
distingue gli strumenti di tocco dagli strumenti di passaggio del mouse. Analogamente, gli strumenti di tocco e 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 di 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
.
Requisiti del driver del dispositivo touch
- I driver dei dispositivi touch devono registrare solo gli assi e i codici a tasti per gli assi
e i pulsanti supportati. La registrazione di assi o codici chiave non supportati può confondere l'algoritmo di classificazione del dispositivo o causare il rilevamento errato delle funzionalità del dispositivo da parte del sistema. Ad esempio, se il dispositivo segnala il codice chiave
BTN_TOUCH
, il sistema presuppone cheBTN_TOUCH
venga sempre utilizzato per indicare se lo strumento tocca lo schermo. Pertanto,BTN_TOUCH
non deve essere utilizzato per indicare che lo strumento si trova semplicemente nell'intervallo e viene visualizzato in modalità di passaggio del mouse. - I dispositivi single-touch utilizzano i seguenti eventi di input Linux:
ABS_X
: (OBBLIGATORIO) indica la coordinata X dello strumento.ABS_Y
: (OBBLIGATORIO) indica la coordinata Y dello strumento.ABS_PRESSURE
: (facoltativo) indica la pressione fisica applicata alla punta dello strumento o l'intensità del segnale del contatto touch.ABS_TOOL_WIDTH
: (facoltativo) indica l'area della sezione trasversale o la larghezza del contatto con il tocco o dello strumento stesso.ABS_DISTANCE
: (facoltativo) indica la distanza dello strumento dalla superficie del dispositivo touch.ABS_TILT_X
: (facoltativo) indica l'inclinazione dello strumento rispetto alla superficie del dispositivo touch lungo l'asse X.ABS_TILT_Y
: (facoltativo) indica 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
: (facoltativo) Stati del pulsante Report.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) Indica il tipo di strumento.
- I dispositivi multi-touch utilizzano i seguenti eventi di input Linux:
ABS_MT_POSITION_X
: (OBBLIGATORIO) indica la coordinata X dello strumento.ABS_MT_POSITION_Y
: (OBBLIGATORIO) indica la coordinata Y dello strumento.ABS_MT_PRESSURE
: (facoltativo) indica la pressione fisica applicata alla punta dello strumento o l'intensità del segnale del contatto touch.ABS_MT_TOUCH_MAJOR
: (facoltativo) indica l'area della sezione trasversale del contatto con il tocco o la lunghezza della dimensione più lunga del contatto con il tocco.ABS_MT_TOUCH_MINOR
: (facoltativo) indica la lunghezza della dimensione più breve del contatto di tocco. Questo asse non deve essere utilizzato seABS_MT_TOUCH_MAJOR
riporta una misurazione dell'area.ABS_MT_WIDTH_MAJOR
: (facoltativo) indica l'area della sezione trasversale dello strumento stesso o la lunghezza della dimensione più lunga dello strumento stesso. Non utilizzare questo asse a meno che tu non conosca le dimensioni dello strumento stesso.ABS_MT_WIDTH_MINOR
: (facoltativo) indica la lunghezza della dimensione più breve dello strumento stesso. Questo asse non deve essere utilizzato seABS_MT_WIDTH_MAJOR
riporta una misurazione dell'area o se le dimensioni dello strumento stesso sono sconosciute.ABS_MT_ORIENTATION
: (facoltativo) indica l'orientamento dello strumento.ABS_MT_DISTANCE
: (facoltativo) indica la distanza dello strumento dalla superficie del dispositivo touch.ABS_MT_TOOL_TYPE
: (facoltativo) indica il tipo di strumento comeMT_TOOL_FINGER
oMT_TOOL_PEN
.ABS_MT_TRACKING_ID
: (facoltativo) indica l'ID monitoraggio dello strumento. L'ID monitoraggio è un numero intero non negativo arbitrario che viene utilizzato per identificare e monitorare 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 monitoraggio distinto, che verrà utilizzato finché il dito rimane in contatto. Gli ID monitoraggio possono essere riutilizzati quando gli strumenti associati non sono più nel raggio d'azione.ABS_MT_SLOT
: (facoltativo) segnala l'ID slot dello strumento, quando viene utilizzato il protocollo multi-touch Linux "B". Per ulteriori dettagli, consulta la documentazione del protocollo multi-touch Linux.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
: (facoltativo) Stati del pulsante Report.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) Indica il tipo di strumento.
- Se sono definiti gli assi sia per il protocollo single-touch sia per quello multi-touch, vengono utilizzati solo gli assi multi-touch e gli assi single-touch vengono 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 touchscreen, l'area attiva descrive la parte del dispositivo touch che copre effettivamente il display.Per un touchscreen, il sistema interpola automaticamente le posizioni tocco registrate in unità di superficie per ottenere le posizioni 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 touchscreen potrebbe registrare tocchi al di fuori dell'area attiva registrata.
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 all'interno degli intervalli di un'app e poi si sposta al di fuori dell'area attiva, l'app potrebbe ricevere eventi tocco con coordinate del display negative o oltre gli intervalli del display. Questo è un comportamento previsto.
Un dispositivo touch non deve mai bloccare le coordinate di tocco ai limiti dell'area attiva. Se un tocco esce dall'area attiva, deve essere segnalato come esterno all'area attiva o non deve essere segnalato affatto.
Ad esempio, se il dito dell'utente è vicino all'angolo in alto a sinistra del touchscreen, potrebbe essere registrata una coordinata (minX, minY). Se il dito continua a spostarsi ulteriormente all'esterno dell'area attiva, il touchscreen deve iniziare a registrare coordinate con componenti inferiori a minX e minY, ad esempio (minX - 2, minY - 3) oppure deve smettere di registrare il tocco del tutto. In altre parole, il touchscreen non deve registrare (minX, minY) quando il dito dell'utente tocca effettivamente al di fuori dell'area attiva.
Il blocco delle coordinate tocco al bordo del display crea un confine artificiale rigido intorno al bordo dello schermo che impedisce al sistema di monitorare senza problemi i movimenti che entrano o escono dai limiti dell'area di visualizzazione.
I valori segnalati da
ABS_PRESSURE
oABS_MT_PRESSURE
, se vengono segnalati, devono essere diversi da zero quando lo strumento tocca il dispositivo e zero in caso contrario per indicare che lo strumento è in stato di passaggio.La segnalazione delle informazioni sulla pressione è facoltativa, ma vivamente consigliata. 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
devono essere diversi da zero quando lo strumento tocca il dispositivo e zero in caso contrario, ma non è obbligatorio. Ad esempio, il dispositivo touch potrebbe essere in grado di misurare le dimensioni dei tocchi con il dito, ma non quelli con lo stilo.La generazione di report sulle informazioni sulle taglie è facoltativa, ma vivamente consigliata. Le app possono utilizzare le informazioni sulla pressione per implementare il disegno sensibile alle dimensioni e altri effetti.
I valori indicati 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 è a contatto diretto. I valori esatti registrati dipendono dalla modalità di misurazione della distanza da parte dell'hardware.La segnalazione delle informazioni sulla distanza è facoltativa, ma consigliata per i dispositivi con stilo.
I valori riportati da
ABS_TILT_X
eABS_TILT_Y
devono essere pari a zero quando lo strumento è perpendicolare al dispositivo. Un'inclinazione diversa da zero indica che lo strumento è tenuto inclinato.Si presume che gli angoli di inclinazione lungo gli assi X e Y siano specificati in gradi rispetto alla perpendicolare. Il punto centrale (perpendicolare perfetto) è dato da
(max + min) / 2
per ogni asse. I valori inferiori al punto centrale rappresentano un'inclinazione verso l'alto o verso sinistra, mentre 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 perpendiculare che va da 0 aPI / 2
radianti e un angolo di orientamento planare che va da-PI
aPI
radianti. Questa rappresentazione genera una descrizione dell'orientamento compatibile con quella utilizzata per descrivere i tocchi delle dita.La segnalazione delle informazioni sull'inclinazione è facoltativa, ma consigliata per i dispositivi stilo.
Se il tipo di strumento viene segnalato da
ABS_MT_TOOL_TYPE
, sostituisce le informazioni sul tipo di strumento segnalate daBTN_TOOL_*
. Se non sono disponibili informazioni sul tipo di strumento, il valore predefinito èMotionEvent.TOOL_TYPE_FINGER
.Uno strumento viene considerato attivo in base alle seguenti condizioni:
Quando utilizzi il protocollo a tocco singolo, lo strumento è attivo se
BTN_TOUCH
oBTN_TOOL_*
è 1.Questa condizione implica che
InputReader
debba avere almeno alcune informazioni sulla natura dello strumento, ad esempio se è in contatto o almeno il tipo di strumento. Se non sono disponibili informazioni, si presume che lo strumento sia inattivo (fuori intervallo).- Quando utilizzi il protocollo multi-touch "A", lo strumento è attivo ogni volta che viene visualizzato nel report di sincronizzazione più recente. Quando lo strumento smette di essere visualizzato nei report sulla sincronizzazione, non esiste più.
- Quando utilizzi il protocollo multi-touch "B", lo strumento è attivo finché ha uno slot attivo. Quando lo spazio viene cancellato, lo strumento non esiste più.
- Si considera che uno strumento sia in stato di passaggio del mouse in base alle seguenti condizioni:
- Se lo strumento è
BTN_TOOL_MOUSE
oBTN_TOOL_LENS
, significa che il passaggio del mouse non viene eseguito, anche se una delle seguenti condizioni è vera. - Se lo strumento è attivo e il driver segnala informazioni sulla pressione e la pressione segnalata è zero, lo strumento è in modalità di attesa.
- Se lo strumento è attivo, il driver supporta il codice chiave
BTN_TOUCH
e il valore diBTN_TOUCH
è zero, significa che passi il mouse sopra lo strumento.
- Se lo strumento è
InputReader
supporta i protocolli multi-touch "A" e "B". I nuovi driver dovrebbero usare il protocollo "B", ma entrambi funzionano.A partire da Android 4.0, potrebbe essere necessario modificare i driver del touchscreen per conformarsi alla specifica del protocollo di input di Linux.
Potrebbero essere necessarie le seguenti modifiche:
Quando uno strumento diventa inattivo (il dito si solleva), non dovrebbe più essere visualizzato nei report sulla sincronizzazione multi-touch successivi. Quando tutti gli strumenti diventano inattivi (tutte le dita sono "in alto"), il driver deve inviare un pacchetto di report di sincronizzazione vuoto, ad esempio
SYN_MT_REPORT
seguito daSYN_REPORT
.Le versioni precedenti di Android prevedevano la segnalazione di eventi "up" inviando un valore di pressione pari a 0. Il vecchio comportamento non era compatibile 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 registrate utilizzando
ABS_MT_PRESSURE
.Le versioni precedenti di Android recuperavano le informazioni sulla pressione da
ABS_MT_TOUCH_MAJOR
. Il vecchio comportamento non era compatibile con la specifica del protocollo di input di Linux e non è più supportato.- Le informazioni sulle dimensioni del tocco devono essere registrate utilizzando
ABS_MT_TOUCH_MAJOR
.Le versioni precedenti di Android recuperavano le informazioni sulle dimensioni da
ABS_MT_TOOL_MAJOR
. Il vecchio comportamento non era compatibile con la specifica del protocollo di input di Linux e non è più supportato.
Operazione con 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 relativo alla posizione e ad altre caratteristiche di ogni strumento. Monitora anche gli stati dei pulsanti.- Se INDIETRO o AVANTI è stato premuto o rilasciato,
InputReader
invia una notifica aInputDispatcher
sull'evento chiave. InputReader
determina se è avvenuta una pressione del tasto virtuale. In questo caso, invia aInputDispatcher
una notifica dell'evento chiave.InputReader
determina se il tocco è stato avviato all'interno dei confini del display. In questo caso, invia una notifica aInputDispatcher
sull'evento tocco.- Se non ci sono strumenti toccanti, ma è presente almeno uno strumento che appare quando passi il mouse sopra,
InputReader
avvisaInputDispatcher
dell'evento di passaggio del mouse. - Se il tipo di dispositivo tocco è cursore,
InputReader
esegue il rilevamento dei gesti del cursore, sposta il cursore e gli hotspot di conseguenza e invia una notifica aInputDispatcher
sull'evento del cursore. InputDispatcher
utilizzaWindowManagerPolicy
per determinare se gli eventi devono essere inviati e se devono riattivare il dispositivo. Quindi,InputDispatcher
invia gli eventi alle app appropriate.
Configurazione del dispositivo touch
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.
Per ulteriori dettagli sui file che partecipano alla configurazione della tastiera, consulta le sezioni seguenti:
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 segnalano le caratteristiche dei tocchi utilizzando unità specifiche del dispositivo.
Ad esempio, molti dispositivi touch misurano l'area di contatto del tocco utilizzando una scala interna specifica del dispositivo, ad esempio il numero totale di nodi del sensore attivati dal tocco. Questo valore di dimensione non elaborato non avrebbe significato per le app perché queste dovrebbero 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 registrati dal dispositivo touch in una rappresentazione standard più semplice che le app possono comprendere.
Convenzioni di documentazione
A scopo di documentazione, utilizziamo le seguenti convenzioni per descrivere i valori utilizzati dal sistema durante il processo di calibrazione.
Valori asse non elaborati
Le seguenti espressioni indicano i valori non elaborati registrati 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 dell'asse non elaborati
Le seguenti espressioni indicano i limiti dei valori non elaborati. Vengono ottenuti
chiamando ioctl EVIOCGABS
per ogni asse.
raw.*.min
- Il valore minimo incluso dell'asse non elaborato.
raw.*.max
- Il valore massimo dell'asse non elaborato, incluso.
raw.*.range
- Equivalente a
raw.*.max - raw.*.min
. raw.*.fuzz
- L'accuratezza dell'asse non elaborato. Ad es. fuzz = 1 implica che i valori sono precisi con un'approssimazione di +/- 1 unità.
raw.width
- La larghezza inclusiva dell'area tocco, equivalente a
raw.x.range + 1
. raw.height
- L'altezza inclusiva dell'area tocco, equivalente a
raw.y.range + 1
.
Intervalli di output
Le seguenti espressioni indicano 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 riportate alle app, come i pixel del display.
output.width
- La larghezza dell'output. Per i touchscreen (associati a un display), si tratta della larghezza del display in pixel. Per i touchpad (non associati a un display), la larghezza in uscita è pari a
raw.width
, a indicare che non viene eseguita alcuna interpolazione. output.height
- L'altezza dell'output. Per i touch screen (associati a un display), si tratta dell'altezza del display in pixel. Per i touchpad (non associati a un display),
l'altezza in uscita è pari a
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 Mapper input tocco utilizza molte proprietà di configurazione nel file di configurazione del dispositivo di input per specificare i valori di calibrazione. La seguente tabella descrive alcune proprietà di configurazione per uso generico. Tutte le altre proprietà sono descritte nelle sezioni seguenti, insieme ai campi utilizzati per la calibrazione.
touch.deviceType
Definizione: touch.deviceType
= touchScreen
|
touchPad
| pointer
| default
Consente di specificare il tipo di dispositivo touch.
-
Se il valore è
touchScreen
, il dispositivo touch è un touchscreen associato a un display. -
Se il valore è
touchPad
, il dispositivo tocco è un touchpad non associato a un display. -
Se il valore è
pointer
, il dispositivo touch è un touchpad non associato a un display e i relativi movimenti vengono utilizzati per gesti del cursore multi-touch indiretti. -
Se il valore è
default
, il sistema rileva automaticamente il tipo di dispositivo in base all'algoritmo di classificazione.
Per ulteriori dettagli su come il tipo di dispositivo influisce sul comportamento del dispositivo touch, consulta la sezione Classificazione.
In Android 3 e versioni precedenti, si presumeva che tutti i dispositivi touch fossero touchscreen.
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 tocco registrate dal dispositivo touch vengono ruotate ogni volta che cambia l'orientamento del display. -
Se il valore è
0
, le posizioni touch riportate dal dispositivo touch non sono soggette a cambiamenti di orientamento del display.
Il valore predefinito è 1
se il dispositivo è un touchscreen, 0
altrimenti.
Il sistema distingue tra display e touchscreen interni ed esterni. Un touch screen interno sensibile all'orientamento viene ruotato in base all'orientamento del display interno. Uno schermo touch esterno sensibile all'orientamento viene ruotato in base all'orientamento del display esterno.
La rilevazione dell'orientamento viene utilizzata per supportare la rotazione dei touchscreen 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 che un tocco nell'angolo in alto a sinistra del sistema di coordinate assoluto del touchscreen venga segnalato come un tocco nell'angolo in alto a sinistra del sistema di coordinate ruotato del display. Questo avviene in modo che i tocchi vengano segnalati con lo stesso sistema di coordinate utilizzato dalle app per disegnare i loro elementi visivi.
Prima di Honeycomb, si presumeva che tutti i dispositivi touch fossero sensibili all'orientamento.
tocco.gestureMode
Definizione: touch.gestureMode
= pointer
| spots
|
default
Specifica la modalità di presentazione per i gesti del cursore. Questa proprietà di configurazione è pertinente solo quando il dispositivo touch è di tipo pointer.
-
Se il valore è
pointer
, i gesti del touchpad vengono visualizzati tramite un cursore simile al cursore del mouse. -
Se il valore è
spots
, i gesti del touchpad sono rappresentati da un'ancora che rappresenta il centro di massa del gesto e da un insieme di punti circolari che rappresentano la posizione dei singoli dita.
Il valore predefinito è pointer
se la proprietà di input INPUT_PROP_SEMI_MT
è impostata o spots
in caso contrario.
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 del driver tocco vengono interpolate in modo lineare 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, dimensione dei 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 in unità di output (pixel).
Il campo size
descrive le dimensioni normalizzate del tocco rispetto al tocco più grande possibile che il dispositivo touch può rilevare. La dimensione normalizzata minima possibile è 0,0 (nessun contatto o non è misurabile), mentre la dimensione normalizzata massima possibile è 1,0 (l'area del sensore è satura).
Quando è possibile misurare sia la lunghezza che l'ampiezza approssimativa, il campo touchMajor
specifica la dimensione più lunga, mentre 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
sono uguali.
Analogamente, il campo toolMajor
specifica la dimensione più lunga e il campo
toolMinor
specifica la dimensione più corta dell'area della sezione trasversale dello strumento.
Se le dimensioni del tocco non sono disponibili, ma sono disponibili le dimensioni dello strumento, queste ultime vengono impostate come uguali alle dimensioni del tocco. Al contrario, se le dimensioni dello strumento non sono disponibili, ma sono disponibili le dimensioni del tocco, le dimensioni del tocco sono impostate in modo uguale a quelle dello strumento.
I dispositivi touch misurano o segnalano le dimensioni del tocco e dello strumento in vari modi. L'implementazione attuale supporta tre diversi tipi di misurazioni: diametro, area e area delimitata geometrica in unità di superficie.
Definizione: touch.size.calibration
= none
|
geometric
| diameter
| area
| default
Specifica il tipo di misurazione utilizzato dal driver tocco per segnalare le dimensioni del tocco e dello strumento.
-
Se il valore è
none
, la dimensione è impostata su zero. -
Se il valore è
geometric
, si presume che le dimensioni siano specificate nelle stesse unità di misura della superficie della posizione, quindi vengono ridimensionate nello stesso modo. -
Se il valore è
diameter
, si presume che le dimensioni siano proporzionali al diametro (larghezza) del tocco o dello strumento. -
Se il valore è
area
, si presume che le dimensioni siano proporzionali all'area del tocco o dello strumento. -
Se il valore è
default
, il sistema utilizza la calibrazionegeometric
se l'asseraw.touchMajor
oraw.toolMajor
è disponibile, 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 a 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 registrata come somma delle dimensioni di tutti i contatti attivi o se viene registrata singolarmente per ogni contatto.
-
Se il valore è
1
, le dimensioni registrate vengono divise per il numero di contatti prima dell'utilizzo. -
Se il valore è
0
, le dimensioni registrate vengono utilizzate così come sono.
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, pertanto registrano una misurazione delle dimensioni che rappresenta la loro area o larghezza totale. Questa proprietà deve essere impostata su
1
solo per questi dispositivi. In caso di dubbi, 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 lo strumento è in stato di attesa.
touch.pressure.calibration
Definizione: touch.pressure.calibration
= none
|
physical
| amplitude
| default
Specifica il tipo di misurazione utilizzata dal driver tocco per segnalare la pressione.
-
Se il valore è
none
, la pressione è sconosciuta, quindi viene impostata su 1,0 quando si tocca e su 0,0 quando si passa il mouse sopra. -
Se il valore è
physical
, si presume che l'asse di pressione misuri l'intensità fisica effettiva della pressione applicata al touchpad. -
Se il valore è
amplitude
, si presume che l'asse di pressione misuri l'ampiezza del segnale, correlata alle dimensioni del contatto e alla pressione applicata. -
Se il valore è
default
, il sistema utilizza la calibrazionephysical
se l'asse di pressione è disponibile, altrimenti utilizzanone
.
touch.pressure.scale
Definizione: touch.pressure.scale
= <un numero in virgola mobile 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 tocco e dello strumento come
misurazione angolare. Un orientamento di 0
indica che l'asse maggiore è rivolto verso l'alto, -PI/2
indica che l'asse maggiore è rivolto a sinistra, mentre PI/2
indica che l'asse maggiore è rivolto a destra. Quando è presente uno strumento come lo stilo, l'intervallo di orientamento può essere descritto in un intervallo di un cerchio completo da -PI
o PI
.
Il campo tilt
descrive l'inclinazione dello strumento come misura angolare.
Un'inclinazione di 0
indica che lo strumento è perpendicolare alla superficie.
Un'inclinazione di PI/2
indica che lo strumento è a contatto con la superficie.
touch.orientation.calibration
Definizione: touch.orientation.calibration
= none
|
interpolated
| vector
| default
Specifica il tipo di misurazione usato dal driver touch per segnalare l'orientamento.
- Se il valore è
none
, l'orientamento è sconosciuto, quindi è impostato su 0. - Se il valore è
interpolated
, l'orientamento viene interpolato linearmente in modo che un valore non elaborato diraw.orientation.min
venga mappato a-PI/2
e un valore non elaborato diraw.orientation.max
venga mappato aPI/2
. Il valore centrale di(raw.orientation.min + raw.orientation.max) / 2
corrisponde a0
. - Se il valore è
vector
, l'orientamento viene interpretato come un vettore pacchettizzato costituito da due campi a 4 bit con segno. Questa rappresentazione viene utilizzata per le parti del protocollo basato su oggetti Atmel. Una volta decodificato, il vettore genera un angolo di orientamento e un'ampiezza di confidenza. L'entità dell'intervallo di confidenza viene utilizzata per scalare le informazioni sulle dimensioni, a meno che non sia geometrica. - Se il valore è
default
, il sistema utilizza la calibrazioneinterpolated
se è disponibile l'asse di orientamento, altrimenti utilizzanone
.
Calcolo
Il calcolo dei campi orientation
e tilt
dipende dai parametri di calibrazione specificati e dagli input 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 distanza
Il campo distance
descrive la distanza tra lo strumento e la superficie del dispositivo touch. Un valore pari a 0,0 indica il contatto diretto, mentre valori più elevati indicano una distanza crescente dalla superficie.
touch.distance.calibration
Definizione: touch.distance.calibration
= none
|
scaled
| default
Specifica il tipo di misurazione utilizzata dal driver tocco per segnalare la distanza.
-
Se il valore è
none
, la distanza è sconosciuta, quindi è impostata su 0. -
Se il valore è
scaled
, la distanza registrata viene moltiplicata per un coefficiente di scala costante. -
Se il valore è
default
, il sistema utilizza la calibrazionescaled
se è disponibile l'asse della distanza, altrimenti utilizzanone
.
touch.distance.scale
Definizione: touch.distance.scale
= <un numero a virgola mobile 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 sulla 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 dei dispositivi di input per i dispositivi touch devono essere aggiornati per utilizzare le nuove proprietà di configurazione.
Anche i driver dei dispositivi touch meno recenti potrebbero dover essere aggiornati.
File della mappa chiavi virtuale
I dispositivi touch possono essere utilizzati per implementare i tasti virtuali.
Esistono diversi modi per farlo, a seconda delle funzionalità del controller touch. Alcuni controller touch possono essere configurati direttamente per implementare i tasti virtuali impostando i registri del firmware. Altre volte è preferibile eseguire la mappatura dalle coordinate del tocco ai codici a tasti nel software.
Quando i tasti virtuali sono implementati in software, il kernel deve esportare un file di mappatura dei tasti virtuali chiamato virtualkeys.<devicename>
come proprietà della scheda. Ad esempio, se i driver del dispositivo touchscreen riportano il nome "touchyfeely", il file della mappa dei tasti virtuali deve avere il percorso/sys/board_properties/virtualkeys.touchyfeely
.
Un file di mappatura delle chiavi virtuali descrive le coordinate e i codici tasti Linux delle chiavi virtuali sul touchscreen.
Oltre al file di mappatura dei tasti virtuali, devono essere presenti un file di layout dei tasti corrispondente e un file di mappatura dei caratteri dei tasti per mappare i codici dei tasti Linux ai codici dei tasti Android e per specificare il tipo di dispositivo tastiera (di solito SPECIAL_FUNCTION
).
Sintassi
Un file di mappatura delle chiavi virtuali è un file di testo normale costituito da una sequenza di descrizioni del layout delle chiavi virtuali separate da interruzioni di riga o da due punti.
Le righe di commento iniziano con "#" e continuano fino alla fine della riga.
Ogni chiave virtuale è descritta da sei componenti delimitati da due punti:
0x01
: un codice versione. Deve essere sempre0x01
.- <Linux key code>: il codice chiave Linux della chiave virtuale.
- <centerX>: la coordinata X in pixel del centro della chiave virtuale.
- <centerY>: la coordinata in pixel Y del centro della chiave virtuale.
- <width>: la larghezza del tasto virtuale in pixel.
- <height>: l'altezza della chiave virtuale in pixel.
Tutte le coordinate e le dimensioni sono specificate nei termini del sistema di coordinate di visualizzazione.
Ecco un file di mappa delle chiavi virtuali scritto su una sola 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 mappatura delle chiavi virtuali può essere scritto anche 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 precedente, il touchscreen ha una risoluzione di 480 x 800. Di conseguenza, tutte le chiavi virtuali hanno una coordinata <centerY> pari a 835, che è leggermente al di sotto dell'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 mappa delle chiavi virtuali: /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 del layout delle chiavi: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
File della mappa dei caratteri principali: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Gesti del cursore multi-touch indiretti
In modalità puntatore, il sistema interpreta i seguenti gesti:
- Tocca con un dito: fai clic.
- Movimento con un dito: sposta il puntatore.
- Movimento di un dito più pressioni di pulsanti: trascina il puntatore.
- Movimento con due dita che si spostano nella stessa direzione: trascina l'area sotto il puntatore in quella direzione. Il cursore stesso non si sposta.
- Movimento di due dita che si avvicinano o si allontanano in direzioni diverse: scorri/modifica la scala/ruota l'area intorno al cursore. Il cursore stesso non si sposta.
- Movimento con più dita: gesto libero.
Rifiuto della palma
A partire da Android 13, il sistema può rifiutare automaticamente gli input delle palme
quando il framework integrato è attivato. Le soluzioni interne, personalizzate sono ancora supportate,
ma 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 sui gesti, il cursore corrente e i cursori circostanti, quindi prende in considerazione la distanza dei tocchi dal bordo del display.
Poi determina, su base cursore, quali sono le palme. Inoltre, vengono prese in considerazione le dimensioni di ciascun contatto, come indicato da touchMajor
e
touchMinor
. Il framework Android rimuove quindi gli indicatori contrassegnati come
palme dallo stream di tocco.
Se un cursore è già stato inviato alle app, il sistema:
- (Se sono presenti altri cursori attivi) Annulla il cursore con
ACTION_POINTER_UP
eFLAG_CANCELED
impostati. - (Se questo è l'unico puntatore) Annulla il puntatore con
ACTION_CANCEL
.
Un'API pubblica, MotionEvent.FLAG_CANCELED
, indica che l'evento corrente
non deve attivare l'azione dell'utente. Questo flag è impostato sia per ACTION_CANCEL
sia per ACTION_POINTER_UP
.
Se il puntatore del palmo non è stato inviato alle app, il sistema semplicemente rilascia l'indicatore.
Attiva il rifiuto della palma
- Nel driver touch, utilizza 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 di
ABS_MT_TOUCH_MINOR
è facoltativo. Tuttavia, se il tuo dispositivo supporta questa funzionalità, assicurati che la risoluzione sia impostata correttamente. - Per verificare che i campi siano impostati correttamente, esegui:
$ adb shell getevent -li
- Per attivare la funzionalità durante il runtime, esegui:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Riavvia il processo
system_server
.$ adb shell stop && adb shell start
- Verifica che
adb shell dumpsys input
mostri che all'interno diUnwantedInteractionBlocker
sono presenti dei sensori di rifiuto del palmo. In caso contrario, controlla i log relativi all'input per trovare tracce su ciò che potrebbe essere configurato in modo errato.Vedi l'esempio seguente come 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 attivare definitivamente la funzionalità, aggiungi il comando sysprop corrispondente nel
file
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1