同一行上有多个RelativeSizeSpan

时间:2015-03-03 11:02:00

标签: android android-layout android-canvas spannablestring

我正在尝试将两个RelativeSizeSpan彼此相邻,但两者之间会出现很大的差距。看看我想要实现什么以及我得到了什么。

My goal what I get

这就是我构建Spanned实例

的方法
    String formattedValue = "25%";
    SpannableStringBuilder ssb = new SpannableStringBuilder(formattedValue);
    ssb.append("\n");
    ssb.append(otherValue);

    int firstSpanEnd = formattedValue.length();
    ssb.setSpan(new RelativeSizeSpan(1.5f), 0, firstSpanEnd-1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    ssb.setSpan(new RelativeSizeSpan(0.3f), firstSpanEnd, firstSpanEnd+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

这就是我画画的方式

  float maxTextWidth = getPaintCenterText().measureText(mText, 0, mText.length());

  TextPaint textPaint = new TextPaint(getPaintCenterText());

  mCenterTextLayout = new StaticLayout(mText, textPaint, (int) maxTextWidth, Layout.Alignment.ALIGN_NORMAL, 0.85f, 0, false);

  c.save();

  float centerY = center.y - totalheight;

  c.translate(center.x, centerY);

  mCenterTextLayout.draw(c);

  c.restore();

如果删除第二个RelativeSizeSpan,则间隙较小,但它仍然存在。

另外,我尝试过几个Spanned标志,但似乎没有任何效果。

编辑:我的SpannableStringBuilder的mText字段

[0] = '2' 48
[1] = '5' 46
[2] = '%' 48
[3] = '\n' 10
[4] = 'E' 69
[5] = 'x' 120
[6] = 'e' 101
[7] = 'r' 114
[8] = 'c' 99
[9] = 'i' 105
[10] = 's' 115
[11] = 'e' 101
[12] = ' ' 32
[13] = 'd' 100
[14] = 'a' 97
[15] = 'y' 121
[16] = 's' 115
[17] = '\u0000' 0
[18] = '\u0000' 0
[19] = '\u0000' 0
[20] = '\u0000' 0
[21] = '\u0000' 0
[22] = '\u0000' 0

3 个答案:

答案 0 :(得分:1)

检查此代码,根据您的要求提供正确的输出 enter image description here

editText=(TextView)findViewById(R.id.editText);
        editText.setTextSize(40);
        SpannableString span1 = new SpannableString("25%");
        SpannableString span2 = new SpannableString("25%");

        span1.setSpan(new RelativeSizeSpan(0.3f),  2, 3, 0);
        span1.setSpan(new RelativeSizeSpan(1.5f),  0, 2, 0);

        span2.setSpan(new RelativeSizeSpan(0.3f),  2, 3, 0);
        span2.setSpan(new RelativeSizeSpan(1.5f),  0, 2, 0);

        editText.setText(TextUtils.concat(span1," " ,span2));

答案 1 :(得分:1)

setTextAlign(Paint.Align.CENTER)上设置TextPaint可能会干扰您的跨度。

相反,请在Layout.Alignment.CENTER上使用StaticLayoutmCenterTextLayout = new StaticLayout(mText, textPaint, (int) maxTextWidth, Layout.Alignment.ALIGN_CENTER, 0.85f, 0, false); 应将整个文本置于中心位置。

{{1}}

答案 2 :(得分:0)

firstSpanEnd在您的示例中的值为3.

然后将第一个RelativeSizeSpan应用于字符[0,2] - > 25。

第二个RelativeSizeSpan将应用于字符[3,4],即\ n而不是%字符。

ssb.setSpan(new RelativeSizeSpan(1.5f), 0, firstSpanEnd-1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new RelativeSizeSpan(0.3f), firstSpanEnd-1, firstSpanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

应该解决这个问题,但我想有一个潜在的布局错误导致空间(可能是\ n)显示在%之前。