File di layout chiave

I file di layout dei tasti (file .kl ) associano i codici chiave e i codici degli assi Linux ai codici chiave e ai codici degli assi Android e specificano i flag di policy associati. I file di layout dei tasti specifici del dispositivo sono:

  • Necessario per i dispositivi di input interni (integrati) dotati di tasti, inclusi tasti speciali come volume, accensione e tasti multimediali dell'auricolare.
  • Facoltativo per altri dispositivi di input ma consigliato per tastiere e joystick per scopi speciali.

Se non è disponibile alcun file di layout dei tasti specifico del dispositivo, il sistema sceglie invece quello predefinito.

Posizione

I file di layout chiave vengono individuati in base al fornitore USB, all'ID del prodotto (e facoltativamente alla versione) o al nome del dispositivo di input. Si consultano in ordine i seguenti percorsi:

  • /odm/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /vendor/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
  • /odm/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /vendor/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl
  • /odm/usr/keylayout/DEVICE_NAME.kl
  • /vendor/usr/keylayout/DEVICE_NAME.kl
  • /system/usr/keylayout/DEVICE_NAME.kl
  • /data/system/devices/keylayout/DEVICE_NAME.kl
  • /odm/usr/keylayout/Generic.kl
  • /vendor/usr/keylayout/Generic.kl
  • /system/usr/keylayout/Generic.kl
  • /data/system/devices/keylayout/Generic.kl

Quando si costruisce un percorso file che contiene il nome del dispositivo, tutti i caratteri nel nome del dispositivo diversi da '0'-'9', 'a'-'z', 'A'-'Z', '-' o '_' vengono sostituiti da '_'.

File di layout dei tasti generico

Il sistema fornisce uno speciale file di layout dei tasti generico integrato chiamato Generic.kl . Questo layout di tasti è progettato per supportare una varietà di tastiere e joystick esterni standard. Non modificare il layout dei tasti generico!

Sintassi

Un file di layout chiave è un file di testo semplice costituito da dichiarazioni e flag di chiave o asse.

Dichiarazioni chiave

Le dichiarazioni di chiave sono costituite dalla parola chiave key seguita da un numero di codice chiave Linux e da un nome in codice chiave Android oppure dall'utilizzo della parola chiave seguito da un utilizzo HID e da un nome in codice chiave Android. L'utilizzo dell'HID è rappresentato come un numero intero a 32 bit, dove i 16 bit alti rappresentano la pagina di utilizzo dell'HID e i 16 bit bassi rappresentano l'ID di utilizzo dell'HID. Entrambe le dichiarazioni possono essere seguite da un set facoltativo di flag di policy delimitati da spazi.

key 1     ESCAPE
key 114   VOLUME_DOWN
key 16    Q                 VIRTUAL
key usage 0x0c006F          BRIGHTNESS_UP

Vengono riconosciuti i seguenti flag di policy:

  • FUNCTION : Il tasto va interpretato come se fosse premuto anche il tasto FUNZIONE.
  • GESTURE : il tasto generato da un gesto dell'utente, come il palming del touchscreen.
  • VIRTUAL : il tasto è un tasto virtuale virtuale (pulsante capacitivo) adiacente al touch screen principale. Ciò fa sì che venga abilitata una speciale logica antirimbalzo (vedi sotto).

Dichiarazioni dell'Asse

Ciascuna dichiarazione dell'asse è costituita dalla parola chiave axis seguita da un numero di codice dell'asse Linux e da qualificatori che controllano il comportamento dell'asse, incluso almeno un nome in codice dell'asse Android.

Assi fondamentali

Un asse di base mappa semplicemente un codice asse Linux su un nome in codice asse Android. La seguente dichiarazione associa ABS_X (indicato da 0x00 ) a AXIS_X (indicato da X ).

axis 0x00 X

Nell'esempio precedente, se il valore di ABS_X è 5 , AXIS_X è impostato su 5 .

Assi divisi

Un asse diviso mappa un codice asse Linux su due nomi di codice asse Android, in modo tale che i valori inferiori o superiori a una soglia vengano suddivisi su due assi diversi quando mappati. Questa mappatura è utile quando un singolo asse fisico riportato dal dispositivo codifica due diversi assi logici mutuamente esclusivi.

