- PVSM.RU - https://www.pvsm.ru -
Всем единообразия, или доброго времени суток!
Листая тут хабр наткнулся на статейку Подключение шрифтов в своем проекте [1] автора mcavalon [2], думал подчерпнуть чего-нить интересное… Но увидев очередной TextView.setTypeface how-to, зевнул и пошел читать другую статью [3] (rus1f1kat0r [4], привет кстати :)).
Так вот, несколько минут назад (на момент написания этих строк это были еще минуты, а не часы, совершенно непреднамеренно меня выдернули девушки) я выпустил HoloEverywhere 1.6.8, основной фичей этого релиза является продвинутый FontLoader, ну и еще несколько плюшек, как всегда.
Давайте сначала посмотрим на старый FontLoader и посмотрим, что он умел (точнее не умел).
// Regular font
myFontRegular = HoloFont.makeFont(R.raw.font_regular);
// Bold font
myFontBold = HoloFont.makeFont(R.raw.font_bold);
// Italic font
myFontItalic = HoloFont.makeFont(R.raw.font_italic);
// BoldItalic font
myFontBoldItalic = HoloFont.makeFont(R.raw.font_bold_italic);
// Super-puper merger
myFont = HoloFont.makeFont(myFontRegular, myFontBold, myFontItalic, myFontBoldItalic);
FontLoader.setDefaultFont(myFont);
… Все. Абсолютно никакой гибкости, никаких дополнительных шрифтов, да нихрена, если честно.
(Не, был еще вариант с FontLoader.apply(View, HoloFont), но он работал посредственно).
А теперь какие возможности предоставляет новый FontLoader:
Я возьму шрифт Toscuchet CM [5] by Alisson Depizol. Ну и сконвертирую его в TrueType, ибо нефиг. Ложим его в res/raw/toscuchet.ttf.
Создаем MainApplication, который расширяет org.holoeverywhere.app.Application, создаем статичный блок кода (static {} добавляем т.е.) (и вообще все настройки библиотеки лучше всего делать в одном месте и именно здесь), медитируем.
Содзаем объект RawFont со ссылкой на наш ttf файл:
public class MainApplication extends Application {
private static final Font sToscuchet;
static {
sToscuchet = new RawFont(R.raw.toscuchet);
}
}
Хм, как-то мало кода. Но принцип KISS в Java неприменим, поэтому нагрохаем еще пару никому ненужных строчек.
Мы должны создать еще объект типа FontCollector, который собирает множество разрозненых шрифтов в один большой и послушный объект.
Поскольку мы хотим задать наш шрифт только для одного конкретного TextView, мы должны добавить в наш FontCollector шрифт Toscuchet и добавить стандартное семейство Roboto. Ну и заодно предоставим метаинформацию о нашем новом стиле. Вуаля:
public class MainApplication extends Application {
private static final Font sToscuchet;
private static final FontCollector sDefaultFont;
static {
sToscuchet = new RawFont(R.raw.toscuchet);
sToscuchet.setFontFamily("toscuchet");
sToscuchet.setFontStyle(FontLoader.TEXT_STYLE_NORMAL);
sDefaultFont = new FontCollector();
sDefaultFont.register(sToscuchet);
sDefaultFont.register(FontLoader.ROBOTO);
FontLoader.setDefaultFont(sDefaultFont);
}
}
Ну вот, уже культурно, а то где вы видели такие короткие блоки кода?..
Идем в нашу супер разметку, вешаем на нее android:fontFamily=«toscuchet-normal», запускаем, при этом радуемся как дети:
Самый простой способ: вызвать FontLoader.setDefaultFont(sToscuchet). Но при этом шрифты будут одинаковые вообще везде, даже там, где нужно bold или italic начертание. Не катит.
И вот тут настает небольшая проблемка: FontCollector ищет нужный шрифт исходя из пары параметров fontFamily и fontStyle. Семейство шрифтов мы уже задали (sToscuchet.setFontFamily(«toscuchet»);). Можно конечно переопределить textViewStyle и там указать нужный fontFamily, но ну его нафиг. Мы просто скажем FontCollector'y: ей, а может ты перестанешь использовать fontFamily?
sDefaultFont = new FontCollector().allowAnyFontFamily();
Ну… Можно убрать android:fontFamily из нашей разметки, собрать и запустить проект:
Теперь fontFamily игнорируется для нашего шрифта. Любой TextView без дополнительных модификаторов (т.е. fontStyle = normal) будет няшненьким.
Если у вас есть несколько начертаний шрифта (regular, bold, italic), то вы можете его собрать в один шрифт. Примерно так:
public class MainApplication extends Application {
private static final Font sToscuchetRegular, sToscuchetBold, sToscuchetItalic;
private static final FontCollector sToscuchet, sDefaultFont;
static {
sToscuchetRegular = new RawFont(R.raw.toscuchet_regular).setFontStyle(FontLoader.TEXT_STYLE_NORMAL);
sToscuchetBold = new RawFont(R.raw.toscuchet_bold).setFontStyle(FontLoader.TEXT_STYLE_BOLD);
sToscuchetItalic = new RawFont(R.raw.toscuchet_italic).setFontStyle(FontLoader.TEXT_STYLE_ITALIC);
sToscuchet = new FontCollector().allowAnyFontFamily();
sToscuchet.setFontFamily("toscuchet");
sToscuchet.register(sToscuchetRegular).asDefaultFont();
sToscuchet.register(sToscuchetBold);
sToscuchet.register(sToscuchetItalic);
sDefaultFont = new FontCollector();
sDefaultFont.register(sToscuchet).asDefaultFont();
sDefaultFont.register(FontLoader.ROBOTO);
FontLoader.setDefaultFont(sDefaultFont);
}
}
Тут появился дополнительный вызов asDefaultFont(), который означает что предыдущий шрифт надо сделать шрифтом по умолчанию. Если ничего подходящего не найдется, будет использоваться именно этот шрифт.
Т.к. bold и italic начертаний для этого шрифта нет, обойдемся без примера :)
Ну вот примерно такой FontLoader у меня вышел. Если будут вопросы — обращайтесь. В комментарии, в личку или на почту.
А, чуть не забыл. Вы так много ныли по поводу навигации в Slider'e из демки, что вся навигации из демо приложения перенесена в Slider addon в виде SliderMenu. А код главной активити демо приложения (немного упрощенный) выглядит сейчас так:
@Addons(Activity.ADDON_SLIDER)
public class DemoActivity extends Activity {
public AddonSliderA addonSlider() {
return addon(AddonSlider.class);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final SliderMenu sliderMenu = addonSlider().obtainDefaultSliderMenu();
sliderMenu.add(R.string.demo, MainFragment.class, SliderMenu.BLUE);
sliderMenu.add(R.string.settings, SettingsFragment.class, SliderMenu.GREEN);
sliderMenu.add(R.string.other, OtherFragment.class, SliderMenu.ORANGE);
sliderMenu.add(R.string.about, AboutFragment.class, SliderMenu.PURPLE);
}
}
Круто, да? Почти ничего не делая, мы получаем отличную реализацию Navigation Drawer, с поддержкой планшетов и нормальной обработкой Home/Back кнопок. SliderMenu так-же кастомизируется, дерзайте :)
Список изменений с версии 1.5.0:
Репозиторий проекта [6], APK демо приложения [7]
Автор: Prototik
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/razrabotka-pod-android/38098
Ссылки в тексте:
[1] Подключение шрифтов в своем проекте: http://habrahabr.ru/post/184116/
[2] mcavalon: http://habrahabr.ru/users/mcavalon/
[3] статью: http://habrahabr.ru/company/mailru/blog/182750/
[4] rus1f1kat0r: http://habrahabr.ru/users/rus1f1kat0r/
[5] Toscuchet CM: http://openfontlibrary.org/en/font/toscuchet-cm
[6] Репозиторий проекта: http://github.com/Prototik/HoloEverywhere/
[7] APK демо приложения: https://oss.sonatype.org/content/repositories/releases/org/holoeverywhere/demo/1.6.8/demo-1.6.8-aligned.apk
[8] Источник: http://habrahabr.ru/post/185656/
Нажмите здесь для печати.