Здравствуйте, в этом небольшом уроке я покажу как задать собственный шрифт для каждого участка TextView.
Для этого нам понадобится собствееный класс, наследующийся от TypefaceSpan:
public class CustomTypefaceSpan extends TypefaceSpan { private final Typeface newType; public CustomTypefaceSpan(String family, Typeface type) { super(family); newType = type; } @Override public void updateDrawState(TextPaint ds) { applyCustomTypeFace(ds, newType); } @Override public void updateMeasureState(TextPaint paint) { applyCustomTypeFace(paint, newType); } private static void applyCustomTypeFace(Paint paint, Typeface tf) { int oldStyle; Typeface old = paint.getTypeface(); if (old == null) { oldStyle = 0; } else { oldStyle = old.getStyle(); } int fake = oldStyle & ~tf.getStyle(); if ((fake & Typeface.BOLD) != 0) { paint.setFakeBoldText(true); } if ((fake & Typeface.ITALIC) != 0) { paint.setTextSkewX(-0.25f); } paint.setTypeface(tf); } }
В конструкторе нашего класса в качестве первого параметра мы указываем стиль шрифта (normal, sans, serif или italic), далее идет сам шрифт.
Теперь нам нужно создать шрифты из ресурсов (они хранятся в папке assets нашего проекта):
Typeface font = Typeface.createFromAsset(getAssets(), "times.ttf"); Typeface font2 = Typeface.createFromAsset(getAssets(), "cambria.ttf");
Далее нам нужно создать объект класса SpannableStringBuilder и передать на вход строку, которую мы хотим оформить:
SpannableStringBuilder ss = new SpannableStringBuilder("хоро хоро хорошо");
Далее мы вызываем метод setSpan и передаем на вход наши span’ы:
ss.setSpan(new CustomTypefaceSpan("normal", font), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE); ss.setSpan(new CustomTypefaceSpan("normal", font2), 5, 9, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
Цифры, указанные во втором и третьем параметрах обозначают с какой и до какой позиции мы будем присваивать шрифт тексту.
Инициализируем TextView и присвоим ему полученный текст:
TextView tvText = (TextView) findViewById(R.id.tvText); tvText.setText(ss);
Устанавливаем цвет и размер части текста
String s = "Hello Everyone"; SpannableString ss = new SpannableString(s); ss.setSpan(new RelativeSizeSpan(2f), 0,5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE); // устанавливаем размер ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE); // устанавливаем цвет TextView tv= (TextView) findViewById(R.id.textview); tv.setText(ss);
Также можно установить фиксированный размер:
ss.setSpan(new AbsoluteSizeSpan((int) getTextSize()*2), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
Разное выравнивание
Alignment.ALIGN_OPPOSITE — устанавливает выравнивание справа.
Alignment.ALIGN_NORMAL — устанавливает выравнивание слева.
Alignment.ALIGN_CENTER — устанавливает выравнивание по центру.
ss.setSpan(new AlignmentSpan.Standard(Alignment.ALIGN_OPPOSITE), 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);