Android supporta una varietà di touch screen e touchpad, tra cui tavolette grafiche con stilo.
I touch screen 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, ad esempio una tavoletta grafica. I touchpad vengono solitamente utilizzati per il puntamento o per 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.
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 una duplice funzione come parte di un tastierino sensibile al tocco.
A causa della grande varietà di dispositivi touch, Android si basa su un numero elevato di proprietà di configurazione per descrivere le caratteristiche e il comportamento desiderato di ogni 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_XeABS_MT_POSITION_Y. - Il dispositivo di input non dispone di 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 single-touch se sono soddisfatte entrambe le seguenti condizioni:
- Il dispositivo di input non è classificato come dispositivo multi-touch. Un dispositivo di input viene classificato come dispositivo single-touch o multi-touch, mai entrambi.
- Il dispositivo di input segnala la presenza degli assi assoluti
ABS_XeABS_Ye la presenza del codice tastoBTN_TOUCH.
Quando un dispositivo di input è classificato come dispositivo touch, la presenza di tasti virtuali viene determinata tentando di caricare il file della mappa dei tasti virtuali per il dispositivo. Se è disponibile una mappa dei tasti virtuali, viene caricato anche il file di layout dei tasti per il dispositivo. Per informazioni sulla posizione e sul formato di questi file, consulta [File di mappa 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 dei dispositivi di input. Se non è presente alcun file di configurazione del dispositivo di input, il sistema sceglie una configurazione predefinita appropriata per le periferiche touch generiche, come touch screen o touchpad HID USB o Bluetooth esterni. Queste impostazioni predefinite non sono progettate per i touch screen integrati e possono causare un comportamento errato.
Dopo aver caricato la configurazione del dispositivo di input, il sistema lo classifica come touch screen, touchpad o dispositivo di puntamento.
- Un dispositivo touch screen viene utilizzato per la manipolazione diretta degli oggetti sullo schermo. L'utente tocca direttamente lo schermo, quindi il sistema non richiede affordance aggiuntive per indicare gli oggetti manipolati.
- Un dispositivo touchpad viene utilizzato per fornire informazioni di posizionamento assoluto a un'app sui tocchi in un'area del sensore specifica. Può essere utile per le tavolette digitalizzatrici.
- Un dispositivo di puntamento viene utilizzato per la manipolazione indiretta degli oggetti sullo schermo tramite un cursore. Le dita vengono interpretate come gesti del puntatore multi-touch. Altri strumenti, come gli stilo, vengono interpretati utilizzando posizioni assolute. Per saperne di più, consulta Gesti con puntatore multi-touch indiretto.
Le seguenti regole vengono utilizzate per classificare il dispositivo di input come touch screen, touchpad o dispositivo di puntamento.
- Se la proprietà
touch.deviceTypeè impostata, il tipo di dispositivo viene impostato come indicato. - Se il dispositivo di input segnala la presenza della proprietà di input
INPUT_PROP_DIRECT(tramite ioctlEVIOCGPROP), il tipo di dispositivo viene 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 ioctlEVIOCGPROP), il tipo di dispositivo viene impostato su pointer. - Se il dispositivo di input segnala la presenza degli assi relativi
REL_XoREL_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 puntatore perché è già controllato dal mouse. - In caso contrario, il tipo di dispositivo è impostato su pointer. Questa impostazione predefinita garantisce che i touchpad a cui non è stato assegnato un altro scopo speciale controllino il puntatore.
Pulsanti
I pulsanti sono controlli facoltativi che le app possono utilizzare per eseguire funzioni aggiuntive. I pulsanti sui dispositivi touch si comportano in modo simile ai pulsanti del mouse e vengono utilizzati principalmente con dispositivi touch di tipo puntatore o con uno stilo.
Sono supportati i seguenti pulsanti:
BTN_LEFT: mappato aMotionEvent.BUTTON_PRIMARY.BTN_RIGHT: mappato aMotionEvent.BUTTON_SECONDARY.BTN_MIDDLE: mappato aMotionEvent.BUTTON_MIDDLE.BTN_BACKeBTN_SIDE: mappati aMotionEvent.BUTTON_BACK. La pressione di questo pulsante simula anche la pressione di un tasto con il codice tastoKeyEvent.KEYCODE_BACK.BTN_FORWARDeBTN_EXTRA: mappati aMotionEvent.BUTTON_FORWARD. La pressione di questo pulsante simula anche la pressione di un tasto con il codiceKeyEvent.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 dispositivo utilizzato per interagire con il dispositivo touch. Alcuni dispositivi touch possono distinguere tra diversi tipi di strumenti.
In altre parti di Android, come nell'API MotionEvent, uno strumento viene spesso definito puntatore.
Sono supportati i seguenti tipi di strumenti:
BTN_TOOL_FINGEReMT_TOOL_FINGER: mappati aMotionEvent.TOOL_TYPE_FINGER.BTN_TOOL_PENeMT_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_TRIPLETAPeBTN_TOOL_QUADTAP: mappati aMotionEvent.TOOL_TYPE_FINGER.
Passaggio del mouse e tocco degli strumenti
Gli strumenti possono essere a contatto con il dispositivo touch o nel raggio d'azione e sospesi sopra di esso. Non tutti i dispositivi touch sono in grado di rilevare la presenza di uno strumento che passa sopra il dispositivo touch. Quelli che lo fanno, come i digitalizzatori di stilo basati su RF, spesso possono rilevare quando lo strumento si trova entro un intervallo limitato del digitalizzatore.
Il componente InputReader distingue gli strumenti di tocco da quelli 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 touch 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 dei driver dei dispositivi touch
- I driver dei dispositivi touch devono registrare solo gli assi e i codici tasto per gli assi e i pulsanti supportati. La registrazione di assi o codici tasto 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 tasto
BTN_TOUCH, il sistema presuppone cheBTN_TOUCHvenga sempre utilizzato per indicare se lo strumento tocca lo schermo. Pertanto,BTN_TOUCHnon deve essere utilizzato per indicare che lo strumento si trova semplicemente nell'intervallo e sta passando il mouse sopra. - 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) segnala 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 o dello strumento stesso.ABS_DISTANCEABS_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 rispetto alla 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) Segnala gli stati dei pulsanti.BTN_TOOL_FINGER,BTN_TOOL_PEN,BTN_TOOL_RUBBER,BTN_TOOL_BRUSH,BTN_TOOL_PENCIL,BTN_TOOL_AIRBRUSH,BTN_TOOL_MOUSE,BTN_TOOL_LENS,BTN_TOOL_DOUBLETAP,BTN_TOOL_TRIPLETAP,BTN_TOOL_QUADTAP: (facoltativo) Segnala 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: (opzionale) Segnala 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: (facoltativo) indica la lunghezza della dimensione più corta del contatto touch. Questo asse non deve essere utilizzato seABS_MT_TOUCH_MAJORsegnala 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 non conosci le dimensioni dello strumento stesso.ABS_MT_WIDTH_MINOR: (facoltativo) indica la lunghezza della dimensione più corta dello strumento stesso. Questo asse non deve essere utilizzato seABS_MT_WIDTH_MAJORsegnala 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: (opzionale) Riporta la distanza dello strumento dalla superficie del dispositivo touch.ABS_MT_TOOL_TYPE: (opzionale) Segnala il tipo di strumento comeMT_TOOL_FINGERoMT_TOOL_PEN.ABS_MT_TRACKING_ID: (facoltativo) segnala l'ID monitoraggio dello strumento. L'ID monitoraggio è un numero intero non negativo arbitrario 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 monitoraggio distinto che viene utilizzato finché il dito rimane a contatto. Gli ID monitoraggio possono essere riutilizzati quando gli strumenti associati escono dal raggio d'azione.ABS_MT_SLOT: (facoltativo) segnala l'ID slot dello strumento quando utilizzi il protocollo multi-touch Linux "B". Per ulteriori dettagli, consulta la documentazione del protocollo multi-touch di 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) Segnala gli stati dei pulsanti.BTN_TOOL_FINGER,BTN_TOOL_PEN,BTN_TOOL_RUBBER,BTN_TOOL_BRUSH,BTN_TOOL_PENCIL,BTN_TOOL_AIRBRUSH,BTN_TOOL_MOUSE,BTN_TOOL_LENS,BTN_TOOL_DOUBLETAP,BTN_TOOL_TRIPLETAP,BTN_TOOL_QUADTAP: (facoltativo) Segnala il tipo di strumento.
- Se sono definiti gli assi per i protocolli single-touch e multi-touch, vengono utilizzati solo gli assi multi-touch e quelli single-touch vengono ignorati.
I valori minimo e massimo degli assi
ABS_X,ABS_Y,ABS_MT_POSITION_XeABS_MT_POSITION_Ydefiniscono 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 di tocco segnalate nelle unità di superficie per ottenere le posizioni di tocco nei 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 potrebbe segnalare tocchi al di fuori dell'area attiva segnalata.
I tocchi avviati al di fuori dell'area attiva non vengono inviati alle app, ma possono essere utilizzati per i tasti virtuali.
I tocchi avviati all'interno dell'area attiva o che entrano ed escono dall'area di visualizzazione vengono inviati alle app. Di conseguenza, se un tocco inizia entro i limiti di un'app e poi si sposta al di fuori dell'area attiva, l'app potrebbe ricevere eventi touch con coordinate di visualizzazione negative o oltre i limiti 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 tocca vicino all'angolo in alto a sinistra del touch screen, potrebbe essere indicata una coordinata (minX, minY). Se il dito continua a spostarsi ulteriormente al di fuori dell'area attiva, il touch screen deve iniziare a segnalare le coordinate con componenti inferiori a minX e minY, ad esempio (minX - 2, minY - 3), oppure deve interrompere del tutto la segnalazione del tocco. In altre parole, il touch screen non deve segnalare (minX, minY) quando il dito dell'utente tocca effettivamente l'esterno dell'area attiva.
Il blocco delle coordinate di tocco sul bordo del display crea un confine artificiale rigido attorno al bordo dello schermo che impedisce al sistema di monitorare in modo fluido i movimenti che entrano o escono dai limiti dell'area di visualizzazione.
I valori indicati da
ABS_PRESSUREoABS_MT_PRESSURE, se indicati, devono essere diversi da zero quando lo strumento tocca il dispositivo e pari a zero negli altri casi per indicare che lo strumento è in modalità di passaggio del mouse.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_MAJORoABS_MT_WIDTH_MINORdevono 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 contatti touch con le dita, ma non con lo stilo.La segnalazione delle informazioni sulle taglie è facoltativa, ma vivamente consigliata. Le app possono utilizzare le informazioni sulla pressione per implementare disegni sensibili alle dimensioni e altri effetti.
I valori riportati da
ABS_DISTANCEoABS_MT_DISTANCEdovrebbero avvicinarsi allo zero quando lo strumento tocca il dispositivo. La distanza può rimanere diversa da zero anche quando lo strumento è a contatto diretto. I valori esatti riportati dipendono dal modo in cui l'hardware misura la distanza.La segnalazione delle informazioni sulla distanza è facoltativa, ma consigliata per i dispositivi con stilo.
I valori riportati da
ABS_TILT_XeABS_TILT_Ydevono 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 (perfettamente perpendicolare) è dato da
(max + min) / 2per 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.InputReaderconverte i componenti di inclinazione X e Y in un angolo di inclinazione perpendicolare compreso tra 0 ePI / 2radianti e un angolo di orientamento planare compreso tra-PIePIradianti. Questa rappresentazione genera una descrizione dell'orientamento compatibile con quella utilizzata per descrivere i tocchi con le dita.La segnalazione delle informazioni sull'inclinazione è facoltativa, ma consigliata per i dispositivi con stilo.
Se il tipo di strumento viene segnalato da
ABS_MT_TOOL_TYPE, sostituisce qualsiasi informazione sul tipo di strumento segnalata daBTN_TOOL_*. Se non sono disponibili informazioni sul tipo di strumento, il tipo di strumento predefinito èMotionEvent.TOOL_TYPE_FINGER.Uno strumento viene considerato attivo in base alle seguenti condizioni:
Quando utilizzi il protocollo single-touch, lo strumento è attivo se
BTN_TOUCHoBTN_TOOL_*è 1.Questa condizione implica che
InputReaderdeve avere almeno alcune informazioni sulla natura dello strumento, ovvero se sta toccando o almeno il tipo di strumento. Se non sono disponibili informazioni, si presume che lo strumento sia inattivo (fuori intervallo).- Quando si utilizza il protocollo multi-touch "A", lo strumento è attivo ogni volta che viene visualizzato nel report di sincronizzazione più recente. Quando lo strumento non viene più visualizzato nei report di sincronizzazione, cessa di esistere.
- Quando si utilizza il protocollo multi-touch "B", lo strumento è attivo finché ha uno slot attivo. Quando lo slot viene cancellato, lo strumento cessa di esistere.
- Un utensile viene considerato in modalità di passaggio del mouse in base alle seguenti condizioni:
- Se lo strumento è
BTN_TOOL_MOUSEoBTN_TOOL_LENS, non è in modalità di passaggio del mouse, anche se una delle seguenti condizioni è vera. - Se lo strumento è attivo e il driver segnala informazioni sulla pressione e la pressione segnalata è pari a zero, lo strumento è in modalità di passaggio del mouse.
- Se lo strumento è attivo e il driver supporta il codice tasto
BTN_TOUCHeBTN_TOUCHha un valore pari a zero, lo strumento è in modalità di passaggio del mouse.
- Se lo strumento è
InputReadersupporta i protocolli multi-touch "A" e "B". I nuovi driver devono utilizzare il protocollo "B", ma entrambi funzionano.A partire da Android 4.0, potrebbe essere necessario modificare i driver del touch screen per renderli conformi alle specifiche del protocollo di input di Linux.
Potrebbero essere necessarie le seguenti modifiche:
Quando uno strumento diventa inattivo (il dito si solleva), non deve più essere visualizzato nei report di sincronizzazione multi-touch successivi. Quando tutti gli strumenti diventano inattivi (tutte le dita si sollevano), il driver deve inviare un pacchetto di report di sincronizzazione vuoto, ad esempio
SYN_MT_REPORTseguito daSYN_REPORT.Le versioni precedenti di Android prevedevano che gli eventi "up" venissero segnalati inviando un valore di pressione pari a 0. Il comportamento precedente non era compatibile con la specifica del protocollo di input di Linux e non è più supportato.
Le informazioni sulla pressione fisica o sulla potenza 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 comportamento precedente non era compatibile con la specifica del protocollo di input di Linux e non è più supportato.- Le informazioni sulle dimensioni del tocco devono essere segnalate utilizzando
ABS_MT_TOUCH_MAJOR.Le versioni precedenti di Android recuperavano le informazioni sulle dimensioni da
ABS_MT_TOOL_MAJOR. Il comportamento precedente non era compatibile con la specifica del protocollo di input di Linux e non è più supportato.
Funzionamento del dispositivo touch
Di seguito è riportato un breve riepilogo del funzionamento del dispositivo touch su Android.
EventHublegge gli eventi non elaborati dal driverevdev.InputReaderutilizza gli eventi non elaborati e aggiorna lo stato interno relativo alla posizione e ad altre caratteristiche di ogni strumento. Inoltre, monitora gli stati dei pulsanti.- Se è stato premuto o rilasciato BACK o FORWARD,
InputReaderinvia una notifica aInputDispatcherin merito all'evento chiave. InputReaderdetermina se è stata premuta una chiave virtuale. In questo caso, invia una notifica aInputDispatcherrelativa all'evento chiave.InputReaderdetermina se il tocco è stato avviato entro i limiti del display. In questo caso, invia una notifica aInputDispatcherin merito all'evento touch.- Se non sono presenti strumenti di tocco, ma è presente almeno uno strumento di passaggio del mouse,
InputReaderinvia una notifica aInputDispatcherin merito all'evento di passaggio del mouse. - Se il tipo di dispositivo touch è pointer,
InputReaderesegue il rilevamento dei gesti del puntatore, sposta il puntatore e i punti di conseguenza e invia una notifica aInputDispatchersull'evento del puntatore. InputDispatcherutilizzaWindowManagerPolicyper determinare se gli eventi devono essere inviati e se devono riattivare il dispositivo. Poi,InputDispatcherinvia 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 del dispositivo.
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 dispositivo di input per configurare e calibrare il comportamento dei dispositivi 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, come il numero totale di nodi del sensore attivati dal tocco. Questo valore di dimensione non elaborato non sarebbe significativo per le app, perché 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 riportati dal dispositivo touch in una rappresentazione standard più semplice che le app possono comprendere.
Convenzioni della documentazione
Ai fini della documentazione, utilizziamo le seguenti convenzioni per descrivere i valori utilizzati dal sistema durante il processo di calibrazione.
Valori degli assi non elaborati
Le seguenti espressioni indicano i valori non elaborati riportati dal driver del dispositivo touch come eventi EV_ABS.
raw.x- Il valore dell'asse
ABS_XoABS_MT_POSITION_X. raw.y- Il valore dell'asse
ABS_YoABS_MT_POSITION_Y. raw.pressure- Il valore dell'asse
ABS_PRESSUREoABS_MT_PRESSUREoppure 0 se non disponibile. raw.touchMajor- Il valore dell'asse
ABS_MT_TOUCH_MAJORo 0 se non disponibile. raw.touchMinor- Il valore dell'asse
ABS_MT_TOUCH_MINORoraw.touchMajorse non è disponibile. raw.toolMajor- Il valore dell'asse
ABS_TOOL_WIDTHoABS_MT_WIDTH_MAJORoppure 0 se non disponibile. raw.toolMinor- Il valore dell'asse
ABS_MT_WIDTH_MINORoraw.toolMajorse non è disponibile. raw.orientation- Il valore dell'asse
ABS_MT_ORIENTATIONo 0 se non disponibile. raw.distance- Il valore dell'asse
ABS_DISTANCEoABS_MT_DISTANCEoppure 0 se non disponibile. raw.tiltX- Il valore dell'asse
ABS_TILT_Xo 0 se non disponibile. raw.tiltY- Il valore dell'asse
ABS_TILT_Yo 0 se non disponibile.
Intervalli degli assi non elaborati
Le seguenti espressioni indicano i limiti dei valori non elaborati. Vengono ottenuti chiamando EVIOCGABS ioctl per ogni asse.
raw.*.min- Il valore minimo inclusivo dell'asse non elaborato.
raw.*.max- Il valore massimo inclusivo dell'asse non elaborato.
raw.*.range- Equivalente a
raw.*.max - raw.*.min. raw.*.fuzz- L'accuratezza dell'asse non elaborato. Ad esempio, fuzz = 1 implica che i valori sono accurati fino a +/- 1 unità.
raw.width- La larghezza inclusiva dell'area touch, equivalente a
raw.x.range + 1. raw.height- L'altezza inclusiva dell'area touch, 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 alle unità di output segnalate alle app, ad esempio i pixel del display.
output.width- La larghezza dell'output. Per i touch screen (associati a un display), si tratta della larghezza del display in pixel. Per i touchpad (non associati a un display),
la larghezza di output è uguale a
raw.width, il che indica 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 di output è uguale a
raw.height, il che indica che non viene eseguita alcuna interpolazione. output.diag- La lunghezza diagonale del sistema di coordinate di output, equivalente a
sqrt(output.width ^2 + output.height ^2).
Configurazione di base
Il mappatore dell'input tocco utilizza molte proprietà di configurazione nel file di configurazione del dispositivo di input per specificare i valori di calibrazione. La tabella seguente descrive alcune proprietà di configurazione per uso generico. Tutte le altre proprietà sono descritte nelle sezioni seguenti, insieme ai campi che vengono utilizzati per la calibrazione.
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 touch è un touchpad non associato a un display. -
Se il valore è
pointer, il dispositivo touch è un touchpad non associato a un display 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.
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 touch screen.
touch.orientationAware
Definizione: touch.orientationAware = 0 | 1
Specifica se il dispositivo touch deve reagire alle modifiche dell'orientamento del display.
-
Se il valore è
1, le posizioni di tocco segnalate dal dispositivo touch vengono ruotate ogni volta che cambia l'orientamento del display. -
Se il valore è
0, le posizioni di tocco segnalate dal dispositivo touch non sono influenzate dalle 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 sensibile all'orientamento viene ruotato in base all'orientamento del display interno. Un touch screen esterno sensibile all'orientamento viene ruotato in base all'orientamento del display esterno.
La consapevolezza dell'orientamento viene utilizzata per supportare la rotazione dei touch screen su dispositivi come Nexus One. Ad esempio, quando il dispositivo viene ruotato di 90 gradi in senso orario 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 assolute del touch screen venga segnalato come un tocco nell'angolo in alto a sinistra del sistema di coordinate ruotato del display. In questo modo, i tocchi vengono segnalati con lo stesso sistema di coordinate utilizzato dalle app per disegnare i propri elementi visivi.
Prima di Honeycomb, si presumeva che tutti i dispositivi touch fossero sensibili all'orientamento.
touch.gestureMode
Definizione: touch.gestureMode = pointer | spots |
default
Specifica la modalità di presentazione per i gesti del puntatore. Questa proprietà di configurazione è pertinente 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 vengono presentati da un'ancora che rappresenta il baricentro del gesto e un insieme di punti circolari che rappresentano la posizione delle singole dita.
Il valore predefinito è pointer quando la proprietà di input INPUT_PROP_SEMI_MT è impostata, altrimenti è spots.
Campi X e Y
I campi X e Y forniscono informazioni sulla posizione del centro dell'area di contatto.
Calcolo
Il calcolo è semplice: le informazioni sulla posizione del driver touch vengono interpolate linearmente nel sistema di coordinate di output.
xScale = output.width / raw.width
yScale = output.height / raw.height
If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
output.x = (raw.y - raw.y.min) * yScale
output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
output.x = (raw.x.max - raw.x) * xScale
output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
output.x = (raw.y.max - raw.y) * yScale
output.y = (raw.x - raw.x.min) * xScale
End If
Campi touchMajor, touchMinor, toolMajor, toolMinor, size
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 le dimensioni normalizzate del tocco rispetto al tocco più grande possibile che il dispositivo touch può rilevare. La dimensione normalizzata più piccola possibile è 0,0 (nessun contatto o non misurabile), mentre 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 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 quelle dello strumento sì, queste ultime vengono impostate in modo da corrispondere alle dimensioni del tocco. Al contrario, se le dimensioni dello strumento non sono disponibili, ma quelle del tocco sì, le dimensioni del tocco vengono impostate in modo da corrispondere 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 riquadro di delimitazione geometrico in unità di superficie.
<touch.size.calibration< h4=""></touch.size.calibration<>
Definizione: touch.size.calibration = none |
geometric | diameter
| area | default
Specifica il tipo di misurazione utilizzato dal driver touch 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 superficie della posizione, quindi vengono scalate nello stesso modo. -
Se il valore è
diameter, si presume che la dimensione sia proporzionale 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 calibrazionegeometricse l'asseraw.touchMajororaw.toolMajorè disponibile, altrimenti utilizza la calibrazionenone.
touch.size.scale
Definizione: touch.size.scale = <un numero in virgola mobile non negativo>
Specifica un fattore di scalabilità 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 bias costante utilizzato nella calibrazione.
Il valore predefinito è 0.0.
touch.size.isSummed
Definizione: touch.size.isSummed = 0 | 1
Specifica se la dimensione viene indicata come la somma delle dimensioni di tutti i contatti attivi o se viene indicata singolarmente per ogni contatto.
-
Se il valore è
1, la dimensione indicata viene divisa per il numero di contatti prima dell'utilizzo. -
Se il valore è
0, la dimensione indicata viene 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, pertanto segnalano una misurazione delle dimensioni che rappresenta l'area o la 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 pressione
Il campo pressure descrive la pressione fisica approssimativa applicata al dispositivo touch come valore normalizzato compreso tra 0,0 (nessun tocco) e 1,0 (pressione normale).
Una pressione pari a zero indica che lo strumento è in modalità di passaggio del mouse.
touch.pressure.calibration
Definizione: touch.pressure.calibration = none |
physical | amplitude | default
Specifica il tipo di misurazione utilizzato dal driver touch per segnalare la pressione.
-
Se il valore è
none, la pressione è sconosciuta, quindi viene impostata su 1.0 quando tocchi e su 0.0 quando passi il mouse. -
Se il valore è
physical, si presume che l'asse della pressione misuri l'intensità fisica effettiva della pressione applicata al touchpad. -
Se il valore è
amplitude, si presume che l'asse della pressione misuri l'ampiezza del segnale, che è correlata alle dimensioni del contatto e alla pressione applicata. -
Se il valore è
default, il sistema utilizza la calibrazionephysicalse l'asse della pressione è disponibile, altrimenti utilizzanone.
touch.pressure.scale
Definizione: touch.pressure.scale = <un numero in virgola mobile non negativo>
Specifica un fattore di scalabilità 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 principale è orientato verticalmente, -PI/2 indica che l'asse principale è orientato a sinistra, PI/2 indica che l'asse principale è orientato a destra. Quando è presente uno stilo, l'intervallo di orientamento può essere descritto in un intervallo circolare 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 è piatto sulla superficie.
touch.orientation.calibration
Definizione: touch.orientation.calibration = none |
interpolated | vector | default
Specifica il tipo di misurazione utilizzato 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 in modo lineare, in modo che un valore non elaborato diraw.orientation.minvenga mappato a-PI/2e un valore non elaborato diraw.orientation.maxvenga mappato aPI/2. Il valore centrale di(raw.orientation.min + raw.orientation.max) / 2corrisponde a0. - Se il valore è
vector, l'orientamento viene interpretato come un vettore compresso costituito da due campi a 4 bit con segno. Questa rappresentazione viene utilizzata sulle parti Atmel Object Based Protocol. Una volta decodificato, il vettore restituisce un angolo di orientamento e un'entità di confidenza. La magnitudo di confidenza viene utilizzata per scalare le informazioni sulle dimensioni, a meno che non siano geometriche. - Se il valore è
default, il sistema utilizza la calibrazioneinterpolatedse l'asse di orientamento è disponibile, altrimenti utilizzanone.
Calcolo
Il calcolo dei campi orientation e tilt dipende dai parametri di calibrazione specificati e dall'input disponibile.
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 utilizzato dal driver touch per segnalare la distanza.
-
Se il valore è
none, la distanza è sconosciuta, quindi viene impostata su 0. -
Se il valore è
scaled, la distanza indicata viene moltiplicata per un fattore di scalabilità costante. -
Se il valore è
default, il sistema utilizza la calibrazionescaledse l'asse della distanza è disponibile, altrimenti utilizzanone.
touch.distance.scale
Definizione: touch.distance.scale = <un numero in virgola mobile non negativo>
Specifica un fattore di scalabilità 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.
Potrebbe anche essere necessario aggiornare i driver dei dispositivi touch meno recenti.
File di mappatura dei tasti virtuali
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 di tocco ai codici dei tasti nel software.
Quando i tasti virtuali vengono implementati nel software, il kernel deve esportare un file di mappa dei tasti virtuali denominato virtualkeys.<devicename> come proprietà della scheda. Ad esempio, se i driver del dispositivo touch screen indicano il nome "touchyfeely", il file della mappa dei tasti virtuali deve avere il percorso /sys/board_properties/virtualkeys.touchyfeely.
Un file di mappa dei tasti virtuali descrive le coordinate e i codici dei tasti Linux dei tasti virtuali sul touch screen.
Oltre al file di mappa dei tasti virtuali, deve essere presente un file di layout dei tasti e un file di mappa dei caratteri dei tasti corrispondenti per mappare i codici dei tasti Linux ai codici dei tasti Android e per specificare il tipo di dispositivo della tastiera (di solito SPECIAL_FUNCTION).
Sintassi
Un file di mappa dei tasti virtuali è un file di testo normale costituito da una sequenza di descrizioni del layout dei tasti virtuali separate da nuove righe 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 di versione. Deve essere sempre0x01.- <Linux key code>: il codice tasto Linux del tasto virtuale.
- <centerX>: la coordinata pixel X del centro del tasto virtuale.
- <centerY>: la coordinata pixel Y del centro del tasto virtuale.
- <width>: la larghezza del tasto virtuale in pixel.
- <height>: l'altezza del tasto virtuale in pixel.
Tutte le coordinate e le dimensioni sono specificate in termini di sistema di coordinate del display.
Ecco un file di mappa dei tasti virtuali scritto tutto su una riga.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
Lo stesso file di mappa dei tasti virtuali può anche essere scritto su più righe.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Nell'esempio precedente, il touch screen ha una risoluzione di 480 x 800. Di conseguenza, tutti i tasti virtuali hanno una coordinata <centerY> di 835, che si trova leggermente al di sotto dell'area visibile del touch screen.
Il primo tasto ha un codice di scansione Linux di 158 (KEY_BACK), centerX di
55, centerY di 835, larghezza di 90 e altezza di
55.
Esempio
File di mappatura dei tasti 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 di layout dei tasti: /system/usr/keylayout/touchyfeely.kl.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
File di mappa dei caratteri dei tasti: /system/usr/keychars/touchyfeely.kcm.
type SPECIAL_FUNCTION
Gesti con puntatore multi-touch indiretti
In modalità puntatore, il sistema interpreta i seguenti gesti:
- Tocco con un dito: clic.
- Movimento con un solo dito: sposta il puntatore.
- Movimento con un dito più pressione dei pulsanti: trascina il puntatore.
- Movimento con due dita che si spostano nella stessa direzione: trascina l'area sotto il puntatore in quella direzione. Il puntatore non si sposta.
- Movimento con due dita che si avvicinano o si allontanano in direzioni diverse: panoramica/scala/rotazione dell'area circostante il puntatore. Il puntatore non si sposta.
- Movimento con più dita: gesto in formato libero.
Palm rejection
A partire da Android 13, il sistema può rifiutare automaticamente gli input dei palmi quando il framework integrato è attivo. Le soluzioni personalizzate create internamente sono ancora supportate, anche se potrebbe essere necessario modificarle 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 dei dati dei gesti, il puntatore corrente e i puntatori circostanti, quindi considera la distanza dei tocchi dal bordo del display.
Quindi determina, per ogni puntatore, quali sono i palmi. Tiene inoltre conto delle dimensioni di ogni contatto, come riportato da touchMajor e touchMinor. Il framework Android rimuove quindi i puntatori contrassegnati come palmi dallo stream di tocco.
Se un puntatore è già stato inviato alle app, il sistema:
- (Se sono presenti altri puntatori attivi) Annulla il puntatore con
ACTION_POINTER_UPeFLAG_CANCELEDimpostati. - (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 lo ignora.
Attiva il palm rejection
- Nel driver touch, utilizza la
macro
input_abs_set_resper impostare le risoluzioni per i seguenti campi (le unità sono pixel per mm):ABS_MT_POSITION_XABS_MT_POSITION_YABS_MT_TOUCH_MAJORABS_MT_TOUCH_MINOR
Il supporto di
ABS_MT_TOUCH_MINORè facoltativo. Tuttavia, se il tuo dispositivo lo supporta, 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 inputmostri che all'interno diUnwantedInteractionBlockersono presenti dei palm rejector. In caso contrario, controlla i log relativi all'input per trovare indizi su cosa potrebbe essere configurato in modo errato.Vedi il seguente esempio di 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