具有行间距的Android spannable字符串

use*_*486 9 android string-formatting spacing android-canvas spannablestring

我有一个标签云,其中标签有背景颜色.不幸的是,我无法获得行间距.

我们假设这是文本云:

tag1  tag2  tag3
tagtext4 tagtext5
Run Code Online (Sandbox Code Playgroud)

这是文本视图的样式:

<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>
Run Code Online (Sandbox Code Playgroud)

BackgroundColorSpan用于为标签设置蓝色背景颜色.然而,线之间没有空间,即两条线的背景颜色没有分开.

当我将文本视图的行间距设置为12sp时,它会添加行间距,但使用标记的背景颜色而不是textview背景颜色来建立行间距.

知道如何使用文本视图背景颜色获得行间距?

更新

使用此解决方案作为指导我想出了这种方法:绘制文本的背景,在顶部和底部用填充绘制文本的背景,绘制文本.因为我之前没有使用过画布,所以可能有更好的方法.无论如何 - 这是代码.

    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);
    }
Run Code Online (Sandbox Code Playgroud)

它现在看起来像这样:

在此输入图像描述

很高兴知道:有更好的解决方案吗?

Syl*_*phe 1

我找到了一个使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)