La seguente dichiarazione mappa i valori dell'asse ABS_Y (indicato da 0x01 ) su AXIS_GAS quando inferiore a 0x7f o su AXIS_BRAKE quando maggiore di 0x7f .

axis 0x01 split 0x7f GAS BRAKE

Nell'esempio sopra, se il valore di ABS_Y è 0x7d allora AXIS_GAS è impostato su 2 ( 0x7f - 0x7d ) e AXIS_BRAKE è impostato su 0 . Al contrario, se il valore di ABS_Y è 0x83 allora AXIS_GAS è impostato su 0 e AXIS_BRAKE è impostato su 4 ( 0x83 - 0x7f ). Infine, se il valore di ABS_Y è uguale al valore diviso di 0x7f , sia AXIS_GAS che AXIS_BRAKE sono impostati su 0 .

Assi invertiti

Un asse invertito inverte il segno del valore dell'asse. La seguente dichiarazione associa ABS_RZ (indicato da 0x05 ) a AXIS_BRAKE (indicato da BRAKE ) e inverte l'output negandolo.

axis 0x05 invert BRAKE

Nell'esempio precedente, se il valore di ABS_RZ è 2 , AXIS_BRAKE è impostato su -2 .

Opzione appartamento centrale

Un dispositivo joystick può segnalare eventi di input anche quando il joystick non viene utilizzato, a causa del rumore. Questo rumore proviene tipicamente dalle levette sinistra e/o destra e fa sì che il conducente riporti un valore di posizione vicino a 0. Il valore "centro piatto" specifica la quantità di rumore che ci si aspetta dal controller a riposo.

Il protocollo di input di Linux fornisce un modo per i driver dei dispositivi di input di specificare il valore centrale piatto degli assi del joystick, ma non tutti i driver lo segnalano e alcuni di essi forniscono valori errati. Per risolvere questo problema, una dichiarazione dell'asse può essere seguita da un'opzione flat che specifica la larghezza della regione attorno alla posizione centrale dell'asse che dovrebbe essere considerata centrata.

Ad esempio, se un driver di dispositivo riporta valori per AXIS_X compresi tra 0 e 100, 0 verrà mappato su -1 e 100 verrà mappato su 1 dal sistema di input Android. Il centro dell'intervallo sarà 50 nelle coordinate non scalate e 0 nelle coordinate scalate. Se un valore piatto è uguale a 10, gli sviluppatori dovrebbero presupporre che qualsiasi valore AXIS_X riportato tra -0,1 e 0,1 (tra 40 e 60 in coordinate non scalate) sia rumore e considerare tali valori provenienti dal joystick come zero.

Nota : mentre il file di layout dei tasti specifica il valore per lo spazio delle coordinate del driver, il valore riportato da android.view.InputDevice.MotionRange#getFlat() è nello spazio delle coordinate Android.

axis 0x03 Z flat 4096

Nell'esempio precedente, il valore centrale piatto è impostato su 4096 .

Commenti

Le righe di commento iniziano con # e continuano fino alla fine della riga:

# A comment!

Le righe vuote vengono ignorate.

Esempi

Tastiera

# This is an example of a key layout file for a keyboard.

key 1     ESCAPE
key 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 12    MINUS
key 13    EQUALS
key 14    DEL

# etc...

Controlli di sistema

# This is an example of a key layout file for basic system controls,
# such as volume and power keys which are typically implemented as GPIO pins
# the device decodes into key presses.

key 114   VOLUME_DOWN
key 115   VOLUME_UP
key 116   POWER

Pulsanti capacitivi

# This is an example of a key layout file for a touch device with capacitive buttons.

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

Controlli multimediali per il jack dell'auricolare

# This is an example of a key layout file for headset mounted media controls.
# A typical headset jack interface might have special control wires or detect known
# resistive loads as corresponding to media functions or volume controls.
# This file assumes that the driver decodes these signals and reports media
# controls as key presses.

key 163   MEDIA_NEXT
key 165   MEDIA_PREVIOUS
key 226   HEADSETHOOK

Telecomando da gioco

# This is an example of a key layout file for a joystick.

