同一行上的多个 RelativeSizeSpan
Multiple RelativeSizeSpan on same line
我尝试并排使用两个 RelativeSizeSpan,但两者之间出现了很大的差距。看看我想要达到什么以及我得到了什么。
这就是我构建 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 标志,但 none 似乎有任何效果。
编辑:我的 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
在您的示例中,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);
应该可以解决这个问题,但我猜有一个潜在的布局错误导致 space(可能是 \n)显示在 %.
之前
检查这段代码,它根据您的要求给出了正确的输出
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));
在 TextPaint
上设置 setTextAlign(Paint.Align.CENTER)
可能会干扰您的跨度。
相反,在 StaticLayout
上使用 Layout.Alignment.CENTER
,这会使整个文本居中。
mCenterTextLayout = new StaticLayout(mText, textPaint, (int) maxTextWidth,
Layout.Alignment.ALIGN_CENTER, 0.85f, 0, false);
我尝试并排使用两个 RelativeSizeSpan,但两者之间出现了很大的差距。看看我想要达到什么以及我得到了什么。
这就是我构建 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 标志,但 none 似乎有任何效果。
编辑:我的 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
在您的示例中,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);
应该可以解决这个问题,但我猜有一个潜在的布局错误导致 space(可能是 \n)显示在 %.
之前检查这段代码,它根据您的要求给出了正确的输出
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));
在 TextPaint
上设置 setTextAlign(Paint.Align.CENTER)
可能会干扰您的跨度。
相反,在 StaticLayout
上使用 Layout.Alignment.CENTER
,这会使整个文本居中。
mCenterTextLayout = new StaticLayout(mText, textPaint, (int) maxTextWidth,
Layout.Alignment.ALIGN_CENTER, 0.85f, 0, false);