具有行距的 Android 可跨字符串

Posted

技术标签:

【中文标题】具有行距的 Android 可跨字符串【英文标题】:Android spannable string with line spacing 【发布时间】:2014-09-19 02:53:46 【问题描述】:

我有一个标签云,其中的标签有背景颜色。不幸的是,我无法确定行距。

假设这是文本云:

tag1  tag2  tag3
tagtext4 tagtext5

这是文本视图的样式:

<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 用于为标签设置蓝色背景颜色。但是,线条之间没有空格,即两条线的背景颜色没有分开。

当我为文本视图设置行距时,例如到 12sp,它添加了行间距,但使用标签的背景颜色而不是 textview 背景颜色来建立行间距。

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

更新

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

    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);
    

现在看起来像这样:

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

【问题讨论】:

请您详细说明您是如何解决问题的。更多代码或其他东西。这对我很有用。 解决方案的实际代码在上面公布。 @user3460486 能否请您发布 measureText() 方法 private float measureText(Paint paint, CharSequence text, int start, int end) return paint.measureText(text, start, end); 【参考方案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);
    

【讨论】:

以上是关于具有行距的 Android 可跨字符串的主要内容,如果未能解决你的问题,请参考以下文章

可跨页字符串:使用Spans设置文本样式

Android 可跨行高

如何使用辅助功能模式使可跨文本可点击

支持 RTL 语言的 Android Justify 可跨文本视图

Android Calendar Provider:是不是有可跨多个设备使用的事件唯一标识符?

如何在 iText 中为 FormFields 设置行距?