# These are the buttons that the joystick supports, represented as keys.
key 304   BUTTON_A
key 305   BUTTON_B
key 307   BUTTON_X
key 308   BUTTON_Y
key 310   BUTTON_L1
key 311   BUTTON_R1
key 314   BUTTON_SELECT
key 315   BUTTON_START
key 316   BUTTON_MODE
key 317   BUTTON_THUMBL
key 318   BUTTON_THUMBR

# Left and right stick.
# The reported value for flat is 128 in a range of -32767 to 32768, which is absurd.
# This confuses applications that rely on the flat value because the joystick
# actually settles in a flat range of +/- 4096 or so. We override it here.
axis 0x00 X flat 4096
axis 0x01 Y flat 4096
axis 0x03 Z flat 4096
axis 0x04 RZ flat 4096

# Triggers.
axis 0x02 LTRIGGER
axis 0x05 RTRIGGER

# Hat.
axis 0x10 HAT_X
axis 0x11 HAT_Y

Tasti virtuali virtuali

Il sistema di input fornisce funzionalità speciali per l'implementazione dei softkey virtuali nei seguenti casi d'uso:

  1. Se i tasti virtuali vengono visualizzati graficamente sullo schermo (come sul Galaxy Nexus), vengono implementati dal componente Barra di navigazione nel pacchetto UI di sistema. Poiché i tasti virtuali virtuali sono implementati a un livello elevato nel sistema, i file di layout dei tasti non sono coinvolti e le seguenti informazioni non si applicano.
  2. Se i tasti virtuali sono implementati come un'area toccabile estesa che fa parte del touch screen principale (come sul Nexus One), il sistema di input utilizza un file di mappa dei tasti virtuali per tradurre le coordinate tattili X/Y in codici tasti Linux, quindi utilizza il file di layout dei tasti per tradurre i codici dei tasti Linux in codici dei tasti Android (per dettagli sui file delle mappe dei tasti virtuali, vedere Dispositivi touch ). Il file di layout dei tasti per il dispositivo di input del touch screen deve specificare la mappatura dei tasti appropriata e includere il flag VIRTUAL per ciascun tasto.
  3. Se i tasti virtuali sono implementati come pulsanti capacitivi separati dal touch screen principale (come sul Nexus S), il driver o il firmware del dispositivo kernel è responsabile della traduzione dei tocchi in codici chiave Linux che il sistema di input poi traduce in codici chiave Android. utilizzando il file di layout dei tasti. Il file di layout dei tasti per il dispositivo di input del pulsante capacitivo deve specificare la mappatura dei tasti appropriata e includere il flag VIRTUAL per ciascun tasto.

Quando i softkey virtuali si trovano all'interno o in prossimità fisica del touch screen, è facile per gli utenti premere accidentalmente un pulsante quando si tocca la parte inferiore dello schermo o quando si fa scorrere un dito dall'alto verso il basso o dal basso verso l'alto. in alto sullo schermo. Per evitare ciò, il sistema di input applica un leggero antirimbalzo in modo che la pressione dei tasti virtuali venga ignorata per un breve periodo di tempo dopo l'ultimo tocco sul touch screen (questo ritardo è chiamato tempo di silenzio dei tasti virtuali ).

Per abilitare il rimbalzo dei tasti virtuali virtuali:

  1. Fornire un file di layout dei tasti per il touch screen o il dispositivo di input dei pulsanti capacitivi con il flag VIRTUAL impostato per ciascun tasto.
    key 139    MENU           VIRTUAL
    key 172    HOME           VIRTUAL
    key 158    BACK           VIRTUAL
    key 217    SEARCH         VIRTUAL
    
  2. Imposta il valore del tempo di quiete della chiave virtuale in una sovrapposizione di risorse per la risorsa framework config.xml .
    <!-- Specifies the amount of time to disable virtual keys after the screen
    is touched to filter out accidental virtual key presses due to swiping gestures
    or taps near the edge of the display. May be 0 to disable the feature.
    It is recommended that this value be no more than 250 ms.
    This feature should be disabled for most devices. -->
    
    <integer name="config_virtualKeyQuietTimeMillis">250</integer>
    

Validazione

Dovresti convalidare i file di layout dei tasti utilizzando lo strumento Validate Keymaps .