更改android自定义键盘

时间:2016-05-29 11:53:59

标签: java android unicode fonts keyboard

我在更改Android自定义键盘的自定义键的字体样式(非英语 - Unicode)时遇到问题。 我跟着类似于link的回答的内容 它似乎适用于单个字符按钮。它会将整个应用程序的字体更改为新字体,包括键盘的单个字符键。 如果我想改变关键文本的大小,我可以在两个条目下面使用

android:keyTextSize="25sp" // for single character keys
android:labelTextSize="20sp" // for multiple character keys

但遗憾的是,上述链接中的方法仅适用于单个字符键。有没有办法设置多个字符键的字体。

见下图,例如: 第一个按钮有一些默认的系统字体,而第二个和第三个按钮有正确的字体。

enter image description here

修改: 在阅读 Bhavita Lalwani answer后,它让我思考。

if (label != null) {
        // For characters, use large font. For labels like "Done", use small font.
        if (label.length() > 1 && key.codes.length < 2) {
            paint.setTextSize(mLabelTextSize);
            paint.setTypeface(Typeface.DEFAULT_BOLD);
        } else {
            paint.setTextSize(mKeyTextSize);
            paint.setTypeface(Typeface.DEFAULT);
                }
            }

这里说

if (label.length() > 1 && key.codes.length < 2)

因此,只有具有单个代码的BOLD字体才能用于多个字符。 例如。我认为Android Engs正在考虑这些事情。 ???

Keyboard.KEYCODE_DONE
Keyboard.KEYCODE_DELETE

因此,丑陋的解决方法是添加多个代码,并在需要时仅使用第一个代码。

<Key android:codes="5001,1" android:keyLabel="AB" android:keyWidth="12%p" />

现在,每个具有多个代码的密钥也都是用户DEFAULT字体。 这暂时有用,(直到找到合适的解决方案:))

1 个答案:

答案 0 :(得分:2)

我在创建印地语自定义键盘方面遇到了类似的问题。(非英语 - Unicode)

让我们找到你的罪魁祸首为什么会发生这种变化。

KeyboardView.java in Android Source code

第701-709行

            if (label != null) {
            // For characters, use large font. For labels like "Done", use small font.
            if (label.length() > 1 && key.codes.length < 2) {
                paint.setTextSize(mLabelTextSize);
                paint.setTypeface(Typeface.DEFAULT_BOLD);
            } else {
                paint.setTextSize(mKeyTextSize);
                paint.setTypeface(Typeface.DEFAULT);
                    }
                }

这意味着它使多字符标签变为粗体和不同大小。 单个字符标签保持不变。

<强>解决方案

创建一个扩展此KeyboardView类的CustomKeyboardView类

public class CustomKeyboardView extends KeyboardView {

public CustomKeyboardView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

现在在这个CustomKeyboardView类中,重写onDraw方法。在画布上绘制键盘和键时会调用此方法

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint mpaint = new Paint();
    mpaint.setTypeface(Typeface.DEFAULT_BOLD); //to make all Bold. Choose Default to make all normal font
    mpaint.setTextSize(24); // in px


    List<Key> keys = getKeyboard().getKeys();
    for (Keyboard.Key key : keys) {

        if (key.label != null) {
            String keyLabel = key.label.toString();
            canvas.drawText(keyLabel, key.x + key.width, key.y + key.height, mpaint);
        } else if (key.icon != null) {
            key.icon.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
            key.icon.draw(canvas);
        }
    }
}

您可以使用此cheatcode将sp用于setTextSize方法

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <dimen name="custom_text_size">25sp</dimen>
</resources>

mpaint.setTextSize(getResources().getDimensionPixelSize(R.dimen.custom_text_size));

最后就像我们用来创建键盘一样,

     KeyboardView kv = (CustomKeyboardView) getLayoutInflater().inflate(R.layout.mainkeyboard, null); //mainkeyboard
     Keyboard  keyboard = new Keyboard(this, R.xml.hindi); //Your Keyboard Layout
     kv.setKeyboard(keyboard); //Set the keyboard

你很高兴。

希望它有所帮助:D