2010-07-06 55 views
7

Làm cách nào tôi có thể đặt hình nền cho mỗi phím trên bàn phím Android. Bàn phím Xem android: keyBackground cung cấp một nền cho tất cả các phím. Nhưng tôi muốn đặt nền tảng khác nhau cho mỗi phím.Bàn phím Android. Phím nền

+0

Bạn có bất kỳ succes với các thiết lập tùy chỉnh keybackgrounds cho một chìa khóa duy nhất trên bàn phím? – Wouter

Trả lời

5

Nếu bạn đang viết IME của riêng mình, hãy thử sử dụng một hình vẽ cho hình ảnh FOREground (với android: keyIcon trong XML hoặc Key.icon trong Java) bằng với kích thước của toàn bộ khóa. Điều này về cơ bản là tương đương với thiết lập hình nền của một phím duy nhất. Tất nhiên bạn cũng sẽ phải bao gồm tiền cảnh trong hình ảnh của bạn.

Bạn cũng sẽ phải sử dụng hình nền không có đệm, vì vậy nó không liếc xung quanh các cạnh. Xem gửi bài này để biết chi tiết về làm thế nào để làm điều này: how does a 9patch png work in android apps

Barry

+0

bất kỳ mã mẫu nào cho điều này? – usman

2

Tôi cũng đang cố thực hiện điều này. Nền chính được vẽ trong onBufferDraw() trong lớp KeyboardView. Vấn đề là nó là một phương pháp riêng, vì vậy bạn không thể ghi đè nó với một lớp con. Vì vậy, tôi đã thử sao chép KeyboardView hoàn toàn và sửa đổi, nhưng nó sử dụng tài nguyên com.android.internal.R, mà một ứng dụng bên ngoài không có quyền truy cập. Cách tiếp cận đó không hiệu quả.

Tại thời điểm này, nó bắt đầu trông giống như tôi phải ném các lớp bàn phím của Android ra ngoài cửa sổ và viết toàn bộ từ đầu - tất cả b/c Tôi không thể thay đổi hình nền của phím cách. Nực cười.

+0

Bắt đầu từ đầu không phải là khó khăn. Trong thực tế, bạn chỉ có thể sao chép/dán KeyboardView.java từ nguồn mở vào một lớp con mới của KeyboardView và bắt đầu tùy chỉnh nó cho phù hợp với mục đích của bạn. –

+0

Nhiều lớp trong Android không thể tùy chỉnh. Sẽ dễ dàng hơn nếu hoàn thành kiến ​​trúc của Android khi sử dụng các đại biểu (hoặc người nghe) và cho phép thay thế các lớp trợ giúp tại nhiều điểm hơn. – Huperniketes

+0

Tôi đề nghị sao chép/dán KeyboardView.java vào lớp xem bàn phím tùy chỉnh của riêng bạn. Bằng cách đó bạn sẽ có được tất cả các chức năng được viết sẵn và bạn có thể ghi đè lên bất cứ điều gì bạn cần. Đó là những gì tôi đã làm. –

4

tôi tùy chỉnh MyKeyBoradView mở rộng KeyBoardView và ghi đè lên các phương pháp 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); 
    } 

} 

}

Hiệu quả thực hiện như sau enter image description here

liên kết này: https://github.com/xuejinwei/NumberKeyboard

Các vấn đề liên quan