8

我有一个应用程序,我在其中显示多行和多段格式化文本TextView。我正在SpannableStringBuilder为此目的使用。

我在这里想做的一件事是能够突出显示文本。现在我尝试使用BackgroundColorSpan,但在这种情况下,文本的背景覆盖了完整的行高。我希望它只覆盖文本。似乎没有明显的方法可以在此跨度上设置垂直填充或高度。只是颜色。

其次,我还尝试通过在这个类的draw方法中绘制来继承ReplacementSpan和实现我自己的a。backgroundSpan但这似乎不支持多行突出显示。

谁能告诉我如何才能实现此突出显示功能?基本上,我希望它像电子书阅读器一样工作,最好KindleAndroid.

4

2 回答 2

3

我尝试了 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);
    }
}
于 2015-12-04T15:57:32.093 回答
1

您可以实现 LineBackgroundSpan 并覆盖:

drawBackground (Canvas c, Paint p, int left, int right, int top, int baseline, int bottom, CharSequence text, int start, int end, int lnum)

您可以修改“top”和“bottom”参数以指定您为给定线条绘制的背景的高度。“基线”参数是所有字符所在行的 y 坐标(请注意,字母 g、p、j 等有一些部分低于基线)。

对于给定文本,此方法适用于显示器上的每一行。例如,如果文本

"this is an example , blah, blah .." 

在显示器上跨越 3 行,然后应用 drawBackground(...) 三次,如果您只想更改跨度中某些行的高度,则可以使用“lnum”参数来更改某些行的行为。

于 2015-02-02T05:24:55.013 回答