Dispositivi touch

Android supporta una varietà di touchscreen e touchpad, inclusi tablet digitizer basati su 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, ad esempio un tablet digitalizzatore. I touchpad vengono in genere utilizzati per puntare o per il posizionamento indiretto assoluto o il controllo basato su gesti di un'interfaccia utente.

I dispositivi touch possono avere pulsanti le cui funzioni sono simili a quelle dei pulsanti del mouse.

I dispositivi touch a volte possono essere manipolati utilizzando una serie di strumenti diversi, come dita o uno stilo, a seconda della tecnologia del sensore touch sottostante.

A volte i dispositivi touch vengono 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 funge da 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 viene 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 e ABS_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 viene classificato come dispositivo single-touch se sussistono entrambe le condizioni seguenti:

  • Il dispositivo di input non è classificato come dispositivo multitocco. 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_X e ABS_Y e la presenza del codice chiave BTN_TOUCH.

Quando un dispositivo di input viene 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 mappatura delle chiavi virtuali, viene caricato anche il file di layout delle chiavi per il dispositivo. Per informazioni sulla posizione e sul formato di questi file, consulta [File di mappatura delle chiavi 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 adatta a periferiche touch di uso generale, come touch screen o touch pad HID USB o Bluetooth esterni. Questi valori predefiniti non sono progettati per i touch screen integrati e possono comportare un comportamento errato.

Dopo aver caricato la configurazione del dispositivo di input, il sistema classifica il dispositivo di input come touch screen, touchpad o puntatore.

  • Un dispositivo con touchscreen viene utilizzato per la manipolazione diretta degli oggetti sullo schermo. L'utente tocca direttamente lo schermo, quindi il sistema non richiede ulteriori ausili per indicare gli oggetti manipolati.
  • Un dispositivo touchpad viene utilizzato per fornire informazioni sul posizionamento assoluto a un'app in merito ai tocchi in una determinata area del sensore. Può essere utile per i tablet digitizer.
  • 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 stili, vengono interpretati utilizzando posizioni assolute. Per ulteriori informazioni, consulta la sezione Gesti del puntatore multitocco indiretto.

Per classificare il dispositivo di input come touchscreen, touchpad o dispositivo di puntamento vengono utilizzate le seguenti regole.

  • 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 ioctl EVIOCGPROP), il tipo di dispositivo viene impostato su touchscreen. Questa condizione presuppone che i dispositivi di input touch 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 ioctl EVIOCGPROP), il tipo di dispositivo viene impostato su puntatore.
  • Se il dispositivo di input segnala la presenza degli assi relativi REL_X o REL_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 puntatore. Questa impostazione predefinita garantisce che i touchpad a cui non è stata assegnata un'altra funzione 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 sono utili principalmente con i dispositivi touch di tipo puntatore o con uno stilo.

Sono supportati i seguenti pulsanti:

  • BTN_LEFT: mappato a MotionEvent.BUTTON_PRIMARY.
  • BTN_RIGHT: mappato a MotionEvent.BUTTON_SECONDARY.
  • BTN_MIDDLE: mappato a MotionEvent.BUTTON_MIDDLE.
  • BTN_BACK e BTN_SIDE: mappati a MotionEvent.BUTTON_BACK. Se premi questo pulsante, viene sintetizzata anche la pressione di un tasto con il codice KeyEvent.KEYCODE_BACK.
  • BTN_FORWARD e BTN_EXTRA: mappati a MotionEvent.BUTTON_FORWARD. La pressione di questo pulsante sintetizza anche la pressione di un tasto con il codice tasto KeyEvent.KEYCODE_FORWARD.
  • BTN_STYLUS: mappato a MotionEvent.BUTTON_SECONDARY.
  • BTN_STYLUS2: mappato a MotionEvent.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 è spesso indicato come puntatore.

Sono supportati i seguenti tipi di strumenti:

  • BTN_TOOL_FINGER e MT_TOOL_FINGER: mappati a MotionEvent.TOOL_TYPE_FINGER.
  • BTN_TOOL_PEN e MT_TOOL_PEN: mappati a MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_RUBBER: mappato a MotionEvent.TOOL_TYPE_ERASER.
  • BTN_TOOL_BRUSH: mappato a MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_PENCIL: mappato a MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_AIRBRUSH: mappato a MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_MOUSE: mappato a MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_LENS: mappato a MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP e BTN_TOOL_QUADTAP: mappati su MotionEvent.TOOL_TYPE_FINGER.

