Android 背景色调整高度或添加填充物

Android 背景色调整高度或添加填充物,android,textview,spannablestring,ebook-reader,Android,Textview,Spannablestring,Ebook Reader,我有一个应用程序,可以在TextView中显示格式化文本的多行和多段。为此,我正在使用SpannableStringBuilder 我想在这里做的事情之一就是能够突出显示文本。现在我尝试使用BackgroundColorSpan,但在本例中,文本上的背景覆盖了整个行高。我希望它只涵盖文本。似乎没有明显的方法来设置这个跨度上的垂直填充或高度。只是颜色 其次,我还尝试将ReplacementSpan子类化,并通过在这个类的draw方法中绘制来实现我自己的backgroundSpan。但这似乎不支持多

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

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

其次,我还尝试将
ReplacementSpan
子类化,并通过在这个类的draw方法中绘制来实现我自己的
backgroundSpan
。但这似乎不支持多行高亮显示


有人能告诉我如何实现这种突出显示功能吗?基本上,我希望它能像电子书阅读器一样工作,最好是
Kindle
Android
上的默认图书阅读器。您可以实现LineBackgroundSpan并覆盖:

牵引地面(画布c、油漆p、整数左、整数右、整数上、整数基线、整数下、字符序列文本、整数开始、整数结束、整数lnum)

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

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

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

在显示器上跨越3条线,然后应用三次牵引地面(…),如果希望仅更改跨度中某些线的高度,则可以使用“lnum”参数更改某些线的行为

我尝试了库普鲁里的解决方案,但是当我只想突出一些单词时,整个段落的背景都是这样的。因此我找到了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);
    }
}
/**
*它就像一个{@linkandroid.text.style.BackgroundColorSpan}但是我们不画额外的行高。
*

*/ 公共类BackgroundColorWithoutLineHeightSpan扩展替换span { 私人最终int mColor; 私人最终整数mTextHeight; 公共背景色带大纲高度span(int-color,int-textHeight) { mColor=颜色; mTextHeight=文本高度; } @凌驾 公共int getSize(Paint、CharSequence文本、int开始、int结束、Paint.FontMetricsInt fm) { 返回Math.round(measureText(绘制、文本、开始、结束)); } @凌驾 公共空白绘制(画布、字符序列文本、int开始、int结束、浮点x、int顶部、int y、int底部、绘制) { int paintColor=paint.getColor(); RectF rect=new RectF(x,top,x+measureText(绘制,文本,开始,结束),top+mTextHeight); 油漆。设置颜色(mColor); 画布.drawRect(rect,paint); paint.setColor(paintColor); 画布.drawText(文本、开始、结束、x、y、绘制); } 私有浮点测量文本(绘制、字符序列文本、int开始、int结束) { 返回paint.measureText(文本、开始、结束); } }


子类TextView并重写其onDraw方法,使用android.text.Layout类获取有关在何处绘制背景的信息