Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 同一直线上的多个相对跨度_Android_Android Layout_Android Canvas_Spannablestring - Fatal编程技术网

Android 同一直线上的多个相对跨度

Android 同一直线上的多个相对跨度,android,android-layout,android-canvas,spannablestring,Android,Android Layout,Android Canvas,Spannablestring,我试着使用两个相邻的相对跨度,但在这两者之间出现了很大的差距。看看我想要实现什么,我得到了什么 这就是我构建跨实例的方式 String formattedValue = "25%"; SpannableStringBuilder ssb = new SpannableStringBuilder(formattedValue); ssb.append("\n"); ssb.append(otherValue); int firstSpanEnd = fo

我试着使用两个相邻的相对跨度,但在这两者之间出现了很大的差距。看看我想要实现什么,我得到了什么

这就是我构建跨实例的方式

    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();
如果我去掉第二个相对论跨度,间隙会更小,但它仍然存在

此外,我还尝试了几个跨标志,但似乎都没有任何效果

编辑:my SpannableStringBuilder的多行文字字段

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

应该可以解决这个问题,但我想可能是因为存在一个潜在的布局错误,导致在%之前显示空格。\n请检查此代码,这将根据您的要求提供正确的输出

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

相反,使用
StaticLayout
上的
Layout.Alignment.CENTER
,它应该将文本作为一个整体居中

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

我使用您的代码获取此信息:。我所做的唯一更改是
ssb.setSpan(新的RelativeSizeSpan(0.3f),firstSpanEnd-1,firstSpanEnd,SPAN.SPAN_EXCLUSIVE_EXCLUSIVE)可能是打字错误。使用文本大小为30sp的默认字体。谢谢@Vikram,我会尽快研究它,这将在周一进行,但不起作用。只要我添加一个RelativeSizeSpan或AbsoluteSizeSpan,就会出现一个很大的缺口(Nexus 4 emulator和一加一,都在4.4上)。感谢您的尝试,我终于能够重现间距问题。您对
getPaintCenterText()
的返回值设置了哪些属性?如果其
setTextAlign(Paint.Align.CENTER)
,请将其移除。相反,在创建
静态布局时,使用
Layout.Alignment.Alignment\u CENTER
代替
Layout.Alignment.Alignment\u NORMAL
此外,您是否只是猜测,或者这种行为是否有原因?
有点猜测。据我所知,在
TextPaint
上设置
Paint.Align.CENTER
将影响文本字符在其边界矩形内的放置。相对跨度会夸大这一点。所以,我猜
布局.对齐.居中对齐
在这里更合适。如果
第一个span>/code>仍然是
3
,则第二个span应用于
\n
<代码>。。。有一个潜在的布局错误,导致在%
之前显示空格(可能是)。那么,
%
不是在下一行吗?你说得对。出于某种原因,我复制了原始代码而不是正确的代码(刚刚修复)。我没有对此进行测试,但由于您无法使用正确的代码复制它(OP仍然存在正确代码的问题),这可能与某些Android版本或制造商的实现有关。如果\n导致空格而不是断线,则%可能仍然在同一行上。在TextView上使用它时,SpannableString工作正常,因此问题一定是如何绘制它。我正在用完整的绘图代码更新这个问题。谢谢@Fahim,但事实证明它与用于绘制静态布局的油漆有关
mCenterTextLayout = new StaticLayout(mText, textPaint, (int) maxTextWidth, 
                          Layout.Alignment.ALIGN_CENTER, 0.85f, 0, false);