2015-03-03 1 views
3

Я пытаюсь использовать два RelativeSizeSpan рядом друг с другом, но между ними возникает большой промежуток. Посмотрите, чего я хочу достичь и что я получаю.Несколько RelativeSizeSpan на той же линии

My goalwhat I get

Это, как я строить экземпляр составного

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 flags, но ни один из них не имеет никакого эффекта.

Edit: MText поле моего 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 
+0

Получаю это, используя ваш код: [Ссылка] (http://postimg.org/image/5yvfj4etp/). Единственное изменение, которое я сделал, это 'ssb.setSpan (новый RelativeSizeSpan (0.3f), firstSpanEnd-1, firstSpanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE), который, вероятно, был опечаткой. Использование шрифта по умолчанию с размером текста 30 с. – Vikram

+0

спасибо @ Викраму, я посмотрю, как только смогу, что будет в понедельник – Maragues

+0

Это не сработало. Как только я добавлю RelativeSizeSpan или AbsoluteSizeSpan, появится большой пробел (эмулятор Nexus 4 и One Plus One, как в 4.4). Спасибо за попытку. – Maragues

ответ

1

Установка setTextAlign(Paint.Align.CENTER) на TextPaint может мешать с пролетами.

Вместо этого используйте Layout.Alignment.CENTER на StaticLayout, который должен центрировать текст в целом.

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

firstSpanEnd имеет значение 3 в вашем примере.

Первый RelativeSizeSpan затем будет применяться к символам [0, 2] -> 25.

Второй RelativeSizeSpan будет применяться к символам [3, 4], который является \ п не символ% ,

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

должен решить проблему, но я предполагаю, что есть основная раскладка ошибка, которая приводит к тому, пространство (\ п, вероятно), показывая перед%.

+0

Если 'firstSpanEnd' по-прежнему' 3', ваш второй диапазон применяется к '\ n'. '... есть основная ошибка макета, которая заставляет пространство (возможно, \ n) показывать перед%'. Не будет ли '' '' на следующей строке? – Vikram

+1

Вы правы. По какой-то причине я скопировал исходный код вместо правильного (только фиксированный). Я не тестировал это, но так как вы не смогли воспроизвести его с правильным кодом (и OP все еще имеет проблему с исправленным кодом), это может быть связано с некоторыми версиями Android или версиями производителя. Если \ n вызывает интервал вместо простого разрыва строки, то% все равно может находиться на одной строке. –

+0

SpannableString отлично работает при использовании в TextView, поэтому проблема заключается в том, как я его рисую. Я обновляю вопрос с помощью полного кода чертежа. – Maragues

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

спасибо @Fahim, но, оказывается, это было связано с краской, используемой для рисования StaticLayout – Maragues