Проблемы с арабским текстом и высотой строки в EditText

Я накладываю цветной текст на части введенной пользователем строки в EditText, Однако в высотах строк арабского текста нет последовательности. getLineHeight() отлично работает для латинского текста, но он слишком мал для арабского текста. Я должен был использовать getLineBounds() чтобы получить правильную высоту арабских строк текста. к несчастью getLineBounds() слишком велик для латинского текста.

Однако эта ошибка возникает только на моем телефоне (Google Pixel 1 на Android P). Когда я тестирую на эмуляторе (Nexus 9 на Android 8.1), getLineBounds() также возвращает слишком большое значение. Я не знаю, что вызывает это несоответствие.

<code>@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();
        }
    }
}
</code></pre>
                                    
                                
                            </div>
                        </div>
                    </div>
                    <div class=

1 ответ

Это потому, что Android P использует "отступ между строками" при отображении нелатинского текста.

Чтобы это исправить, добавьте это в свой конструктор EditText:

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

Если вы беспокоитесь о том, что ваш текст слишком компактен, вы можете использовать это и в своем конструкторе.

if (usingArabicText) {
    setLineSpacing(15, 1);
}
Другие вопросы по тегам