Здравствуйте, в этом небольшом уроке я покажу как задать собственный шрифт для каждого участка 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);
