Проблема при загрузке БОЛЬШЕ, чем один пользовательский шрифт Blackberry
Я попытался загрузить пользовательский шрифт, который работает. Теперь у меня проблема: я не могу использовать более одного пользовательского шрифта в приложении. Если я добавлю три labelFields, каждое из которых имеет другой шрифт, для всех меток будет использоваться только последний пользовательский шрифт.
Если я удаляю последний setFont для последней метки, используется второй шрифт. Есть ли какой-то механизм, который использует только последний шрифт?
Вот код, который добавляет LabelFields и устанавливает шрифты
LabelField TestLabel1 = new LabelField("Test Label 1");
Font fo1 = loadCustomFonts("FirstFont.ttf", "FirstFont", 0, 30);
TestLabel1.setFont(fo1);
add(TestLabel1);
LabelField TestLabel2 = new LabelField("Test Label 2");
Font fo2 = loadCustomFonts("SecondFont.ttf", "SecondFont", 0, 30);
TestLabel2.setFont(fo2);
add(TestLabel2);
LabelField TestLabel3 = new LabelField("Test Label 3");
Font fo3 =loadCustomFonts("ThirdFont.TTF", "ThirdFont", 0, 30);
TestLabel3.setFont(fo3);
add(TestLabel3);
Вот мой метод "loadCustomFonts", который загружает пользовательский шрифт и возвращает объект шрифта.
public Font loadCustomFonts (String path, String fontname,int fontStyle, int fontSize){
InputStream stream = this.getClass().getResourceAsStream(path);
if (FontManager.getInstance().load(stream, fontname, FontManager.APPLICATION_FONT) == FontManager.SUCCESS){
try{
FontFamily family;
add(new LabelField("A"));
family = FontFamily.forName(fontname);
Font myFont = family.getFont(fontStyle,fontSize);
return myFont;
}
catch (ClassNotFoundException e){System.out.println(e.getMessage());}
}
else {
try{
FontFamily family;
add(new LabelField("B"));
family = FontFamily.forName(fontname);
Font myFont = family.getFont(fontStyle,fontSize);
return myFont;
}
catch (ClassNotFoundException e){System.out.println(e.getMessage());}
}
return null;
}
3 ответа
Я нашел причину. Это был максимальный размер 60 КБ на каждый пользовательский шрифт, и если шрифт уже загружен.
Поэтому я изменил метод загрузчика.
public Font loadCustomFonts (String path, String fontname,int fontStyle, int fontSize){
//Loads custom Fonts
InputStream stream = this.getClass().getResourceAsStream(path);
System.out.println("fontname"+fontname);
//System.out.println("fontname"+fontname +"FontManager Return "+FontManager.getInstance().load(path, fontname, FontManager.EXCEEDS_LIMIT));
if (FontManager.getInstance().load(stream, fontname, FontManager.APPLICATION_FONT) == FontManager.EXCEEDS_LIMIT)
System.out.println("FontManager.EXCEEDS_LIMIT => true");
else
System.out.println("FontManager.EXCEEDS_LIMIT => false");
System.out.println (FontManager.DUPLICATE_DATA);
if (FontManager.getInstance().load(path, fontname, FontManager.APPLICATION_FONT) == FontManager.APPLICATION_FONT)
{
//if (FontManager.getInstance().load(stream, fontname, FontManager.APPLICATION_FONT) == FontManager.SUCCESS){
System.out.println("A getInstanc => true");
try{
System.out.println("A Try");
FontFamily family;
family = FontFamily.forName(fontname);
Font myFont = family.getFont(fontStyle,fontSize);
System.out.println("A return myFont"+myFont);
return myFont;
}
catch (ClassNotFoundException e){System.out.println(e.getMessage());}
System.out.println("A Catch");
}
else {
//font could not be loaded
System.out.println("B getInstanc => false");
System.out.println("FontManager.getInstance().load(path, fontname, FontManager.APPLICATION_FONT"+FontManager.getInstance().load(path, fontname, FontManager.APPLICATION_FONT));
if (FontManager.getInstance().load(path, fontname, FontManager.APPLICATION_FONT) == FontManager.DUPLICATE_NAME)
//check if font already is loaded
try{
System.out.println("B Try");
FontFamily family;
family = FontFamily.forName(fontname);
Font myFont = family.getFont(fontStyle,fontSize);
System.out.println("B return myFont"+myFont);
return myFont;
}
catch (ClassNotFoundException e){System.out.println(e.getMessage());}
else
System.out.println("FontManager.getInstance().load(path, fontname, FontManager.APPLICATION_FONT"+FontManager.getInstance().load(path, fontname, FontManager.APPLICATION_FONT));
}
return null;
}
Кто-нибудь знает решение для загрузки шрифтов, размер которых превышает 60 КБ? Я уже пытался использовать входной поток, но он не работал.
(ограничение "FontManager.EXCEEDS_LIMIT, если размер шрифта превышает 60 КБ". - http://www.blackberry.com/developers/docs/5.0.0api/net/rim/device/api/ui/FontManager.html)
Попробуйте переопределить paint() каждого поля метки и применить setFont внутри него.
LabelField lf1 = new LabelField("This is font 1"){
protected void paint(Graphics graphics)
{
setFont( getFont().derive(Font.STYLE_BOLD,15));
graphics.drawText(getText(), 1, 1);
super.paint(graphics);
}
};
LabelField lf2 = new LabelField("This is font 2"){
protected void paint(Graphics graphics)
{
setFont( getFont().derive(Font.STYLE_ITALIC,18));
graphics.drawText(getText(), 1, 1);
super.paint(graphics);
}
};
LabelField lf3 = new LabelField("This is font 3"){
protected void paint(Graphics graphics)
{
setFont( getFont().derive(Font.STYLE_UNDERLINED,20));
graphics.drawText(getText(), 1, 1);
super.paint(graphics);
}
};
add(lf1);
add(lf2);
add(lf3);