Strumenti di passaggio del mouse e tocco

Gli strumenti possono essere a contatto con il dispositivo touch o a portata e in sospensione sopra di esso. Non tutti i dispositivi touch sono in grado di rilevare la presenza di uno strumento che si trova sopra il dispositivo touch. Quelli che lo fanno, come i digitalizzatori dello stilo basati su RF, spesso possono rilevare quando lo strumento si trova entro un raggio limitato del digitalizzatore.

Il componente InputReader distingue gli strumenti di tocco da quelli di passaggio del mouse. Allo stesso modo, 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 hovering 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 chiave per gli assi e i pulsanti che supportano. La registrazione di assi o codici chiave non supportati può confondere l'algoritmo di classificazione dei dispositivi o indurre il sistema a rilevare in modo errato le funzionalità del dispositivo. Ad esempio, se il dispositivo segnala il codice tasto BTN_TOUCH, il sistema presuppone che BTN_TOUCH venga sempre utilizzato per indicare se lo strumento sta toccando lo schermo. Pertanto, BTN_TOUCH non deve essere utilizzato per indicare che l'attrezzo si trova semplicemente nel raggio d'azione e in sospensione.
  • I dispositivi multitocco 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 o la larghezza della sezione trasversale del contatto del 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 rispetto alla superficie del dispositivo touch lungo l'asse Y.
    • BTN_TOUCH: (OBBLIGATORIO) indica se lo strumento tocca il dispositivo.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (facoltativo) Stati del pulsante dei 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 multitouch 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 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 se ABS_MT_TOUCH_MAJOR restituisce 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ù corta dello strumento stesso. Questo asse non deve essere utilizzato se ABS_MT_WIDTH_MAJOR segnala 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 come MT_TOOL_FINGER o MT_TOOL_PEN.
    • ABS_MT_TRACKING_ID: (facoltativo) indica 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 di 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 si utilizza il protocollo multitocco Linux "B". Per ulteriori dettagli, consulta la documentazione sul protocollo multitocco di Linux.
    • BTN_TOUCH: (OBBLIGATORIO) indica se lo strumento tocca il dispositivo.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (facoltativo) Stati del pulsante dei 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 vengono definiti gli assi per il protocollo single-touch e 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, e ABS_MT_POSITION_Y definiscono i limiti dell'area attiva del dispositivo in unità di superficie specifiche del dispositivo. Nel caso di un touch screen, l'area attiva descrive la parte del dispositivo touch che copre effettivamente il display.

    Per un touch screen, il sistema interpola automaticamente le posizioni di tocco riportate in unità di superficie per ottenere le posizioni di tocco in pixel del display in base al seguente calcolo:

        displayX = (x - minX) * displayWidth / (maxX - minX + 1)
        displayY = (y - minY) * displayHeight / (maxY - minY + 1)
        

    Un touch screen 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 all'interno dei limiti di un'app e poi si sposta al di fuori dell'area attiva, l'app potrebbe ricevere eventi di tocco con coordinate di visualizzazione negative o al di fuori dei limiti del display. Questo è un comportamento previsto.

    Un dispositivo touch non deve mai bloccare le coordinate del tocco nei limiti dell'area attiva. Se un tocco esce dall'area attiva, deve essere segnalato come esterno all'area attiva oppure non deve essere segnalato affatto.

    Ad esempio, se il dito dell'utente tocca vicino all'angolo in alto a sinistra del touch screen, potrebbe segnalare una coordinata di (minX, minY). Se il dito continua a spostarsi ulteriormente al di fuori dell'area attiva, il touchscreen deve iniziare a segnalare 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 al di fuori dell'area attiva.

    Il bloccaggio delle coordinate di tocco sul bordo del display crea un limite rigido artificiale intorno al bordo dello schermo, che impedisce al sistema di tracciare in modo fluido i movimenti che entrano o escono dai limiti dell'area di visualizzazione.

  • I valori segnalati da ABS_PRESSURE o ABS_MT_PRESSURE, se vengono segnalati, devono essere diversi da zero quando lo strumento tocca il dispositivo e zero altrimenti per indicare che lo strumento è in sospensione.

    La segnalazione delle informazioni sulla pressione è facoltativa, ma vivamente consigliata. Le app possono utilizzare le informazioni sulla pressione per implementare il disegno sensibile alla pressione e altri effetti.

  • I valori segnalati da ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR o ABS_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 contatti delle dita, ma non dei contatti dello stilo.

    La segnalazione delle informazioni sulle dimensioni è facoltativa, ma vivamente consigliata. Le app possono utilizzare le informazioni sulla pressione per implementare il disegno sensibile alle dimensioni e altri effetti.

  • I valori riportati da ABS_DISTANCE o ABS_MT_DISTANCE devono avvicinarsi a zero quando lo strumento tocca il dispositivo. La distanza può rimanere diversa da zero anche quando l'utensile è 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_X e ABS_TILT_Y devono essere pari a zero quando lo strumento è perpendicolare al dispositivo. Un'inclinazione diversa da zero indica che lo strumento è tenuto in posizione inclinata.

    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) / 2 per ogni asse. I valori più piccoli del punto centrale rappresentano un'inclinazione verso l'alto o verso sinistra, mentre i valori più grandi del punto centrale rappresentano un'inclinazione verso il basso o verso destra.

    InputReader converte i componenti di inclinazione X e Y in un angolo di inclinazione perpendicolare compreso tra 0 e PI / 2 radianti e un angolo di orientamento planare compreso tra -PI e PI 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 con stilo.

  • Se il tipo di strumento viene segnalato da ABS_MT_TOOL_TYPE, sostituisce qualsiasi informazione sul tipo di strumento segnalata da BTN_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 si utilizza il protocollo a tocco singolo, lo strumento è attivo se BTN_TOUCH, o BTN_TOOL_* è 1.

      Questa condizione implica che InputReader deve avere almeno alcune informazioni sulla natura dell'utensile, ad esempio se è a contatto o almeno il suo tipo. Se non sono disponibili informazioni, si presume che lo strumento sia inattivo (fuori dal raggio d'azione).

    • Quando utilizzi 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, non esiste più.
    • Quando utilizzi il protocollo multitocco "B", lo strumento è attivo finché ha uno slot attivo. Quando lo slot viene cancellato, lo strumento non esiste più.
  • Uno strumento viene considerato in sospensione in base alle seguenti condizioni:
    • Se lo strumento è BTN_TOOL_MOUSE o BTN_TOOL_LENS, lo strumento non è in sospensione, anche se si verifica una delle seguenti condizioni.
    • Se lo strumento è attivo e il conducente segnala informazioni sulla pressione, e la pressione segnalata è zero, lo strumento è in sospensione.
    • Se lo strumento è attivo e il driver supporta il codice chiave BTN_TOUCH e BTN_TOUCH ha un valore pari a zero, lo strumento è in sospensione.
  • InputReader supporta i protocolli multitocco "A" e "B". I nuovi driver devono utilizzare il protocollo "B", ma entrambi funzionano.
  • A partire da Android 4.0, i driver del touch screen potrebbero dover essere modificati per essere conformi 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 di sincronizzazione multitocco successivi. Quando tutti gli strumenti diventano inattivi (tutte le dita sono "alzate"), il driver deve inviare un pacchetto di report di sincronizzazione vuoto, ad esempio SYN_MT_REPORT seguito da SYN_REPORT.

      Le versioni precedenti di Android prevedevano che gli eventi "up" venissero segnalati inviando un valore di pressione pari a 0. Il vecchio comportamento era incompatibile con le specifiche del protocollo di input di Linux e non è più supportato.

    • La pressione fisica o le informazioni sull'intensità del segnale devono essere segnalate utilizzando ABS_MT_PRESSURE.

      Le versioni precedenti di Android recuperavano le informazioni sulla pressione da ABS_MT_TOUCH_MAJOR. Il vecchio comportamento era incompatibile con le specifiche 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 vecchio comportamento era incompatibile con le specifiche del protocollo di input di Linux e non è più supportato.

    I driver dei dispositivi touch non richiedono più personalizzazioni specifiche per Android. Basandosi sul protocollo di input Linux standard, Android può supportare una gamma più ampia di periferiche touch, come i touch screen HID multitouch esterni, utilizzando driver non modificati.

Funzionamento del dispositivo touch

Di seguito è riportato un breve riepilogo del funzionamento del dispositivo touch su Android.

  1. EventHub legge gli eventi non elaborati dal driver evdev.
  2. InputReader utilizza gli eventi non elaborati e aggiorna lo stato interno relativo alla posizione e ad altre caratteristiche di ogni strumento. Inoltre, tiene traccia degli stati dei pulsanti.
  3. Se è stato premuto o rilasciato BACK o FORWARD, InputReader notifica l'evento chiave a InputDispatcher.
  4. InputReader determina se è stata premuta una chiave virtuale. In questo caso, invia una notifica a InputDispatcher in merito all'evento chiave.
  5. InputReader determina se il tocco è stato avviato entro i limiti del display. In questo caso, invia una notifica a InputDispatcher in merito all'evento tocco.
  6. Se non sono presenti strumenti di tocco, ma è presente almeno uno strumento di passaggio del mouse, InputReader notifica a InputDispatcher l'evento di passaggio del mouse.
  7. Se il tipo di dispositivo di tocco è puntatore, InputReader esegue il rilevamento dei gesti del puntatore, sposta il puntatore e i punti di conseguenza e invia una notifica a InputDispatcher in merito all'evento del puntatore.
  8. InputDispatcher utilizza WindowManagerPolicy per determinare se gli eventi devono essere inviati e se devono riattivare il dispositivo. Poi, InputDispatcher invia gli eventi alle app appropriate.

