【问题标题】:Change font of custome key (label) of android custom keyboard更改android自定义键盘的自定义键(标签)的字体
【发布时间】:2016-09-27 08:01:52
【问题描述】:

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

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

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

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

编辑: 阅读 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" />

现在每个带有多个代码的键也使用默认字体。 这暂时有效,(直到我找到合适的解决方案:))

【问题讨论】:

    标签: java android unicode fonts keyboard


    【解决方案1】:

    我在创建印地语自定义键盘时遇到了类似的问题。(非英语-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

    【讨论】:

    • 不幸的是,这对我并没有真正起作用。自定义键仍然显示错误的字体。但这给了我一个想法。请参阅我编辑的问题第二部分。
    • 你确定,它不起作用吗?它对我有用。但是我不得不删除 super.onDraw。 (从我上面写的代码),因为它显然是使用代码集,并且使用粗体绘制它,默认我可以单独绘制它们。尝试从覆盖的 onDraw 中删除 super.onDraw(从 onDraw 的实际实现中检查您可能需要的其他依赖项。) PS 这是我的第一个答案。很抱歉,如果它对你有用。
    猜你喜欢
    • 2014-11-13
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2012-06-27
    相关资源
    最近更新 更多