我有一个应用程序,我在 TextView
中显示多行和多段格式化文本。为此,我正在使用 SpannableStringBuilder
。
我想在这里做的一件事是能够突出显示文本。现在我尝试使用 BackgroundColorSpan
,但在这种情况下,文本的背景覆盖了整个行高。我希望它只覆盖文本。似乎没有明显的方法可以在此跨度上设置垂直填充或高度。只是颜色。
其次,我还尝试继承 ReplacementSpan
并通过在此类的 draw 方法中绘制来实现我自己的 backgroundSpan
。但这似乎不支持多行突出显示。
谁能告诉我如何才能实现这个突出显示功能?基本上,我希望它像电子书阅读器一样工作,最好是 Kindle
或 Android
上的默认图书阅读器。
最佳答案
我尝试了 koopuluri 的解决方案,但是 LineBackgroundSpan 用于整个段落,而我只是想突出显示一些单词。所以我找到了 ReplacementSpan,我们可以在其中覆盖函数 draw
并在我们的文本后面绘制一个矩形。你必须给它文本高度。
/**
* It's like a {@link android.text.style.BackgroundColorSpan} but we don't paint the extra line height.
* <p/>
*/
public class BackgroundColorWithoutLineHeightSpan extends ReplacementSpan
{
private final int mColor;
private final int mTextHeight;
public BackgroundColorWithoutLineHeightSpan(int color, int textHeight)
{
mColor = color;
mTextHeight = textHeight;
}
@Override
public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm)
{
return Math.round(measureText(paint, text, start, end));
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint)
{
int paintColor = paint.getColor();
RectF rect = new RectF(x, top, x + measureText(paint, text, start, end), top + mTextHeight);
paint.setColor(mColor);
canvas.drawRect(rect, paint);
paint.setColor(paintColor);
canvas.drawText(text, start, end, x, y, paint);
}
private float measureText(Paint paint, CharSequence text, int start, int end)
{
return paint.measureText(text, start, end);
}
}
关于android - BackgroundColorSpan 调整高度或为其添加填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25783682/