android - BackgroundColorSpan 调整高度或为其添加填充

标签 android textview spannablestring ebook-reader

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

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

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

谁能告诉我如何才能实现这个突出显示功能?基本上,我希望它像电子书阅读器一样工作,最好是 KindleAndroid 上的默认图书阅读器。

最佳答案

我尝试了 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/

相关文章:

java - 如何在 Android 中使用小空格作为数字分隔符?

android - 应用多个 ForegroundColorSpan

java - Android:如何将 ListView 点击传播到可跨越的字符串?

android - 使用 gradle 设置常量值

android - 在android中将值设置为textview

java - 如何在 strings.xml 中设置从 JSON 消耗的变量

android - SpannableString 第一次改变颜色,但在重复使用时不改变颜色

java - 在Android webview中加载特定的HTTPS Web应用程序

android - 更新到构建工具 2.3.0 后,LibraryPlugin 中没有 sdkHandler 字段

android: 二进制 XML 文件第 9 行:类 fragment 膨胀错误