Нестандартные шрифты в Android приложении

Нестандартные шрифты в Android приложении

В Android есть необходимый базовый набор шрифтов, который подходит для большинства приложений. Количество стилей шрифтов очень мало и они различаются на разных платформах, но их размеры очень близки. Далее будет рассмотрено использование нестандартных шрифтов в Android приложении.

Часто причиной использования нестандартных шрифтов являются:

  • Дизайн приложения, который создан не вами.
  • Отсутствие шрифта на более ранней версии платформы и придание приложению одного вида.
  • Имеющиеся уже шрифты с подчеркиванием бренда продукции или компании.
  • Использование современных шрифтов.
  • Простое желание видеть ваш любимый шрифт в приложении.

Хранилище шрифтов

Шрифты следуют хранить в assets директории. Лучше всего создать в ней отдельную директорию для шрифтов, например assets/fonts. Путь для шрифтов следует указывать в ресурсах, в файле strings.xml, тем самым вы имеете возможность использовать разные пути, а значит и разные шрифты, в зависимости от выбранного языка пользователем. Например описание путей в файл strings.xml может выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- Fonts -->
    <string name="font_roboto_medium">fonts/Roboto-Medium.ttf</string>
    <string name="font_roboto_regular">fonts/Roboto-Regular.ttf</string>

</resources>

Утечка памяти

Для создания шрифта используется метод createFromAsset() класса Typeface. При каждом его вызове создается Typeface объект. Если мы будем использовать список с большим количеством View, для которых нужно постоянно создать Typeface объекты, то приложение вскоре может потреблять около сотни мегабайт памяти. Чем дольше вы будете совершать прокрутку списка, тем больше будет становиться утечка памяти. Чтобы избежать этого, используйте следующих класс для создания шрифтов:

public class Typefaces {
    private static final ConcurrentMap<String, Typeface> cache = new ConcurrentHashMap<String, Typeface>();

    public static Typeface get(Context c, String assetPath) {
        synchronized (cache) {
            if (!cache.containsKey(assetPath)) {
                try {
                    Typeface t = Typeface.createFromAsset(c.getAssets(),
                            assetPath);
                    cache.put(assetPath, t);
                } catch (Exception e) {
                    return null;
                }
            }
            return cache.get(assetPath);
        }
    }
}

Этот класс предоставляет статический метод для создания шрифта, а так же является потокобезопасным. Далее созданный шрифт кэшируется, тем самым вы не создаете постоянно объекты и избавляетесь от серьезной утечки памяти. К сожалению Android система не делает этого за нас.

Установка нестандартных шрифтов во View

Чтобы каждый раз не устанавливать шрифт у созданного View, нужно расширить View класса и установить шрифт в конструкторе. Этим вы не будете писать дополнительный код и можете использовать новый View компонент с нужным шрифтом в xml файлах разметки. Ниже приведен пример расширения TextView класса и установка шрифта Roboto.

public class TextViewRegular extends TextView {
    
    public TextViewRegular(Context context) {
        this(context, null, 0);
    }
    
    public TextViewRegular(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }


    public TextViewRegular(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setFont(context);
    }

    private void setFont(Context context) {
        Typeface face = Typefaces.get(context, context.getText(R.string.font_roboto_regular).toString());
        setTypeface(face);
    }
}

Обратите внимание, что конструктор вызывают последний описанный конструктор, в котором происходит создание шрифта и его установка. Использование того View компонента в xml файлах разметки, выглядит следующим образом:

<com.package.widget.TextViewRegular
    android:id="@+id/name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

2 комментария:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. When it comes to design, there are few elements more important than typography. The right font can make all the difference in conveying the desired message, and there are now more choices than ever before. While this may seem like a good thing, it can actually be quite overwhelming for designers. Fortunately, there are sites like Schriftarten123 that make it easy to find the perfect font for any project. With its wide selection of both free and premium fonts, verschiedene schriftarten zum kopieren is a great resource for any designer looking to add some variety to their work. Thanks for sharing this useful site with us!

    ОтветитьУдалить