我将彩色文本覆盖在EditText
中用户输入的字符串的部分上。但是,阿拉伯文本的行高不一致。 getLineHeight()
适用于拉丁文字,但是对于阿拉伯文字来说太小了。我必须使用getLineBounds()
来获得阿拉伯文字行的正确高度。不幸的是getLineBounds()
对于拉丁文字来说太大了。
但是,此错误仅在我的手机(Android P上的Google Pixel 1)上发生。当我在模拟器(Android 8.1的Nexus 9)上进行测试时,getLineBounds()
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();
}
}
}
答案 0 :(得分:1)
这是因为Android P在显示非拉丁文字时会使用“后退行间距”。
要解决此问题,请将其添加到自定义EditText
的构造函数中:
if (Build.VERSION.SDK_INT >= 28) {
setFallbackLineSpacing(false);
}
如果您担心此操作会使文本过于紧凑,也可以在构造函数中使用它。
if (usingArabicText) {
setLineSpacing(15, 1);
}