我有一个标签云,其中标签具有背景色。不幸的是,我无法获得适当的行距。
假设这是文本云:
tag1 tag2 tag3
tagtext4 tagtext5
这是文本 View 的样式:
<style name="DataEntryValue" parent="@android:style/TextAppearance.Medium">
<item name="android:textColor">@color/gray_value</item>
<item name="android:fontFamily">sans-serif-condensed</item>
</style>
BackgroundColorSpan用于为标签设置蓝色背景色。但是,这两行之间没有空格,即两行的背景色没有分开。
当我为文本 View 设置行距时到12sp,它增加了行距,但是使用标签的背景色而不是textview背景色来建立行距。
知道如何使用文本 View 背景色获得行距吗?
更新
使用此solution作为指导,我想到了这种方法:绘制文本的背景,绘制文本的背景,并在顶部和底部填充,然后绘制文本。由于我以前没有使用过 Canvas ,因此可能会有更好的方法。无论如何-这是代码。
public void draw(Canvas canvas, CharSequence text, int start, int end, float x,
int top, int y, int bottom, Paint paint)
{
float padding;
float right
RectF rect;
right = x + measureText(paint, text, start, end);
padding = 4f;
rect = new RectF( x, top, right, bottom );
paint.setColor( mContext.getResources().getColor(R.color.color1) );
rect = new RectF( x, top + padding, right, bottom - padding);
paint.setColor( mContext.getResources().getColor(R.color.bg_color_tag_item) );
canvas.drawRect(rect, paint);
paint.setColor( mContext.getResources().getColor(R.color.data_entry_value) );
canvas.drawText(text, start, end, x, y, paint);
}
现在看起来像这样:
很高兴认识:有更好的解决方案吗?
最佳答案
我找到了一个使用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);
}
}