blackberry - 加载超过一种自定义字体黑莓时出现问题

标签 blackberry fonts font-family

我尝试加载自定义字体,它有效。现在我遇到了问题,我无法在应用程序中使用多种自定义字体。如果我添加三个 labelFields,每个 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;
}   

最佳答案

我找到原因了。如果字体已全部加载,则每个自定义字体的最大大小为 60kb。

所以我改变了加载器方法。

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;
    }

有人知道加载大于 60kb 的字体的解决方案吗?我已经尝试使用输入流,但它不起作用。

(限制“如果字体数据大小超过 60k,则为 FontManager.EXCEEDS_LIMIT。” - http://www.blackberry.com/developers/docs/5.0.0api/net/rim/device/api/ui/FontManager.html#load%28java.io.InputStream,%20java.lang.String,%20int%29 )

关于blackberry - 加载超过一种自定义字体黑莓时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7552849/

相关文章:

java - 在Java中调用位图类

CSS: IE "ignores"字体系列,正文除外

java - 使用 BlackBerry JDE 4.5.0 从 HTTP 服务器保存 mp3 并播放文件

黑莓 - 运行后台应用程序

css - Chrome 上不显示字体

xcode - 使用 Swift (Xcode 6) 更改 BarButtonItem 字体

html - 为什么我的 Font Awesome 图标不居中?

html - CSS:正文中的字体系列不适用于内容

javascript - 更新或删除自定义字体系列

当我合法地保留一个对象时,黑莓单元测试抛出异常