Перейти к содержимому
Меню
  • Java SE
  • Android
  • Поиск
  • Java SE
  • Android

JAVA-HELP

Сайт для Java разработчиков

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

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

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);
Категории
  • Android
  • Уроки Android
Предыдущая заметка

Полезные ресурсы для Android-разработчика #1

Следующая заметка

Передаем Drawable через Intent

Рубрики

  • Android
    • Android-библиотеки
    • Android-сниппеты
    • Material Design
    • Инструменты разработчика
    • Уроки Android
  • Java SE
    • Java-сниппеты
    • Изучение Java
    • Обзор Java-классов
    • Основы Java
  • Kotlin

Популярные записи

  • Загрузка изображений с помощью библиотеки Glide. Начало работы
  • Руководство по использованию ORM DBFlow в Android-приложении
  • Анимированный Toolbar: фичи Design Support Library
  • Я хочу программировать под Android. Вопрос #5
  • Используем ACRA в своем приложении

Copyright © 2020– JAVA-HELP. Все права защищены. Политика конфиденциальности