2013-07-18 76 views
12

我想讓鍵盤中的某些鍵與其他鍵不同。如何更改Android軟鍵盤中任意鍵的關鍵背景

例如,像移,刪除,空格鍵在下面的照片:

enter image description here

據來自谷歌的參考文獻。在「input.xml」使用「android:[email protected]/xxx」可以改變鍵的背景,但是它改變了鍵盤中所有鍵的背景。

儘管qwerty.xml中的「android:keyicon」可以更改單個關鍵字,但它僅替換標籤。同時,使用「android:keyicon」,圖像不能覆蓋整個按鍵,圖像將比按鍵背景小一點。

什麼是改變一些鍵的背景的正確方法?

+0

可以參考以下鏈接 1. [鏈接1] [1] 2. [鏈接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-改變背景色或 - 主題的密鑰-動態-i的n-custom-keyboard-a – ashishmohite

回答

13

目前還不清楚您是否瞭解如何創建自定義鍵盤。如果你沒有,here's一個小的可下載的項目,創建一個自定義的數字鍵盤。對於那裏的CustomKeyboardView類或您自己的自定義鍵盤類,請添加以下方法。它覆蓋onDraw()方法並繪製用代碼7(在本例中爲「0」)紅色和所有其他鍵爲藍色定義的鍵的背景。

@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

在這種情況下,我沒有使用9補丁圖像,但只是一些簡單的50%透明正方形圖像,取得其中現有的按鈕僅與顏色着色的效果我通緝。爲了獲得更加自定義的結果,我可以製作我的可繪製9幅圖像並執行以下操作。請注意,帶有圖標的兩個鍵不能正確呈現,因爲它們沒有被定義爲9-補丁圖像,我沒有采取任何特殊的努力使它們在這個例子中很好地擴展。我也沒有解決各種鍵的使用不同的圖像/效果;其他人已經表明如何做到這一點。

@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

謝謝!您的示例幫助我在重命名數據包時發現錯誤。我需要刪除生成Java並重新生成它。 –

0

我不能發表評析,所以我把一個鏈接到一個類似的問題,我發現那裏是我認爲它很好的解決方案,通過代碼做:

Customize the appearance of a <Key>

+0

您指的是在Key上繪製文本的解決方案。該OP是關於改變關鍵背景。 –

6

的第一件事需要注意的是,在XML中沒有簡單的方法來做到這一點,你需要用Java來完成。

您可以使用下面的代碼段獲得密鑰列表:

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

一旦你有鑰匙的列表,你可以遍歷它們找到你想要改變的,使用了環這樣的:

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

Please refer to the documentation here for the properties of Keyboard.Key in Android.您可能需要使用the codes來區分的關鍵。

你會注意到沒有直接的方法來改變一個鍵的背景顏色。但是,有一種方法可以更改圖標,因此可以使用它來模擬相同的行爲。您可以生成包含所需顏色的可繪製對象,並將其設置爲圖標。您可以使用NinePatchDrawable

您可以在onStartInputView()方法或onDraw()方法中添加此功能。你可以看到一段代碼here

或者,您可以決定實現自己的鍵盤。如果你想這樣做,你可以看到Android的執行here。您可以複製並直接修改它以滿足您的需求。