Регулировка выравнивания текста с помощью SpannableString - PullRequest
13 голосов
/ 24 января 2012

Я создал SpannableString с первым символом, а последние на 2 меньше остальных.Это выглядит так:

sBBBBss

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

Возможно ли это?

Наверное, я ищу что-то вроде этого псевдокода:

myAmount.setSpan (new RelativeAlignSpan (View.TOP) , 0,1, 0);

Моя единственная другая альтернатива - это создание нового макета с несколькими TextViews, который я заполняю независимо и выравниваю по своему усмотрению.Я думаю, что это немного грязно, и я предпочел бы использовать подход SpannableString.

1 Ответ

33 голосов
/ 29 января 2012

Итак, я нашел ответ на этот вопрос, разместив его здесь, чтобы помочь следующему парню.

Я создал вспомогательный класс, содержащий методы для настройки Span, вы можете вызывать его с помощью этого синтаксиса (этоустановка последних 2 символов для отображения выше в строке):

SpannableString contentAmount = new SpannableString(amount);

contentAmount.setSpan(new SuperscriptSpanAdjuster(3.0/5.0), contentAmount.length() - 2, contentAmount.length(), SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);

и вспомогательный класс:

/**
 * This is a helper class to help adjust the alignment of a section of text, when using SpannableStrings to set text 
 * formatting dynamically.
 * 
 */
import android.text.TextPaint;
import android.text.style.MetricAffectingSpan;

public class SuperscriptSpanAdjuster extends MetricAffectingSpan {
    double ratio = 0.5;

    public SuperscriptSpanAdjuster() {
    }

    public SuperscriptSpanAdjuster(double ratio) {
        this.ratio = ratio;
    }

    @Override
    public void updateDrawState(TextPaint paint) {
        paint.baselineShift += (int) (paint.ascent() * ratio);
    }

    @Override
    public void updateMeasureState(TextPaint paint) {
        paint.baselineShift += (int) (paint.ascent() * ratio);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...