Главная » Программирование игр под Android » Прорисовка текста – РАЗРАБОТКА ИГР ДЛЯ ОС ANDROID

0

Хотя текст, выводимый в игре Мистер Ном, будет нарисован от руки, весьма полезно будет узнать, как выводить текст с помощью шрифтов TrueType. Начнем с загрузки собственного TrueType-шрифта из папки assets/.

Загрузка шрифтов. Android API предлагает класс Typeface, предназначенный для хранения TrueType. Класс предоставляет простой статический метод для загрузки файла шрифта из каталога assets/:

Что интересно, данный метод не генерирует особого исключения, если файл шрифта не был по каким-либо причинам загружен. Вместо этого срабатывает исключение RuntimeException. Почему для данного метода не было описано конкретного исключения – для меня загадка.

Рисование текста с помощью шрифта. Теперь у нас есть собственный шрифт, и мы определяем его как Typeface нашего экземпляра Paint.

С помощью Paint мы также определяем размер шрифта:

Документация по этому методу страдает лаконичностью – она, например, не сообщает, в каких единицах задается размер шрифта (в точках или пикселах). Мы примем за истину второй вариант.

Теперь мы можем вывести текст с использованием нужного нам шрифта с помощью следующего метода класса Canvas:

Первый параметр – текст, который необходимо вывести. Следующие два аргумента – координаты места, где это должно произойти. Последний аргумент хорошо нам знаком: это экземпляр Pai nt, определяющий цвет, шрифт и размер текста. Установив для Paint свой цвет, мы также можем раскрасить наш текст.

Выравнивание и границы текста. Вы может спросить, как координаты из предыдущего метода соотносятся с прямоугольником, в который помещается текст. Определяют ли они левый верхний угол этого прямоугольника? Ответ не так прост, как может показаться. Экземпляр Paint имеет атрибут, названный align setting. Он может быть установлен с помощью метода класса Paint:

Перечисление Paint.Align имеет три варианта значения: Paint.Align.LEFT, Paint. Align. CENTER и Paint. Align. RIGHT. В зависимости от установленного выравнивания интерпретируются координаты, передаваемые методу Canvas .drawText, как левый верхний угол прямоугольника, верхний центральный пиксел прямоугольника или же его правый верхний угол. Значение выравнивания по умолчанию – Pai nt. Al i gn. LEFT.

Иногда также полезно знать границы определенной строки, выраженные в пикселах. Для этого класс Pai nt также предлагает следующий метод:

Первый параметр – строка, для которой нам хочется получить границы. Следующие два аргумента задают начальную и конечную позиции внутри этой строки, для которых должны быть измерены границы. Последний параметр совершенно особый – это экземпляр класса Rect, который мы сами определяем и передаем методу. Метод запишет значения ширины и высоты ограничивающего прямоугольника в поля Rect. right и Rect. bottom. Для уверенности мы можем вызвать методы Rect.widthO и Rect. height О, чтобы получить те же значения. Обратите внимание – все эти методы работают только для однострочного текста. Если мы хотим вывести многострочный текст, нам придется компоновать его самостоятельно.

Все вместе

Хватит разговоров – пора и запрограммировать что-нибудь. Листинг 4.15 показывает рендеринг текста в действии.

Листинг 4.15.. Активность FontTest package com.badlogi с.androi dgames;

Мы не будем обсуждать метод onCreate данной активности, поскольку видели его уже не раз. Наша реализация RenderView включает три члена: Paint, Typeface и Rect (в котором мы позже сохраним границы нашего текста).

В конструкторе создаем новый экземпляр Paint и загружаем шрифт из файла font.ttf из каталога assets/.

В методе onDraw устанавливаем для Paint желтый цвет, шрифт и размер текста, а также определяем выравнивание текста (которое будет использовано для интерпретации координат при вызове Canvas. drawText ). В итоге вызов метода Canvas. drawText  приведет к появлению строки This is a test., центрированной горизонтально с координатой 100 по оси у.

Для второго вызова процедуры рисования текста мы кое-что изменим: нам нужен выровненный по правому краю текст, расположенный у правого края дисплея. Мы могли бы сделать это, используя Paint. Align. RIGHT и координату xравной Canvas. getWidthC) – 1. Вместо этого мы усложняем задачу (и заодно практикуемся в компоновке простого текста) – применим границы текста. Попутно изменим цвет и размер текста. На рис. 4.15 показан вывод данной активности.

Рис. 4.15. Вариации текста (разрешение 480 х 800)

Еще одна загадка класса Typeface состоит в том, что он не предоставляет способ явно освободить свои ресурсы – нам приходится полагаться на сборщик мусора.

ПРИМЕЧАНИЕ

В этом разделе мы коснулись только поверхностного слоя темы прорисовки текста. Если вам нужно больше… я думаю, вы уже догадались, куда я вас отправлю.

Источник: Mario Zechner / Марио Цехнер, «Программирование игр под Android», пер. Егор Сидорович, Евгений Зазноба, Издательство «Питер»

По теме:

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