2010-07-06 4 views
7

Как установить фоны для каждой клавиши на клавиатуре Android. KeyboardView android: keyBackground предоставляет один фон для всех ключей. Но я хочу установить разные фоны для каждого ключа.Android-клавиатура. Фон ключа

+0

Вы имели какой-либо SucceS с пользовательскими настройками keybackgrounds для одной клавиши на клавиатуре? – Wouter

ответ

5

Если вы пишете свой собственный IME, попробуйте использовать чертеж FOREground (с андроидом: keyIcon в XML или Key.icon в Java), который равен размеру всего ключа. Это по существу эквивалентно установке фонового изображения одного ключа. Конечно, вам также придется включить передний план в свой образ.

Вам также придется использовать фоновое изображение без прокладки, чтобы оно не заглядывало по краям. Смотрите объявление для подробной информации о том, как это сделать: how does a 9patch png work in android apps

Барри

+0

любой образец кода для этого? – usman

2

Я тоже пытался это сделать. Основной фон рисуется в onBufferDraw() в классе KeyboardView. Проблема в том, что это частный метод, поэтому вы не можете переопределить его подклассом. Поэтому я попытался полностью копировать KeyboardView и модифицировать его, но он использует ресурсы com.android.internal.R, к которым у внешнего приложения нет доступа. Так что этот подход не работает.

На данный момент это начинает выглядеть так, как будто я должен выкинуть классы клавиатуры Android из окна и написать все это с нуля - all b/c. Я не могу изменить фоновое изображение пробела. Смешной.

+0

Начиная с нуля это не так сложно. Фактически вы можете просто скопировать/вставить KeyboardView.java из открытого источника в новый подкласс KeyboardView и начать настраивать его в соответствии с вашими потребностями. –

+0

Многие классы в Android - это то, что невозможно настроить. Это было бы намного проще, если бы в архитектуре Android использовались делегаты (или слушатели) и разрешали замену вспомогательных классов в большем количестве очков. – Huperniketes

+0

Я предлагаю копировать/вставлять KeyboardView.java в свой собственный класс клавиатуры. Таким образом, вы получаете всю функциональность, предварительно написанную, и вы можете переопределить все, что вам нужно. Вот что я сделал. –

4

Я обычай MyKeyBoradView продлить KeyBoardView и переопределить метод OnDraw.

public class MyKeyBoardView extends KeyboardView { 
private Context mContext; 
private Keyboard mKeyBoard; 

public MyKeyBoardView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this.mContext = context; 
} 

public MyKeyBoardView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    this.mContext = context; 
} 

/** 
* ov 
*/ 
@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    mKeyBoard = this.getKeyboard(); 
    List<Key> keys = null; 
    if (mKeyBoard != null) { 
     keys = mKeyBoard.getKeys(); 
    } 

    if (keys != null) { 
     for (Key key : keys) { 
      // TODO: 16/8/23 different key set the different background 
      if (key.codes[0] == -4) { 
       drawKeyBackground(R.drawable.bg_keyboardview_yes, canvas, key); 
       drawText(canvas, key); 
      } 
     } 
    } 
} 

private void drawKeyBackground(int drawableId, Canvas canvas, Key key) { 
    Drawable npd = mContext.getResources().getDrawable(
      drawableId); 
    int[] drawableState = key.getCurrentDrawableState(); 
    if (key.codes[0] != 0) { 
     npd.setState(drawableState); 
    } 
    npd.setBounds(key.x, key.y, key.x + key.width, key.y 
      + key.height); 
    npd.draw(canvas); 
} 

private void drawText(Canvas canvas, Key key) { 
    Rect bounds = new Rect(); 
    Paint paint = new Paint(); 
    paint.setTextAlign(Paint.Align.CENTER); 


    paint.setAntiAlias(true); 

    paint.setColor(Color.WHITE); 
    if (key.label != null) { 
     String label = key.label.toString(); 

     Field field; 

     if (label.length() > 1 && key.codes.length < 2) { 
      int labelTextSize = 0; 
      try { 
       field = KeyboardView.class.getDeclaredField("mLabelTextSize"); 
       field.setAccessible(true); 
       labelTextSize = (int) field.get(this); 
      } catch (NoSuchFieldException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
      paint.setTextSize(labelTextSize); 
      paint.setTypeface(Typeface.DEFAULT_BOLD); 
     } else { 
      int keyTextSize = 0; 
      try { 
       field = KeyboardView.class.getDeclaredField("mLabelTextSize"); 
       field.setAccessible(true); 
       keyTextSize = (int) field.get(this); 
      } catch (NoSuchFieldException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
      paint.setTextSize(keyTextSize); 
      paint.setTypeface(Typeface.DEFAULT); 
     } 

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

} 

}

Реализация эффект заключается в следующем enter image description here

Это ссылки: https://github.com/xuejinwei/NumberKeyboard