EditText中的阿拉伯文字和行高问题

时间:2018-08-31 16:30:21

标签: android android-custom-view text-rendering

我将彩色文本覆盖在EditText中用户输入的字符串的部分上。但是,阿拉伯文本的行高不一致。 getLineHeight()适用于拉丁文字,但是对于阿拉伯文字来说太小了。我必须使用getLineBounds()来获得阿拉伯文字行的正确高度。不幸的是getLineBounds()对于拉丁文字来说太大了。

但是,此错误仅在我的手机(Android P上的Google Pixel 1)上发生。当我在模拟器(Android 8.1的Nexus 9)上进行测试时,getLineBounds() also returns a value that is too large。我不知道是什么原因导致了这种差异。

<code>getLineBounds()</code> also returns a value that is too large

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.getClipBounds(rect);

    int baseline = getBaseline();

    for (int i = 0; i < lines.length; i++) {
        if (!lines[i].isEmpty()) {
            highlightLastWord(canvas, i, baseline);
            if (i == currline) {
                if (!usingArabicText) {
                    canvas.drawText(suggestions.toString(), 4 + rect.left + sidebarWidth + textPaint.measureText(lines[i]), baseline, suggestPaint);
                } else {
                    canvas.drawText(suggestions.toString(), rect.right - sidebarWidth - textPaint.measureText(lines[i] + suggestions.toString()), baseline, suggestPaint);
                }
            }
            if (textPaint.measureText(lines[i]) > rect.width() - getTotalPaddingLeft() - getTotalPaddingRight()) {
                if (usingArabicText) {
                    getLineBounds(i, lineBounds);
                    baseline += lineBounds.height();
                } else {
                    baseline += getLineHeight();
                }
            }
            if (usingArabicText) {
                getLineBounds(i, lineBounds);
                baseline += lineBounds.height();
            } else {
                baseline += getLineHeight();
            }
        } else {
            baseline += getLineHeight();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

这是因为Android P在显示非拉丁文字时会使用“后退行间距”。

要解决此问题,请将其添加到自定义EditText的构造函数中:

if (Build.VERSION.SDK_INT >= 28) {
    setFallbackLineSpacing(false);
}

如果您担心此操作会使文本过于紧凑,也可以在构造函数中使用它。

if (usingArabicText) {
    setLineSpacing(15, 1);
}