TextView с несколькими шрифтами и многое другое

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

Результат:

wpid-wp-1429533738427.png

 

 

 

 

 

 

 

 

 

 

Устанавливаем цвет и размер части текста

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

Результат:

3DmAD

 

Также можно установить фиксированный размер:

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

 

Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *