Dispositivi touch

Android supporta una serie di touchscreen e pad tattili, tra cui tablet con digitalizzatore basati su stilo.

I touchscreen sono dispositivi touch associati a un display che l'utente ha l'impressione di manipolare direttamente gli elementi sullo schermo.

I touch pad sono dispositivi touch non associati a un display, ad esempio una tablet digitalizzatore. I touch pad sono in genere usati per puntare o per posizionamento indiretto assoluto o 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 varietà di strumenti diversi come le dita o uno stilo, a seconda della tecnologia del sensore touch di base.

A volte vengono utilizzati dispositivi touch per implementare tasti virtuali. Ad esempio, su alcuni dispositivi Android, l'area del sensore del touchscreen si estende oltre il bordo il display e ha un duplice scopo, come parte di un tastierino sensibile al tocco.

Grazie alla grande varietà di dispositivi touch, Android si basa su un gran numero di configurazione per descrivere le caratteristiche e il comportamento desiderato di ciascun dispositivo.

Classificazione dei dispositivi touch

Un dispositivo di input è classificato come dispositivo multi-touch se entrambi sussistono le seguenti condizioni:

  • Il dispositivo di input segnala la presenza di ABS_MT_POSITION_X e ABS_MT_POSITION_Y assi assoluti.
  • Il dispositivo di input non ha pulsanti del gamepad. Questa condizione risolve un'ambiguità con alcuni gamepad che segnalano assi con codici che si sovrappone a quelli degli assi MT.

Un dispositivo di input è classificato come dispositivo single-touch se entrambi i dispositivi le seguenti condizioni:

  • Il dispositivo di input non è classificato come dispositivo multi-touch. Un dispositivo di input è classificato come dispositivo single-touch o multi-touch, mai entrambe.
  • Il dispositivo di input segnala la presenza dell'intervallo assoluto 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 chiavi virtuali viene determinato tentando di caricare il file della mappa delle chiavi virtuali per il dispositivo. Se è disponibile una mappa dei tasti virtuali, viene usato il layout dei tasti. viene caricato anche il file del dispositivo. Fai riferimento a [File delle mappe dei tasti virtuali](#virtual-key-map-files) per informazioni sulla posizione e sul formato di questi file.

Il sistema carica quindi il file di configurazione del dispositivo di input per il dispositivo touch.

Tutti i dispositivi touch integrati devono avere i 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 l'uso generico periferiche touch come touchscreen USB o Bluetooth HID esterni o touchscreen. Queste impostazioni predefinite non sono progettate per i touchscreen e può causare un comportamento errato.

Una volta caricata la configurazione del dispositivo di input, il sistema classifica dispositivo di input come touchscreen, touch pad o dispositivo di puntatore.

  • Un dispositivo touchscreen viene utilizzato per manipolare direttamente gli oggetti presenti sulla schermo. L'utente tocca direttamente lo schermo, quindi il sistema non richiede eventuali inviti aggiuntivi per indicare che gli oggetti manipolato.
  • Viene utilizzato un touch pad per fornire informazioni sul posizionamento assoluto. a un'app sul tocco di una determinata area del sensore. Può essere utile per tablet con digitalizzatore.
  • Un dispositivo pointer viene utilizzato per la manipolazione indiretta degli oggetti sulla schermo usando un cursore. Le dita sono interpretate come puntatore multi-touch gesti. Altri strumenti, come gli stilo, vengono interpretati utilizzando posizioni assolute. Consulta Puntatore multi-touch indiretto gesti per ulteriori informazioni.

Le seguenti regole vengono usate per classificare il dispositivo di input come touchscreen, touchpad o dispositivo di puntamento.

  • Se la proprietà touch.deviceType è impostata, il tipo di dispositivo è impostato come indicato.
  • Se il dispositivo di input segnala la presenza di INPUT_PROP_DIRECT proprietà di input (tramite lo strumento ioctl EVIOCGPROP), il tipo di dispositivo è imposta il touchscreen. Questa condizione presuppone che il contatto diretto con l'input sono collegati a un display a cui è collegato.
  • Se il dispositivo di input segnala la presenza di INPUT_PROP_POINTER proprietà di input (tramite lo strumento ioctl EVIOCGPROP), il tipo di dispositivo impostata su pointer.
  • Se il dispositivo di input segnala la presenza di REL_X o REL_Y assi relativi, il tipo di dispositivo è impostato su touch pad. Questa condizione risolve un'ambiguità per i dispositivi di input costituiti sia da un mouse e da un un touchpad. In questo caso, il touchpad non viene usato per controllare del puntatore, perché è già il mouse.
  • In caso contrario, il tipo di dispositivo è impostato su pointer. Questa impostazione predefinita garantisce I touch pad non sono stati designati per altri scopi speciali. controlla il puntatore.

Pulsanti

I pulsanti sono controlli facoltativi che le app possono utilizzare per eseguire funzioni aggiuntive. I pulsanti dei dispositivi touch si comportano in modo simile al mouse e vengono utilizzati principalmente con dispositivi touch di tipo pointer o con una 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 del tasto KeyEvent.KEYCODE_BACK.
  • BTN_FORWARD e BTN_EXTRA: mappati a MotionEvent.BUTTON_FORWARD. Se premi questo pulsante viene sintetizzata anche la pressione di un tasto con il codice chiave 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 apparecchio utilizzato per interagire con il dispositivo touch. Alcuni dispositivi touch possono distinguere tra tipi di strumenti.

Altrove in Android, come nell'API MotionEvent, uno strumento viene spesso indicato come pointer.

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: mappato a MotionEvent.TOOL_TYPE_FINGER.

Strumenti passandoci sopra al tocco

Gli strumenti possono essere a contatto con il dispositivo touch o nel raggio d'azione e quando passano il mouse sopra. Non tutti i dispositivi touch sono in grado di rilevare la presenza di uno strumento passando il mouse sopra il dispositivo touch. Quelli che lo supportano, come i digitalizzatori con stilo a RF, spesso sono in grado di rilevare quando lo strumento si trova entro un raggio d'azione limitato del digitalizzatore.

Il componente InputReader distingue gli strumenti che toccano dal passaggio del mouse i nostri strumenti. Allo stesso modo, gli strumenti che toccano e passino il mouse sopra vengono segnalati alle app in vari modi.

Gli strumenti di tocco sono segnalati alle app come eventi tocco utilizzando MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN e MotionEvent.ACTION_POINTER_UP.

Gli strumenti di scorrimento del mouse vengono segnalati alle app come eventi di movimento generici utilizzando MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE, e MotionEvent.ACTION_HOVER_EXIT.

Requisiti del driver per dispositivi touch

  • I driver dei dispositivi touch devono registrare solo gli assi e i codici chiave degli assi e i pulsanti supportati. Registrazione di assi o codici chiave non supportati può confondere l'algoritmo di classificazione dei dispositivi o causare errori nel sistema rilevare le funzionalità del dispositivo. Ad esempio, se il dispositivo segnala BTN_TOUCH codice chiave, il sistema presuppone che BTN_TOUCH venga sempre utilizzato per indicare se lo strumento è toccare lo schermo. Pertanto, non è necessario utilizzare BTN_TOUCH per indicare che lo strumento è semplicemente nell'intervallo e ci si passa 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) 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 di del contatto 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 dalla superficie del il dispositivo touch lungo l'asse X.
    • ABS_TILT_Y: (facoltativo) indica l'inclinazione dello strumento dalla superficie del il dispositivo touch lungo l'asse Y.
    • BTN_TOUCH: (OBBLIGATORIO) indica se lo strumento sta toccando il dispositivo.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE e BTN_BACK BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS e BTN_STYLUS2: (Facoltativo) Stati del pulsante Report.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (facoltativo) 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: (facoltativo) indica la pressione fisica applicata al punta dello strumento o l'intensità del segnale del contatto touch.
    • ABS_MT_TOUCH_MAJOR: (facoltativo) indica l'area della sezione trasversale della contatto touch o la lunghezza della dimensione più lunga del contatto touch.
    • ABS_MT_TOUCH_MINOR: (facoltativo) indica la lunghezza della dimensione più breve del contatto touch. Questo asse non deve essere utilizzato se ABS_MT_TOUCH_MAJOR è registrando una misurazione dell'area.
    • ABS_MT_WIDTH_MAJOR: (facoltativo) indica l'area della sezione trasversale della o la lunghezza della dimensione più lunga dello strumento stesso. Non utilizzare questo asse a meno che tu non conosca le dimensioni dello strumento stesso.
    • ABS_MT_WIDTH_MINOR: (facoltativo) indica la lunghezza della dimensione più breve dello strumento. Questo asse non deve essere utilizzato se ABS_MT_WIDTH_MAJOR sta generando un report misurazione di un'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 dal superficie del dispositivo touch.
    • ABS_MT_TOOL_TYPE: (facoltativo) segnala la 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 che viene utilizzato per identificare e monitorare ogni strumento in modo indipendente quando sono attivi più strumenti. Ad esempio: Quando più dita toccano il dispositivo, a ogni dito deve essere assegnata una ID monitoraggio utilizzato finché il dito rimane in contatto. ID monitoraggio possono essere riutilizzati quando gli strumenti associati non rientrano nell'intervallo.
    • ABS_MT_SLOT: (facoltativo) segnala l'ID slot dello strumento, quando viene utilizzato Protocollo multi-touch Linux "B". Consulta la documentazione sul protocollo multi-touch Linux per ulteriori informazioni.
    • BTN_TOUCH: (OBBLIGATORIO) indica se lo strumento sta toccando il dispositivo.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE e BTN_BACK BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS e BTN_STYLUS2: (Facoltativo) Stati del pulsante Report.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (facoltativo) Segnala il tipo di strumento.
  • Se sono definiti gli assi per il protocollo single-touch e multi-touch, vengono utilizzati solo gli assi multi-touch, mentre gli assi single-touch vengono ignorati.
  • I valori minimo e massimo di ABS_X, ABS_Y, ABS_MT_POSITION_X, e ABS_MT_POSITION_Y assi definiscono i limiti dell'area attiva del dispositivo in unità di superficie specifiche per dispositivo. Nel caso di un touchscreen, l'area attiva descrive la parte del dispositivo touch che copre effettivamente il display.

    Per un touchscreen, il sistema interpola automaticamente il tocco segnalato le posizioni nelle unità di superficie per ottenere le posizioni di tocco nei pixel del display in base con il seguente calcolo:

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

    Un touchscreen 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 utilizzate per le chiavi virtuali.

    Tocchi avviati all'interno dell'area attiva o che entrano ed escono dal display vengono pubblicati nelle app. Di conseguenza, se un tocco inizia all'interno limiti di un'app e poi si sposta al di fuori dell'area attiva. potrebbe ricevere eventi touch con coordinate di visualizzazione negative o superiori limiti del display. Si tratta di un comportamento previsto.

    Un dispositivo touch non deve mai bloccare le coordinate di tocco ai limiti del piano geografica specifica. Se un tocco esce dall'area attiva, deve essere segnalato come esterno a l'area attiva, altrimenti non deve essere segnalato.

    Ad esempio, se il dito dell'utente si tocca vicino all'angolo in alto a sinistra della touch screen, potrebbe riportare una coordinata di (minX, minY). Se il dito continua per spostarti più lontano dall'area attiva, il touchscreen dovrebbe dei report sulle coordinate con componenti minori di minX e minY, come (minX - 2, minY - 3) oppure la segnalazione del tocco dovrebbe essere interrotta. In altre parole, il touchscreen non dovrebbe indicare (minX, minY) quando il dito dell'utente si tocca davvero al di fuori dell'area attiva.

    Il serraggio delle coordinate di tocco al bordo del display crea una limite rigido lungo il bordo dello schermo che impedisce al sistema di seguire in modo uniforme i movimenti che entrano o escono dai margini dell'area di visualizzazione.

  • I valori riportati da ABS_PRESSURE o ABS_MT_PRESSURE, se non vengano segnalati, devono essere diversi da zero quando lo strumento tocca il dispositivo e 0, in caso contrario, per indicare che ci si sta passando il mouse sopra lo strumento.

    Le informazioni sulla pressione relativa alle segnalazioni sono facoltative, ma vivamente consigliate. Le app possono usare le informazioni sulla pressione per implementare il disegno sensibile alla pressione e altri effetti.

  • I valori riportati da ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR o ABS_MT_WIDTH_MINOR deve essere diverso da zero quando lo strumento tocca il dispositivo e zero, altrimenti non è obbligatorio. Ad esempio, il dispositivo touch potrebbe essere in grado di misurare la dimensione del tocco del dito ma non con lo stilo.

    Le informazioni sulle dimensioni dei report sono facoltative ma vivamente consigliate. Le app possono usare 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 si avvicinano allo zero quando lo strumento tocca il dispositivo. La distanza può rimanere diversa da zero anche quando lo strumento è in contatto diretto. I valori esatti riportati dipendono sul modo in cui l'hardware misura la distanza.

    La segnalazione delle informazioni sulla distanza è facoltativa ma consigliata per dispositivi stilo.

  • I valori riportati da ABS_TILT_X e ABS_TILT_Y devono essere zero quando lo strumento è perpendicolare al dispositivo. Un'inclinazione diversa da zero indica che lo strumento è inclinato.

    Si presume che gli angoli di inclinazione lungo gli assi X e Y siano specificati in gradi dalla perpendicolare. Viene dato il punto centrale (perfettamente perpendicolare) di (max + min) / 2 per ogni asse. Valori inferiori al punto centrale rappresentano un'inclinazione verso l'alto o verso sinistra, valori più grandi del punto centrale che rappresentano un'inclinazione verso il basso o verso destra.

    InputReader converte i componenti di inclinazione X e Y in una posizione perpendicolare angolo di inclinazione compreso tra 0 e PI / 2 radianti e un angolo di orientamento planare che vanno da -PI a PI radianti. Questa rappresentazione genera descrizione dell'orientamento compatibile con la descrizione le dita.

    La segnalazione delle informazioni sull'inclinazione è facoltativa, ma consigliata per i dispositivi stilo.

  • Se il tipo di strumento viene segnalato da ABS_MT_TOOL_TYPE, prevale su qualsiasi strumento tipo di informazioni riportate da BTN_TOOL_*. Se non sono disponibili informazioni sul tipo di strumento, per impostazione predefinita il tipo di strumento viene impostato su 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_TOUCH, o BTN_TOOL_* è 1.

      Questa condizione implica che InputReader debba avere almeno informazioni sulla natura dello strumento, che sia toccante, o almeno il suo 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 appare nel rapporto di sincronizzazione più recente. Quando lo strumento non viene più visualizzato in sincronizza i rapporti, cessa di esistere.
    • Quando si utilizza il protocollo multi-touch "B", lo strumento è attivo purché ha uno slot attivo. Quando lo slot si è diradato, lo strumento smette di esistere.
  • Si determina che uno strumento passa il mouse sopra l'elemento in base alle seguenti condizioni:
    • Se lo strumento è BTN_TOOL_MOUSE o BTN_TOOL_LENS, lo strumento non passi il mouse sopra, anche se una delle seguenti condizioni è vera.
    • Se lo strumento è attivo e il conducente segnala le informazioni sulla pressione, e la pressione segnalata è pari a zero, significa che lo strumento sta passando il cursore del mouse.
    • Se lo strumento è attivo e il driver supporta il codice chiave BTN_TOUCH e BTN_TOUCH ha un valore pari a zero, quando passi il mouse sopra lo strumento.
  • InputReader supporta il protocollo multi-touch "A" e "B". Nuovi conducenti dovresti usare la lettera "B" ma entrambe funzionano.
  • A partire da Android 4.0, potrebbe essere necessario cambiare i driver del touchscreen per rispettare le specifiche del protocollo di input di Linux.

    Potrebbero essere necessarie le seguenti modifiche:

    • Quando uno strumento diventa inattivo (il dito sale verso l'alto), non dovrebbe più essere visualizzato nei successivi report sulla sincronizzazione multi-touch. Quando tutti gli strumenti diventano inattivi (tutte le dita rivolte verso l'alto"), il driver dovrebbe inviare un pacchetto di report di sincronizzazione vuoto, ad esempio SYN_MT_REPORT seguito da SYN_REPORT.

      Le versioni precedenti di Android previste "up" eventi da segnalare inviando con un valore di pressione pari a 0. Il comportamento precedente non era compatibile con Specifica del protocollo di input Linux e non è più supportato.

    • Le informazioni sulla pressione fisica o sull'intensità del segnale devono essere riportate utilizzando ABS_MT_PRESSURE.

      Le versioni precedenti di Android recuperavano le informazioni sulla pressione da ABS_MT_TOUCH_MAJOR. Il comportamento precedente non era compatibile con Specifica del protocollo di input Linux e non è più supportato.

    • Le informazioni sulle dimensioni del tocco dovrebbero 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 Specifica del protocollo di input Linux e non è più supportato.

    di Gemini Advanced. I driver dei dispositivi touch non hanno più bisogno di personalizzazioni Android specifiche. Basandosi sul protocollo di input standard di Linux, Android può supportare una una gamma più ampia di periferiche touch, come l'HID multi-touch esterno touchscreen, utilizzando driver non modificati.

Operazione con dispositivo touch

Di seguito è riportato un breve riepilogo del funzionamento dei dispositivi 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 su la posizione e altre caratteristiche di ogni strumento. Inoltre, monitora stati dei pulsanti.
  3. Se hai premuto INDIETRO o INDIETRO: InputReader invia una notifica a InputDispatcher dell'evento chiave.
  4. InputReader determina se è stata eseguita la pressione di un tasto virtuale. Se sì, invia una notifica a InputDispatcher dell'evento chiave.
  5. InputReader determina se il tocco è stato avviato all'interno del limiti del display. In questo caso, invia una notifica a InputDispatcher l'evento touch.
  6. Se non ci sono strumenti toccanti, ma c'è almeno uno strumento che si sposta, InputReader invia una notifica a InputDispatcher dell'evento di passaggio del mouse.
  7. Se il tipo di dispositivo touch è pointer, InputReader esegue il puntatore il rilevamento dei gesti, sposta il puntatore e si posiziona di conseguenza e invia una notifica InputDispatcher sull'evento puntatore.
  8. InputDispatcher utilizza WindowManagerPolicy per determinare se devono essere inviati gli eventi e se devono riattivare il dispositivo. Quindi, InputDispatcher invia gli eventi alle app appropriate.

Configurazione dispositivo touch

Il comportamento del dispositivo touch è determinato dagli assi, dai pulsanti e dalle proprietà di input del dispositivo configurazione del dispositivo di input, mappa dei tasti virtuali e layout dei tasti.

Per ulteriori dettagli sui file che contribuiscono alla configurazione della tastiera:

Proprietà

Il sistema si basa su molte proprietà di configurazione dei dispositivi di input per configurare e calibrare il comportamento del dispositivo touch.

Uno dei motivi è che i driver dei dispositivi touch spesso segnalano le caratteristiche del tocco usando unità specifiche per dispositivo.

Ad esempio, molti dispositivi touch misurano l'area di contatto utilizzando una bilancia specifica per dispositivo interna, come il numero totale nodi dei sensori attivati dal tocco. Questo valore non elaborato della dimensione non essere significativi per le app perché devono conoscere dimensioni fisiche e altre caratteristiche dei nodi dei sensori del dispositivo touch.

Il sistema utilizza parametri di calibrazione codificati nella configurazione del dispositivo di input per decodificare, trasformare e normalizzare i valori riportati dal tocco in una rappresentazione standard più semplice che le app sono in grado di comprendere.

Convenzioni sulla documentazione

A scopo di documentazione, utilizziamo le seguenti convenzioni per descrivere i valori utilizzati dal sistema durante il processo di calibrazione.

Valori asse non elaborati

Le seguenti espressioni indicano i valori non elaborati riportati dal tocco driver di dispositivo 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 in caso contrario disponibili.
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 assi non elaborati

Le seguenti espressioni indicano i limiti dei valori non elaborati. Si ottengono chiamando EVIOCGABS ioctl per ogni asse.

raw.*.min
Il valore minimo incluso dell'asse non elaborato.
raw.*.max
Il valore massimo inclusivo dell'asse non elaborato.
raw.*.range
Equivalente a raw.*.max - raw.*.min.
raw.*.fuzz
La precisione dell'asse non elaborato. ad es. fuzz = 1 implica che i valori siano accurati per +/- 1 unità.
raw.width
La larghezza inclusa dell'area di tocco, equivalente a raw.x.range + 1.
raw.height
L'altezza inclusa dell'area di tocco, equivalente a raw.y.range + 1.

Intervalli di 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 le unità di superficie utilizzate dal dispositivo touch nelle unità di output segnalati ad app come i pixel di visualizzazione.

output.width
La larghezza dell'output. Per i touchscreen (associati a un display), questa è la larghezza di visualizzazione in pixel. Per i touchpad (non associati a un display), la larghezza dell'output è uguale a raw.width e indica che nessuna interpolazione quando viene eseguito il deployment.
output.height
L'altezza dell'output. Per i touchscreen (associati a un display), questa è l'altezza di visualizzazione in pixel. Per i touchpad (non associati a un display), l'altezza dell'output è uguale a raw.height e indica che nessuna interpolazione è è in esecuzione.
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 di input tocco utilizza molte proprietà di configurazione nel dispositivo di input di configurazione del deployment 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 utilizzati per la calibrazione.

tipo.dispositivo

Definizione: touch.deviceType = touchScreen | touchPad | pointer | default

Consente di specificare il tipo di dispositivo touch.

  • Se il valore è touchScreen, il dispositivo touch è un touchscreen associato con un display.

  • Se il valore è touchPad, il dispositivo touch è un touchpad non associato con un display.

  • Se il valore è pointer, il dispositivo touch è un touchpad non associato con un display e i suoi movimenti sono usati per 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, consulta la sezione Classificazione su come il tipo di dispositivo influenza il comportamento del dispositivo touch.

In Android 3 e versioni precedenti, si presumeva che tutti i dispositivi touch fossero touchscreen.

touch.orientationAware

Definizione: touch.orientationAware = 0 | 1

Consente di specificare se il dispositivo touch deve reagire ai cambiamenti di orientamento del display.

  • Se il valore è 1, le posizioni touch riportate 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 sono immuni per modificare l'orientamento del display.

Il valore predefinito è 1 se il dispositivo è un touchscreen, 0 negli altri casi.

Il sistema distingue tra touchscreen e display interni ed esterni. Un touchscreen interno che tiene conto dell'orientamento viene ruotato in base all'orientamento del display interno. Un touch screen esterno ruotato che tiene conto dell'orientamento 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 in senso orario di 90 gradi dal suo orientamento naturale, le posizioni assolute dei tocchi vengono rimappate in modo che un tocco nell'angolo in alto a sinistra del sistema di coordinate assoluto del touchscreen viene segnalata come un tocco nell'angolo in alto a sinistra del sistema di coordinate ruotato del display. Questo avviene in modo che i tocchi vengano registrati con lo stesso sistema di coordinate che le app usano per disegnare i propri elementi visivi.

Prima di Honeycomb, si pensava che tutti i dispositivi touch fossero orientati in modo consapevole.

tocco.gestureMode

Definizione: touch.gestureMode = pointer | spots | default

Consente di specificare 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 in modo simile a un puntatore del mouse.

  • Se il valore è spots, i gesti del touchpad vengono presentati da un ancoraggio che rappresenta il baricentro del gesto e un insieme di macchie circolari che rappresentano la posizione delle singole dita.

Il valore predefinito è pointer quando la proprietà di input INPUT_PROP_SEMI_MT o spots in caso contrario.

Campi X e Y

I campi X e Y forniscono informazioni sulla posizione del centro dell'area di contatto.

Calcolo

Il calcolo è semplice: le informazioni relative alla posizione del driver touch sono dell'interpolazione linearmente nel sistema di coordinate di output.

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

touchMajor, touchMinor, toolMajor, toolMinor, dimensione dei campi

I campi touchMajor e touchMinor descrivono le dimensioni approssimative dell'area di contatto in unità di output (pixel).

I campi toolMajor e toolMinor descrivono le dimensioni approssimative dello strumento stesso in unità di output (pixel).

Il campo size descrive le dimensioni normalizzate del tocco in relazione a il tocco più grande possibile che il dispositivo touch sia in grado di rilevare. Il più piccolo la dimensione normalizzata possibile è 0,0 (nessun contatto o non è misurabile) e la più grande la dimensione normalizzata possibile è 1,0 (l'area del sensore è satura).

Quando è possibile misurare sia la lunghezza che l'ampiezza approssimativa, Campo touchMajor specifica la dimensione più lunga, mentre il campo touchMinor specifica la dimensione più breve dell'area di contatto. Quando è possibile misurare solo il diametro approssimativo dell'area di contatto, i campi touchMajor e touchMinor sono uguali.

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

Se le dimensioni del tocco non sono disponibili, ma le dimensioni dello strumento sono disponibili, allora la dimensione dello strumento è impostato in modo uguale alle dimensioni del tocco. Al contrario, se le dimensioni dello strumento non sono disponibili ma la dimensione del tocco è disponibile, allora la dimensione del tocco è impostata in modo uguale a quella dello strumento.

I dispositivi touch misurano o segnalano le dimensioni del tocco e degli strumenti in vari modi. L'implementazione attuale supporta tre diversi tipi di misurazioni: diametro, area e riquadro di delimitazione geometrico in unità di superficie.

Definizione: touch.size.calibration = none | geometric | diameter | area | default

Specifica il tipo di misurazione utilizzato dal conducente touch per segnalare il dimensioni del tocco e dimensioni degli strumenti.

  • Se il valore è none, la dimensione è impostata su zero.

  • Se il valore è geometric, si presume che la dimensione sia specificata nello stesso le unità di superficie come la posizione, in modo che venga ridimensionato nello stesso modo.

  • Se il valore è diameter, si presume che la dimensione sia proporzionale a il diametro (larghezza) del tocco o dello strumento.

  • Se il valore è area, si presume che la dimensione sia proporzionale al area del tocco o dello strumento.

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

dimensioni.touch.scala

Definizione: touch.size.scale = <un numero in virgola mobile non negativo>

Specifica un fattore di scala costante utilizzato nella calibrazione.

Il valore predefinito è 1.0.

touch.size.bias

Definizione: touch.size.bias = <un numero in virgola mobile non negativo>

Specifica un valore di bias costante utilizzato nella calibrazione.

Il valore predefinito è 0.0.

touch.size.isSommato

Definizione: touch.size.isSummed = 0 | 1

Specifica se la dimensione viene riportata come somma delle dimensioni di tutti contatti attivi oppure viene riportato singolarmente per ogni contatto.

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

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

Il valore predefinito è 0.

Alcuni dispositivi touch, in particolare quelli "Semi-MT" i dispositivi non sono in grado di distinguere dimensioni individuali di più contatti in modo che vengano registrate una misurazione delle dimensioni che rappresentano l'area o la larghezza totali. Questa proprietà deve essere impostata solo su 1 per questi dispositivi. In caso di dubbi, imposta questo valore su 0.

Calcolo

Il calcolo di 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 ci si sta passando il mouse sopra lo strumento.

touch.pressure.calibration

Definizione: touch.pressure.calibration = none | physical | amplitude | default

Specifica il tipo di misurazione utilizzato dal conducente touch per registrare la pressione.

  • Se il valore è none, la pressione è sconosciuta, quindi è impostata su 1,0 quando tocco e 0,0 al passaggio del mouse.

  • Se il valore è physical, si presume che l'asse della pressione misuri l'effettivo valore intensità fisica della pressione applicata al touchpad.

  • Se il valore è amplitude, si presume che l'asse della pressione misuri il segnale ampiezza, che è correlata alle dimensioni del contatto e alla pressione applicata.

  • Se il valore è default, il sistema utilizza la calibrazione physical se il valore asse di pressione disponibile, altrimenti utilizza none.

tocca.pressione.scala

Definizione: touch.pressure.scale = <un numero in virgola mobile non negativo>

Specifica un fattore di scala costante utilizzato nella calibrazione.

Il valore predefinito è 1.0 / raw.pressure.max.

Calcolo

Il calcolo del campo pressure dipende dai parametri di calibrazione specificati.

If touch.pressure.calibration == "physical" or "amplitude":
    output.pressure = raw.pressure * touch.pressure.scale
Else
    If hovering:
        output.pressure = 0
    Else
        output.pressure = 1
    End If
End If

campi di orientamento e inclinazione

Il campo orientation descrive l'orientamento del tocco e dello strumento come misurazione angolare. L'orientamento 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 uno stilo strumento è presente, l'intervallo di orientamento può essere descritto come 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 usato dal driver touch per segnalare l'orientamento.

  • Se il valore è none, l'orientamento è sconosciuto, quindi è impostato su 0.
  • Se il valore è interpolated, l'orientamento viene interpolato linearmente in modo che il valore non elaborato di raw.orientation.min è mappato a -PI/2 e un valore non elaborato pari a raw.orientation.max mappa a PI/2. Il valore centrale di (raw.orientation.min + raw.orientation.max) / 2 mappa a 0.
  • Se il valore è vector, l'orientamento viene interpretato come un vettore compresso di due campi a 4 bit firmati. Questa rappresentazione viene utilizzata nel protocollo Atmel basato su oggetti parti. Quando decodificato, il vettore fornisce un angolo di orientamento e una confidenza magnitudo. La grandezza di confidenza viene utilizzata per scalare le informazioni sulle dimensioni, a meno che non sia geometrica.
  • 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 dalla parametri di calibrazione specificati e 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 il dispositivo touch superficie. Un valore pari a 0,0 indica il contatto diretto, mentre valori più grandi indicano aumentando la distanza dalla superficie.

touch.distance.calibration

Definizione: touch.distance.calibration = none | scaled | default

Specifica il tipo di misurazione utilizzato dal conducente touch per registrare la distanza.

  • Se il valore è none, la distanza è sconosciuta, quindi è impostata su 0.

  • Se il valore è scaled, la distanza registrata viene moltiplicata per fattore di scala costante.

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

tocco.distanza.scala

Definizione: touch.distance.scale = <un numero in virgola mobile non negativo>

Specifica un fattore di scala costante utilizzato nella calibrazione.

Il valore predefinito è 1.0.

Calcolo

Il calcolo del campo distance dipende dalla calibrazione specificata parametri.

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 dei dispositivi touch sono cambiate in modo significativo nel Android Ice Cream Sandwich 4.0. Tutti i file di configurazione del dispositivo di input per il tocco i dispositivi devono essere aggiornati per utilizzare le nuove proprietà di configurazione.

Anche i driver più vecchi dei dispositivi touch potrebbero dover aggiornato.

File di mappe delle chiavi virtuali

I dispositivi touch possono essere utilizzati per implementare tasti virtuali.

Esistono diversi modi per farlo, a seconda delle capacità del il controller touch. Alcuni controller touch possono essere configurati direttamente per implementare tramite softkey impostando i registri firmware. Altre volte è auspicabile eseguire la mappatura dalle coordinate al tocco ai codici chiave nel software.

Se nel software vengono implementate chiavi virtuali, il kernel deve esportare una mappa delle chiavi virtuali denominato virtualkeys.<devicename> come proprietà board. Ad esempio: se il driver del dispositivo touchscreen segnala il suo nome come "touchyfeely" quindi il file della mappa delle chiavi virtuali deve avere il percorso /sys/board_properties/virtualkeys.touchyfeely.

Un file di mappe delle chiavi virtuali descrive le coordinate e i codici chiave Linux delle chiavi virtuali. sul touchscreen.

Oltre al file della mappa delle chiavi virtuali, deve esistere un layout delle chiavi corrispondente e un file di mappe dei caratteri delle chiavi per mappare i codici chiave Linux ai codici chiave Android e per specificare il tipo di tastiera (di solito SPECIAL_FUNCTION).

Sintassi

Un file di mappa delle chiavi virtuali è un file di testo normale costituito da una sequenza di chiavi virtuali le descrizioni dei layout separate da ritorni a capo o da due punti.

Le righe dei commenti iniziano con "#" e prosegui fino alla fine della riga.

Ogni chiave virtuale è descritta da sei componenti delimitati da due punti:

  • 0x01: un codice di versione. Deve sempre essere 0x01.
  • <Codice chiave Linux>: il codice chiave Linux della chiave virtuale.
  • <centerX>: la coordinata dei pixel X del centro della chiave virtuale.
  • <centerY>: la coordinata dei pixel Y del centro della chiave virtuale.
  • <width>: la larghezza della chiave virtuale in pixel.
  • <height>: l'altezza della chiave virtuale in pixel.

Tutte le coordinate e le dimensioni sono specificate nei termini del sistema di coordinate di visualizzazione.

Ecco un file di mappa delle chiavi virtuali, tutto scritto su una sola riga.

# All on one line
0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55

Lo stesso file di mappe delle chiavi virtuali può 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 touchscreen ha una risoluzione di 480x800. Di conseguenza, le chiavi virtuali hanno un <centerY> coordinata di 835, che è un po' più bassa nell'area visibile del touchscreen.

La prima chiave ha un codice di scansione Linux di 158 (KEY_BACK), al centroX di 55, centro Y di 835, larghezza di 90 e altezza di 55.

Esempio

File di mappa delle chiavi virtuali: /sys/board_properties/virtualkeys.touchyfeely.

0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

File di layout della chiave: /system/usr/keylayout/touchyfeely.kl.

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

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

type SPECIAL_FUNCTION

Gesti del puntatore multi-touch indiretti

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

  • Tocco con un dito: fai clic.
  • Movimento con un dito: sposta il puntatore.
  • Movimento di un dito più pressioni di pulsanti: trascina il puntatore.
  • Movimento di due dita con entrambe le dita che si spostano nella stessa direzione: trascina l'area sotto il puntatore in quella direzione. Il puntatore non si sposta.
  • Movimento di due dita con entrambe le dita che si spostano l'una verso l'altra o verso l'altra direzioni diverse: esegui la panoramica, la scalabilità o la rotazione dell'area circostante il puntatore. Il puntatore non si sposta.
  • Movimento di più dita: gesto in formato libero.

Rifiuto del palmo della mano

A partire da Android 13, il sistema può rifiutare automaticamente gli input dai palmi delle mani se è abilitato il framework integrato. Le soluzioni interne, personalizzate sono ancora supportate anche se potrebbe essere necessario modificarlo per restituire il flag TOOL_TYPE_PALM quando un palmo viene rilevata. Il framework integrato funziona anche in combinazione con soluzioni personalizzate.

Il modello effettivo esamina i primi 90 ms di dati dei gesti, il puntatore corrente e i puntatori circostanti, poi considera la distanza dal bordo del display ai tocchi. Determina quindi, in base ai puntatori, quali sono i palmi delle mani. Prende inoltre in considerazione prendere in considerazione le dimensioni di ciascun contatto, come riportato da touchMajor e touchMinor. Il framework Android rimuove quindi i puntatori contrassegnati come palmi delle mani dal flusso tattile.

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'attuale non deve attivare un'azione dell'utente. Questo flag è impostato sia per ACTION_CANCEL e ACTION_POINTER_UP.

Se il puntatore del palmo non è stato inviato alle app, il sistema semplicemente rilascia l'indicatore.

Attiva rifiuto del palmo della mano

  1. Nel driver touch, utilizza Macro input_abs_set_res per impostare le risoluzioni per i seguenti campi (le unità sono pixel per mm):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    Il supporto per ABS_MT_TOUCH_MINOR è facoltativo. Tuttavia, se il tuo dispositivo che la supportano, assicurati che la risoluzione sia impostata correttamente.

  2. Per verificare che i campi siano impostati correttamente, esegui:
        $ adb shell getevent -li
    
  3. Per abilitare la funzionalità durante il runtime, esegui:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Riavvia il processo system_server.
         $ adb shell stop && adb shell start
        
  5. Conferma che adb shell dumpsys input mostri la presenza di respintori del palmo della mano all'interno UnwantedInteractionBlocker. In caso contrario, controlla i log correlati all'input per trovare indizi su ciò che potrebbe non essere configurato correttamente.

    Vedi l'esempio seguente come riferimento:

    UnwantedInteractionBlocker:
      mEnablePalmRejection: true
      isPalmRejectionEnabled (flag value): true
      mPalmRejectors:
        deviceId = 3:
          mDeviceInfo:
            max_x = 
            max_y = 
            x_res = 11.00
            y_res = 11.00
            major_radius_res = 1.00
            minor_radius_res = 1.00
            minor_radius_supported = true
            touch_major_res = 1
            touch_minor_res = 1
          mSlotState:
            mSlotsByPointerId:
    
            mPointerIdsBySlot:
    
          mSuppressedPointerIds: {}
    
  6. Per abilitare definitivamente la funzionalità, aggiungi il comando sysprop corrispondente nel tuo init**rc file:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Continua a leggere