2010-07-06 13 views
7

¿Cómo puedo configurar fondos para cada tecla en el teclado de Android? KeyboardView android: keyBackground proporciona un fondo para todas las teclas. Pero quiero establecer diferentes fondos para cada clave.teclado Android. Fondo de la clave

+0

¿Ha tenido algún éxito con los ajustes keybackgrounds personalizado para una sola tecla en el teclado? – Wouter

Respuesta

5

Si está escribiendo su propio IME, intente utilizar un drawable para la imagen FOREground (con android: keyIcon en XML o Key.icon en Java) que sea igual al tamaño de la clave completa. Esto es esencialmente equivalente a establecer la imagen de fondo de una sola tecla. Por supuesto, también deberá incluir el primer plano en su imagen.

También tendrá que usar una imagen de fondo sin relleno, para que no se asome por los bordes. Ver esta publicación para más detalles sobre cómo hacer esto: how does a 9patch png work in android apps

Barry

+0

cualquier código de muestra para esto? – usman

2

He estado tratando de hacer esto también. El fondo de la clave se dibuja enBufferDraw() en la clase KeyboardView. El problema es que es un método privado, por lo que no puede anularlo con una subclase. Así que intenté copiar KeyboardView por completo y modificar eso, pero usa los recursos com.android.internal.R, a los que una aplicación externa no tiene acceso. Entonces ese enfoque no funciona.

En este momento está empezando a parecer que tengo que lanzar las clases de teclado de Android por la ventana y escribir todo desde cero --todo b/c No puedo cambiar la imagen de fondo de la tecla de espacio. Ridículo.

+0

Empezar de cero no es tan difícil. De hecho, puede simplemente copiar/pegar KeyboardView.java desde el código abierto en una nueva subclase de KeyboardView, y comenzar a personalizarlo para adaptarlo a sus propósitos. –

+0

Muchas clases en Android son imposibles de personalizar. Sería mucho más fácil de lograr si la arquitectura de Android utilizara delegados (u oyentes) y permitiera el reemplazo de clases de ayuda en más puntos. – Huperniketes

+0

Sugiero copiar/pegar KeyboardView.java en su propia clase de vista de teclado personalizada. De esta forma, obtienes toda la funcionalidad previamente escrita y puedes anular todo lo que necesites. Eso fue lo que hice. –

4

me encargo MyKeyBoradView extender el KeyBoardView y reemplazar el método 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); 
    } 

} 

}

El efecto realización es el siguiente enter image description here

Esta enlaces: https://github.com/xuejinwei/NumberKeyboard

Cuestiones relacionadas