【发布时间】:2015-05-04 00:10:19
【问题描述】:
我正在尝试使用两个并排的 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,差距会更小,但它仍然存在。
另外,我尝试了几个跨区标志,但似乎都没有任何效果。
编辑:我的 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
【问题讨论】:
-
我用你的代码得到这个:Link。我所做的唯一更改是
ssb.setSpan(new RelativeSizeSpan(0.3f), firstSpanEnd-1, firstSpanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);,这可能是一个错字。使用文本大小为 30sp 的默认字体。 -
感谢@Vikram,我会尽快调查,这将在星期一进行
-
那行不通。一旦我添加了 RelativeSizeSpan 或 AbsoluteSizeSpan,就会出现很大的差距(Nexus 4 模拟器和一加一,都在 4.4 上)。感谢您尝试
-
我终于能够重现间距问题。你在
getPaintCenterText()的返回值上设置了什么属性?如果是setTextAlign(Paint.Align.CENTER),请将其删除。相反,在创建StaticLayout时使用Layout.Alignment.ALIGN_CENTER代替Layout.Alignment.ALIGN_NORMAL。 -
Also, did you just guess or is there a reason for that behaviour?有点猜测。据我所知,在TextPaint上设置Paint.Align.CENTER将影响文本字符在其边界矩形内的放置。 RelativeSizeSpan 会夸大这一点。所以,我猜Layout.Alignment.ALIGN_CENTER在这里会更合适。
标签: android android-layout android-canvas spannablestring