Configurazione del dispositivo touch

Il comportamento del dispositivo di tocco è determinato da assi, pulsanti, proprietà di input, configurazione del dispositivo di input, mappa dei tasti virtuali e layout della tastiera.

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 dei dispositivi 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, ad esempio il numero totale di nodi sensore attivati dal tocco. Questo valore di dimensione non sarebbe significativo per le app perché dovrebbero conoscere le dimensioni fisiche e altre caratteristiche dei nodi 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 segnalati dal dispositivo touch in una rappresentazione standard più semplice che le app possono comprendere.

Convenzioni di documentazione

Ai fini della documentazione, utilizziamo le seguenti convenzioni per descrivere i valori utilizzati dal sistema durante la procedura di calibrazione.

Valori grezzi dell'asse

Le seguenti espressioni indicano i valori non elaborati riportati dal driver del dispositivo di tocco come eventi EV_ABS.

raw.x
Il valore dell'asse ABS_X o ABS_MT_POSITION_X.
raw.y
Il valore dell'asse ABS_Y o ABS_MT_POSITION_Y.
raw.pressure
Il valore dell'asse ABS_PRESSURE o ABS_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 o raw.touchMajor se non disponibile.
raw.toolMajor
Il valore dell'asse ABS_TOOL_WIDTH o ABS_MT_WIDTH_MAJOR oppure 0 se non disponibile.
raw.toolMinor
Il valore dell'asse ABS_MT_WIDTH_MINOR o raw.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 o ABS_MT_DISTANCE oppure 0 se non disponibile.
raw.tiltX
Il valore dell'asse ABS_TILT_X o 0 se non disponibile.
raw.tiltY
Il valore dell'asse ABS_TILT_Y o 0 se non disponibile.

Intervalli degli assi 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 grezzo.
raw.*.max
Il valore massimo inclusivo dell'asse grezzo.
raw.*.range
Equivalente a raw.*.max - raw.*.min.
raw.*.fuzz
L'accuratezza dell'asse grezzo. Ad esempio, fuzz = 1 implica che i valori sono accurati con un'unità di tolleranza.
raw.width
La larghezza inclusiva dell'area tocco, equivalente a raw.x.range + 1.
raw.height
L'altezza inclusiva dell'area di 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 di tocco nelle 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), questa è la larghezza del display in pixel. Per i touchpad (non associati a un display), la larghezza di output è pari 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), questa è l'altezza del display in pixel. Per i touchpad (non associati a un display), l'altezza dell'output è pari 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 mapper di 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 generiche. 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

Specifica il tipo di dispositivo touch.

  • Se il valore è touchScreen, il dispositivo di tocco è un touch screen associato a un display.

  • Se il valore è touchPad, il dispositivo di tocco è 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 gesti indiretti del puntatore multitocco.

  • 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, tutti i dispositivi touch erano considerati touch screen.

touch.orientationAware

Definizione: touch.orientationAware = 0 | 1

Specifica se il dispositivo touch deve reagire alle modifiche dell'orientamento del display.

  • Se il valore è 1, le posizioni del tocco segnalate dal dispositivo di tocco vengono ruotate ogni volta che cambia l'orientamento del display.

  • Se il valore è 0, le posizioni del tocco segnalate dal dispositivo di tocco sono immuni alle modifiche dell'orientamento del display.

Il valore predefinito è 1 se il dispositivo è un touchscreen, 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 touchscreen esterno sensibile all'orientamento viene ruotato in base all'orientamento del display esterno.

