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类获取有关在何处绘制背景的信息