1

在应用程序中,我必须使用自定义字体。首先,我创建了扩展 VerticalFieldManager 类的类。在这个类中,我想使用自定义字体。我有 TTF 文件(名称是 AGENCYB.TTF)。我将此文件保存在 res/img 文件夹中。要加载此文件,我使用以下代码:

if (FontManager.getInstance().load("AGENCYB.TTF", "MyFont",
        FontManager.APPLICATION_FONT) == FontManager.SUCCESS)
{
   System.out.println("**************************IF SUCCESS*******");
   try
   {
      FontFamily typeface = FontFamily.forName("MyFont");
      myFont = typeface.getFont(Font.BOLD, 50);
      label2.setFont(myFont);
   }
   catch (ClassNotFoundException e)
   {
      System.out.println(e.getMessage());
   }
}

但它不会改变标签字段的字体。我使用此链接实现了代码:http: //docs.blackberry.com/en/developers/deliverables/18095/BlackBerry_Java_SDK-Development_Guide--1239696-0730090812-001-6.0-US.pdf

任何想法都会有很大帮助。

谢谢

** * ** * ** **编辑* ** * ** * ** * **** _

if (FontManager.getInstance().load("AGENCYB.TTF", "AGENCYB", FontManager.APPLICATION_FONT) == FontManager.SUCCESS)
4

3 回答 3

1

首先,这是我用来加载自定义字体的 BlackBerry 教程

其次,在 API 文档所说的任何返回值中,我都没有看到返回代码 8 FontManager.load()SUCCESS是 0 的值,所以你没有成功调用load().

http://www.blackberry.com/developers/docs/7.0.0api/net/rim/device/api/ui/FontManager.html

如果字体加载成功,则返回
FontManager.SUCCESS。
FontManager.FONTS_ARRAY_FULL 如果加载的字体太多。
FontManager.MISSING_TYPEFACE_NAME 如果字体名称无效。如果字体名称重复,则 FontManager.DUPLICATE_NAME。
FontManager.DUPLICATE_DATA 如果字体数据是重复的。
FontManager.NO_FONT_DATA 如果没有找到字体数据。
如果字体数据的大小超过 60k,则 FontManager.EXCEEDS_LIMIT。
FontManager.MISS_RESOURCE 如果找不到字体文件。
FontManager.FAILED_TO_LOAD_FILE 如果字体数据无效或字体格式无效。

当我在 OS 5.0 和 7.1 上的调试器中运行时,我看到它-8等于FontManager.DUPLICATE_NAME,但没有看到任何代码等于8

另外,您是否自己生成了这个字体文件(AGENCYB.TTF)?因为您的代码要求在 AGENCYB.TTF 文件中使用名为MyFont的字体。除非有人编写Hello World程序(和自制的 .ttf 文件),否则我不会期望字体实际上被命名为MyFont 。

如果这是自定义字体,由 3rd-party 字体库提供,或者从其他人那里购买,我希望字体名称不是MyFont,这就是您可能复制代码的 BlackBerry 示例中的字体名称从。

因此,请仔细检查,如果它仍然无法正常工作,请告诉我们。


更新:因为看起来你"AGENCYB"在代码中使用字符串时也会失败,我认为问题在于你使用了错误的字体名称。即使该文件是AGENCYB.TTF,我敢打赌该文件中的字体名称不是 AGENCYB。这与您在 Windows 下找到的文件相同C:\Windows\fonts吗?如果是这样,您可以使用 Windows(至少 7)查看字体文件。

只需在 Windows 资源管理器中双击 .ttf 文件,它就会给您一个预览,显示正确的字体名称。 名称是您在两个java 调用中使用的名称,其中示例代码具有"MyFont". 在这种情况下,您会看到字体名称可能是"Agency FB". 试试看。

在此处输入图像描述


更新 2: 我还尝试从可以在Windows 7 机器上找到的文件中加载Agency FB字体。这个确切的代码在 5.0 8900 模拟器上为我工作:AGENCYR.TTFC:\windows\Fonts\AGENCYR.TTF

  int result = FontManager.getInstance().load("AGENCYR.TTF", "Agency FB", FontManager.APPLICATION_FONT);

  if (result == FontManager.SUCCESS)
  {
     try 
     {
        FontFamily typeface = FontFamily.forName("Agency FB");
        Font myFont = typeface.getFont(Font.PLAIN, 50);
        helloWorld.setFont(myFont); 
     }
     catch (ClassNotFoundException ex) 
     {
     }
  }

在此处输入图像描述

于 2013-01-16T06:23:23.023 回答
0

确切地说,您应该检查所需的字体是否已经加载,因此它会为您提供 -8 或成功的 int ,仅此而已!

于 2013-04-14T04:51:45.527 回答
0

LabelField lbl = new LabelField("这是测试标签");

// 如果字体已经加载,那么使用下面的

   if(FontManager.getInstance().load("TickingTimebombBB_ital.ttf", "Ticking Timebomb BB", FontManager.APPLICATION_FONT) == FontManager.DUPLICATE_NAME){
         Logger.debug("---font already loaded-----");
            try 
            {
                System.out.println("---load once more---");
                FontFamily typeface = FontFamily.forName("Ticking Timebomb BB");
                Font myFont = typeface.getFont(Font.PLAIN, 80);
                lbl.setFont(myFont); 
            }
            catch (ClassNotFoundException e) 
            {
                Logger.error("---error-----"+e.getMessage());
            }
    }

如果字体尚未加载,则使用以下

else if(FontManager.getInstance().load("TickingTimebombBB_ital.ttf", "Ticking Timebomb BB", FontManager.APPLICATION_FONT) == FontManager.SUCCESS) {
            try 
            {
                Logger.debug("---load first time---");
                FontFamily typeface = FontFamily.forName("Ticking Timebomb BB");
                Font myFont = typeface.getFont(Font.PLAIN, 80);
                lbl.setFont(myFont); 
            }
            catch (ClassNotFoundException e) 
            {
                Logger.error("---error-----"+e.getMessage());
            }

    }
于 2014-01-21T08:50:18.553 回答