Il rilevamento dell'orientamento viene utilizzato per supportare la rotazione dei touch screen sui 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 touchscreen venga segnalato come 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 che le app utilizzano 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 di tocco è di tipo puntatore.

  • 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 ancoraggio che rappresenta il centroide del gesto e da 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 o spots altrimenti.

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 posizionali 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 di tocco 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. Se è possibile misurare solo il diametro approssimativo dell'area di contatto, i campi touchMajor e touchMinor sono uguali.

Allo stesso modo, il campo toolMajor specifica la dimensione più lunga e il campo toolMinor specifica la dimensione più corta dell'area della sezione trasversale dell'utensile.

Se le dimensioni del tocco non sono disponibili, ma quelle dello strumento sì, queste ultime vengono impostate in modo che siano uguali alle dimensioni del tocco. Al contrario, se le dimensioni dello strumento non sono disponibili, ma le dimensioni del tocco sono disponibili, queste ultime vengono impostate in modo che siano uguali alle dimensioni 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 bounding box geometrico in unità di superficie.

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 allo 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 la dimensione sia proporzionale all'area del tocco o dello strumento.

  • Se il valore è default, il sistema utilizza la calibrazione geometric se l'asse raw.touchMajor o raw.toolMajor è disponibile, altrimenti utilizza la calibrazione none.

touch.size.scale

Definizione: touch.size.scale = <a non-negative floating point number>

Specifica un fattore di scala costante utilizzato nella calibrazione.

Il valore predefinito è 1.0.

touch.size.bias

Definizione: touch.size.bias = <a non-negative floating point number>

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 riportata come somma delle dimensioni di tutti i contatti attivi o singolarmente per ogni contatto.

  • Se il valore è 1, la dimensione segnalata viene divisa per il numero di contatti prima dell'utilizzo.

  • Se il valore è 0, la dimensione segnalata viene utilizzata così com'è.

Il valore predefinito è 0.

Alcuni dispositivi touch, in particolare i dispositivi "Semi-MT", non riescono a distinguere le dimensioni individuali di più contatti, pertanto segnalano una misurazione delle dimensioni che rappresenta la loro area o larghezza totale. Questa proprietà deve essere impostata solo su 1 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 valore normalizzato compreso tra 0,0 (nessun tocco) e 1,0 (pressione normale).

Una pressione pari a zero indica che lo strumento è in sospensione.

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 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 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 calibrazione physical se l'asse di pressione è disponibile, altrimenti utilizza none.

touch.pressure.scale

Definizione: touch.pressure.scale = <a non-negative floating point number>

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 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 strumento stilo, l'intervallo di orientamento può essere descritto in un intervallo di cerchio completo da -PI o PI.

Il campo tilt descrive l'inclinazione dello strumento come misurazione angolare. Un'inclinazione di 0 indica che lo strumento è perpendicolare alla superficie. Un'inclinazione di PI/2 indica che lo strumento è piatto sulla superficie.

touch.orientation.calibration

Definizione: touch.orientation.calibration = none | interpolated | vector | default

Specifica il tipo di misurazione utilizzato dal driver touch per segnalare l'orientamento.

  • Se il valore è none, l'orientamento è sconosciuto, quindi viene impostato su 0.
  • Se il valore è interpolated, l'orientamento viene interpolato linearmente in modo che un valore non elaborato di raw.orientation.min corrisponda a -PI/2 e un valore non elaborato di raw.orientation.max corrisponda a PI/2. Il valore centrale di (raw.orientation.min + raw.orientation.max) / 2 corrisponde a 0.
  • Se il valore è vector, l'orientamento viene interpretato come un vettore compresso composto da due campi a 4 bit con segno. Questa rappresentazione viene utilizzata nelle parti del protocollo basato su oggetti Atmel. Una volta decodificato, il vettore produce un angolo di orientamento e una magnitudo di confidenza. L'entità della confidenza viene utilizzata per scalare le informazioni sulle dimensioni, a meno che non siano geometriche.
  • Se il valore è default, il sistema utilizza la calibrazione interpolated se l'asse di orientamento è disponibile, altrimenti utilizza none.

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 un 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 segnalata viene moltiplicata per un fattore di scala costante.

  • Se il valore è default, il sistema utilizza la calibrazione scaled se l'asse della distanza è disponibile, altrimenti utilizza none.

touch.distance.scale

Definizione: touch.distance.scale = <a non-negative floating point number>

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.

