2013-07-18 3 views
12

Я хочу, чтобы некоторые из моих клавиш на клавиатуре отличались от других.Как сменить ключевой фон любого ключа в мягкой клавиатуре Android

Например, как сдвиг, удаление, клавиши пробела в фото ниже:

enter image description here

Согласно справочным документам от Google. Мы можем изменить фон фона, используя «android:[email protected]/xxx» в «input.xml», но он меняет фон всех клавиш на клавиатуре.

Несмотря на то, что «android: keyicon» в qwerty.xml может быть изменена одна клавиша, но она заменяет только метку. Между тем, используйте «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 -в-переключающий цвет фона или-тема-из-ключей-динамически-я 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

Вы указываете на решение, которое рисует текст на ключе. 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. Вы можете скопировать это и изменить его прямо в соответствии с вашими потребностями.

Смежные вопросы