2013-07-18 9 views
12

Desidero che alcuni tasti della tastiera siano diversi dagli altri.come modificare lo sfondo chiave di qualsiasi tasto nella tastiera virtuale Android

Ad esempio, come spostamento, cancellare, chiave di spazio nella foto sotto:

enter image description here

Secondo i documenti di riferimento da parte di Google. Possiamo cambiare lo sfondo della chiave usando "android:[email protected]/xxx" in "input.xml", ma cambia lo sfondo di tutti i tasti della tastiera.

Anche se "android: keyicon" in qwerty.xml può avere una singola chiave modificata, ma sostituisce solo l'etichetta. Nel frattempo, utilizzare "android:keyicon", l'immagine non può coprire l'intera chiave, l'immagine sarà un po 'più piccola dello sfondo chiave.

Qual è il modo corretto per modificare lo sfondo di alcuni tasti?

+0

È possibile fare riferimento seguendo i link 1. [link 1] [1] 2. [link 2] [2] [1]: http: //stackoverflow.com/questions/15789997/how-to-change-background-color-of-key-for-android-soft-keyboard [2]: http://stackoverflow.com/questions/18180136/how -to-cambio-background-color-o-theme-of-chiavi-dinamico-i n-custom-keyboard-a – ashishmohite

risposta

13

Non è chiaro se si capisca come creare una tastiera personalizzata o meno. Nel caso in cui non lo fai, here's un piccolo progetto scaricabile che crea una tastiera numerica personalizzata. Alla classe CustomKeyboardView lì o alla tua classe di tastiera personalizzata, aggiungi il seguente metodo. Sostituisce il metodo onDraw() e disegna lo sfondo della chiave definita con il codice 7 (in questo caso lo "0") rosso e tutti gli altri tasti blu.

@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    List<Key> keys = getKeyboard().getKeys(); 
    for (Key key : keys) {    
     if (key.codes[0] == 7) { 
      Log.e("KEY", "Drawing key with code " + key.codes[0]); 
      Drawable dr = (Drawable) context.getResources().getDrawable(R.drawable.red_tint); 
      dr.setBounds(key.x, key.y, key.x + key.width, key.y + key.height); 
      dr.draw(canvas); 

     } else { 
      Drawable dr = (Drawable) context.getResources().getDrawable(R.drawable.blue_tint); 
      dr.setBounds(key.x, key.y, key.x + key.width, key.y + key.height); 
      dr.draw(canvas); 
     }    
    } 
} 

tinted keys

In questo caso, non ho usato immagini 9-patch, ma solo alcune semplici 50% immagini quadrati trasparenti e raggiunto un effetto per cui i pulsanti esistenti sono semplicemente tinti con i colori che ricercato. Per ottenere un risultato più personalizzato, potrei creare le mie immagini drawable a 9 patch e procedere come segue. Nota che i due tasti con le icone non vengono visualizzati correttamente perché non sono definiti come immagini con 9 patch e non ho fatto alcuno sforzo particolare per farli scalare bene per questo esempio. Inoltre non ho affrontato l'uso di immagini/effetti diversi per i vari stati per le chiavi; altri hanno mostrato come farlo.

@Override 
public void onDraw(Canvas canvas) { 
    // super.onDraw(canvas); 

    List<Key> keys = getKeyboard().getKeys(); 
    for (Key key : keys) { 
     if (key.codes[0] == 7) { 
      NinePatchDrawable npd 
       = (NinePatchDrawable) context.getResources().getDrawable(R.drawable.red_key); 
      npd.setBounds(key.x, key.y, key.x + key.width, key.y + key.height); 
      npd.draw(canvas); 

     } else { 
      NinePatchDrawable npd 
       = (NinePatchDrawable) context.getResources().getDrawable(R.drawable.blue_key); 
      npd.setBounds(key.x, key.y, key.x + key.width, key.y + key.height); 
      npd.draw(canvas); 
     } 

     Paint paint = new Paint(); 
     paint.setTextAlign(Paint.Align.CENTER); 
     paint.setTextSize(48); 
     paint.setColor(Color.GRAY); 

     if (key.label != null) { 
      canvas.drawText(key.label.toString(), key.x + (key.width/2), 
          key.y + (key.height/2), paint); 
     } else { 
      key.icon.setBounds(key.x, key.y, key.x + key.width, key.y + key.height); 
      key.icon.draw(canvas); 
     } 
    } 
}  

replaced keys

+0

Grazie! il tuo esempio mi aiuta a trovare un bug quando rinominare il pacchetto. Devo cancellare il generare Java e rigenerarlo. –

0

non posso postare pervenire al seguente indirizzo, così ho messo un link ad una domanda simile che ho trovato in cui v'è una soluzione che penso che sia bene, farlo per codice:

Customize the appearance of a <Key>

+0

Stai indicando una soluzione che disegna il testo su una chiave. L'OP riguardava il cambiamento del background di Key. –

6

La prima cosa da si noti che non esiste un modo semplice per farlo in XML, sarà necessario farlo in Java.

È possibile ottenere l'elenco delle chiavi utilizzando il seguente pezzo di codice:

Keyboard keyboard = keyboardView.getKeyboard(); 
List<Key> keys = keyboard.getKeys(); 

Una volta che avete l'elenco delle chiavi, si può scorrere attraverso di loro per trovare quelli che si desidera modificare, utilizzando una per ciclo come:

for (Key key : keys) { 
    ... 
} 

Please refer to the documentation here for the properties of Keyboard.Key in Android. probabilmente si vorrà utilizzare the codes per distinguere le chiavi.

Si noterà che non esiste un modo diretto per modificare il colore di sfondo di un tasto. Tuttavia, c'è un modo per cambiare l'icona, quindi puoi usarlo per simulare lo stesso comportamento. È possibile generare oggetti disegnabili che contengono il colore necessario e impostarlo come icona. È possibile utilizzare uno NinePatchDrawable.

È possibile aggiungere questa funzionalità nel metodo onStartInputView() o nel metodo onDraw(). È possibile vedere un pezzo di codice che è presumibilmente funzionante here.

In alternativa, è possibile decidere di implementare la propria tastiera. Nel caso in cui si desideri farlo, è possibile vedere l'implementazione Android here. È possibile copiare questo e modificarlo direttamente in base alle proprie esigenze.