Potrebbe essere necessario aggiornare anche i driver dei dispositivi touch meno recenti.

File della mappa chiavi virtuale

I dispositivi touch possono essere utilizzati per implementare 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 soft impostando i registri del firmware. Altre volte è preferibile eseguire la mappatura dalle coordinate del tocco ai codici chiave nel software.

Quando le chiavi virtuali vengono implementate nel software, il kernel deve esportare un file di mapping delle chiavi virtuali denominato virtualkeys.<devicename> come proprietà della scheda. Ad esempio, se i driver del dispositivo touchscreen segnalano il nome "touchyfeely", allora il file di mappatura 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 dei tasti Linux delle chiavi virtuali sul touch screen.

Oltre al file di mappatura dei tasti virtuali, devono essere presenti un file di layout dei tasti e un file di mappatura dei caratteri dei tasti corrispondenti 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 separati da due punti:

  • 0x01: un codice versione. Deve essere sempre 0x01.
  • <Linux key code>: il codice tasto Linux del tasto virtuale.
  • <centerX>: la coordinata X in pixel del centro del tasto virtuale.
  • <centerY>: la coordinata Y in pixel 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 di visualizzazione.

Ecco un file di mappatura delle chiavi 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 mappatura dei tasti 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 touch screen ha una risoluzione di 480 x 800. Di conseguenza, tutte le chiavi virtuali hanno una coordinata <centerY> di 835, che si trova leggermente sotto l'area visibile del touchscreen.

La prima chiave ha un codice di scansione Linux di 158 (KEY_BACK), centerX di 55, centerY di 835, larghezza di 90 e altezza di 55.

Esempio

File di mappatura 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 di layout della tastiera: /system/usr/keylayout/touchyfeely.kl.

key 158 BACK
key 139 MENU
key 172 HOME
key 217 SEARCH

File della mappa dei caratteri della tastiera: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

Gesti indiretti del puntatore multi-touch

In modalità puntatore, il sistema interpreta i seguenti gesti:

  • Tocco con un dito: clic.
  • Movimento con un dito: sposta il puntatore.
  • Movimento di un dito più pressione dei pulsanti: trascina il puntatore.
  • Movimento con due dita nella stessa direzione: trascina l'area sotto il puntatore in quella direzione. Il puntatore non si sposta.
  • Movimento di due dita, entrambe le dita si muovono l'una verso l'altra o si allontanano in direzioni diverse: panoramica/scala/rotazione dell'area intorno al puntatore. Il puntatore non si sposta.
  • Movimento con più dita: gesto a mano libera.

Palm rejection

A partire da Android 13, il sistema può rifiutare automaticamente gli input del palmo quando è attivato il framework integrato. Le soluzioni personalizzate e interne sono ancora supportate, anche se potrebbero dover essere modificate per restituire il flag TOOL_TYPE_PALM quando viene rilevata una mano. Il framework integrato funziona anche in combinazione con soluzioni personalizzate.

Il modello effettivo esamina i primi 90 ms di dati sui gesti, il puntatore corrente e i puntatori circostanti, quindi valuta la distanza dei tocchi dal bordo del display. Poi determina, per ogni puntatore, quali sono le mani. Tiene inoltre conto delle dimensioni di ogni contatto, come riportato da touchMajor e touchMinor. Il framework Android rimuove quindi i puntatori contrassegnati come palmi dal flusso di tocco.

Se un puntatore è già stato inviato alle app, il sistema:

  • (Se sono presenti altri puntatori attivi) Annulla il puntatore con ACTION_POINTER_UP e FLAG_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 che per ACTION_POINTER_UP.

Se il puntatore del palmo non è stato inviato alle app, il sistema lo elimina.

Attivare il rifiuto del palmo

  1. 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 lo supporta, assicurati che la risoluzione sia impostata correttamente.

  2. Per verificare che i campi siano impostati correttamente, esegui:
        $ adb shell getevent -li
    
  3. Per attivare la funzionalità durante l'esecuzione, esegui:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Riavvia la procedura di system_server.
         $ adb shell stop && adb shell start
        
  5. Verifica che adb shell dumpsys input mostri che all'interno di UnwantedInteractionBlocker sono presenti sistemi di rilevamento del palmo. In caso contrario, controlla i log relativi all'input per trovare indizi su cosa potrebbe essere configurato in modo errato.

    Per riferimento, vedi il seguente esempio:

    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: {}
    
  6. 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
    

Continua a leggere