[J2ME] Используем свой собственный шрифт в Java
Современные мобильные приложения, как правило, нуждаются в достойном графическом оформлении. Однако самая изысканная графика может быть испорчена неумелым использованием шрифтов. К сожалению, предоставляемые J2ME возможности по работе с фонтами весьма ограничены. Как правило, в вашем распоряжении имеется три системных шрифта, причем Вы имеете лишь приблизительное представление, как они будут выглядеть при работе вашей программы на конкретном телефоне.
Чтобы улучшить внешний вид текста, можно воспользоваться несложными ухищрениями, например создать тень, напечатав два раза один и тот же текст со сдвигом на 2 единицы. Существуют варианты с использованием SVG графики, однако он довольно сложен и требует значительного времени на отображение векторных букв, да и полученная в результате картинка не всегда смотрится достаточно хорошо.
В этой статья я хочу предложить вам альтернативный способ, основанный на использовании спрайтов. Во многих приложениях (особенно в играх) данная схема уже давно используется для рисования анимированных объектов.
НачинаемРабота выполняется в 2 этапа:
Рисование Программирование РисованиеДля особо ленивых выкладываю уже готовый файл с (почти) всеми символами ASCII в нескольких вариациях.Для создания файла шрифта, нам потребуется Adobe Photoshop любой версии (у меня CS5.5, поэтому скриншоты могут отличаться), если Фотошопа нет, или не охота ставить, можно использовать любой графический редактор, который работает с прозрачностью (Можно и Paint, если нет необходимости в прозрачности). Приступим к работе.
Создаём новый файл размером
высота - H+2 длина - H*(k+1),где H-размер шрифта (в пик.), k-количество необходимых букв, цифр, знаков, которые будут нужны.
Содержимое фона указать - прозрачный
Теперь создаём текст, во всю рабочую область. Вводим необходимые символы (я рекомендую через пробел или два). Шрифт крайне сильно советую «Microsoft Lucia Console» или иной консольный шрифт, иначе намучаетесь с размером букв (например ширина «Т» и «Щ» будет сильно различаться, если возникают проблемы с размером у других шрифтов, можно попытаться создать сетку с равным шагом, и смотреть, чтобы буква не выходила за пределы своей "клетки", где проблемы - добавить пробелы).
Ну а теперь, самое интересное, как сделать обычный шрифт интереснее. Выбираем пункт «Параметры наложения» и щёлкаем, ВСЁ, что душе угодно, только следите, чтобы интервал между буквами присутствовал (У меня это тень и наложение белого цвета или узора).
Теперь, осталось сохранить нашу красоту, Файл->Сохранить… Выбираем папку, имя и расширение только .png! Теперь шрифт готов, и можно переходить к программированию. Некоторые телефоны могут поддерживать GIF, JPG, и даже BMP, но если вы хотите написать универсальное приложение, которое будет без проблем работать на большинстве телефонов - используйте только PNG.
ПрограммированиеЯ для удобства создал отдельную процедуру (функцию).
public void DFont(String Font, Graphics g, String Stroka, int kx, int ky, int p, int px, int py) throws IOException{}
Font – путь к нашим нарисованным шрифтам (Напоминаю, *.png)g – графическая переменная, в которой мы будем рисоватьStroka – наш текст, который необходимо нарисоватьkx, ky – координаты начала рисованияp – размер расстояния между буквами в файле .pngpx – размер расстояния между буквами при рисовании (особенно удобно, брать меньше чем «р», чтобы буквы были плотнее)py – разница в уровне в предыдущей буквой по оси «у»
Вставите ваш код в вашу функцию canvas'a
public void DFont(String Font,Graphics g,String Stroka,int kx,int ky,double p,int px,int py) throws IOException{
Image img= Image.createImage(Font);
int x=kx,y=ky,idx,X,P=(int) p;
char smb;
// Это детектирующие символы - Это всё-переменная алфавит, у каждого своя, просто скопируйте тот текст, из Фотошопа, ОБЯЗАТЕЛЬНО без пробелов между буквами!!!
final String Alphavet="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
+ "йцукенгшщзхъфывапролджэячсмитьбюё"
+ "!«№;%:?*()_+-=@#$^&[]{}|\\/"
+ "QWERTYUIOPASDFGHJKLZXCVBNM"
+ "qwertyuiopasdfghjklzxcvbnm"
+ "1234567890";
for (int i = 0; i < Stroka.length(); i++) {
smb=Stroka.charAt(i);
idx=Alphavet.indexOf(smb);
x=x+px;
y=y+py;
if (idx!=-1){
X=(int) (idx*p-1);
g.drawImage(Image.createImage(img,X, 0,P , img.getHeight(),Sprite.TRANS_NONE),x,y,Graphics.TOP | Graphics.LEFT);
}else {
g.drawString(String.valueOf(smb), x, y, 0);
}
}
}
В принципе, большую сложность представляет рисование самих шрифтов, а не код.Далее идёт пример использования моей программы:
public void paint(Graphics g){
try{
g.setColor(0xffffff);
g.fillRect(0,0,1000,1000);
DFont("/hello/Font_all.png",g,"Простая строка",10,10,16.9,10,0);
DFont("/hello/Font_all.png",g,"Строка поуже",10,30,16.9,8,0);
DFont("/hello/Font_all.png",g,"Строка пошире",10,50,16.9,14,0);
DFont("/hello/Font_all.png",g,"Строка идёт вниз",10,70,16.9,10,1);
DFont("/hello/Font_all.png",g,"Строка идёт вверх",10,130,16.9,10,-2);
DFont("/hello/Font_all.png",g,"Если неправильно подобран р",10,150,16.81,8,0);
} catch(IOException ex){}
}
Получится это:
Надеюсь моя статья поможет Вам сделать красивые программы с продуманным интерфейсом. Все советы и замечания присылайте мне.