【问题标题】:Custom Font not working on Android自定义字体不适用于 Android
【发布时间】:2012-10-28 14:22:16
【问题描述】:

我正在做以下事情。我得到的只是基本字体,而不是我的自定义符号字体。

有什么想法吗?

     Paint pnt = new Paint();
    // SymbolNo is 38. Returns string "&" which is correct in normal font.
    String symbolText = Character.toString((char)SymbolNo); 

    // Should adopt a symbol font and draw symbol to screen instead. But I just see "&"
    Typeface tf = Typeface.createFromAsset(m_context.getAssets(), "fonts/myFont.TTF" ); 
    pnt.setTypeface(tf);

    m_canvas.drawText(symbolText,x, y, pnt);

我的字体在assets/fonts/myFont.TTF

【问题讨论】:

  • 从字体名称中删除空格,然后尝试。
  • @NiravRanpara 谢谢,我已经想到了,我试过了。但没有运气。
  • @SahilMahajanMj 绘制对象。
  • 您想在绘画中使用自定义字体编写文本?
  • 不,我想在我的 android 画布上绘制自定义字体文本。

标签: android fonts drawing android-canvas symbols


【解决方案1】:

您好,我对此有一个解决方案,您可以尝试以这种方式使用字体吗...我已经在我的项目中实现了这个...

步骤:

  1. 制作一个包 (com.fontUtils.fonts)
  2. 使字体文件类似于 TextView 、EditText 或按钮文本

例如:

    public class ButtonHelveticaBold extends Button {

        Context ButtonFontContext;

        public ButtonHelveticaBold(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            ButtonFontContext = context;
        }

        public ButtonHelveticaBold(Context context, AttributeSet attrs) {
            super(context, attrs);
            ButtonFontContext = context;
        }

        public ButtonHelveticaBold(Context context) {
            super(context);
            ButtonFontContext = context;
        }

        @Override
        public void setTypeface(Typeface tf, int style) {
            Typeface typeFaceHelvetica;
            if (style == Typeface.BOLD) {
                typeFaceHelvetica = Typeface.createFromAsset(getContext().getAssets(), "fonts/helvetica_bold_neue.ttf");
            } else {
                typeFaceHelvetica = Typeface.createFromAsset(getContext().getAssets(), "fonts/helvetica_neue_regular.ttf");
            }
            super.setTypeface(typeFaceHelvetica);
        }

    }

3 : 在 XML 中使用 this 像这样:

   <com.fontUtils.fonts.ButtonHelveticaBold 
      android:id="@+id/btn"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      />

【讨论】:

  • typeFaceHelvetica = Typeface.createFromAsset(getContext().getAssets(), "fonts/helvetica_neue_regular.ttf"); 行在您的解决方案中,但这就是问题所在。好像你只是在包装它。但在我的场景中,潜在的问题仍然存在。
  • 没有得到你我给你解决方案如何使用自定义字体
  • 您提供的是一个自定义按钮类,它设置自定义字体的方式与我完全相同。 (所以我的字体也会失败)。
  • 不,这对所有 TextView 都有效,如果你想在上面实现的话......对于 EditText 中的任何人也
  • 这样做的好处只是你不必像你使用的那样声明字体,所以这感觉是使用字体的更好方法
【解决方案2】:

并非所有字体都适用于 Android。它只是默默地失败了。

一种做法是找到一个可以处理自定义字体(例如this sample app of mine)的应用,作为实验的基础。您可以运行该应用程序以确认其字体出现,然后用您的字体替换其中一种。如果这可行,那么您在字体中加载的方式有些混乱(尽管我不知道是什么或如何)。如果字体在我的示例应用程序中无法使用,而该应用程序附带的字体确实可以使用,那么问题出在字体上。

不幸的是,我不知道是什么让字体工作或不工作。您可以尝试在字体编辑器中打开字体,进行细微更改(例如,删除一些您知道不需要的字形),将其保存回来,然后查看修改后的字体是否有效。如果是这样,则意味着最初保存的字体中有一些 Android 不喜欢的内容,但您的字体编辑器可以生成 Android 友好的字体。

【讨论】:

  • 我会试试你的建议。并非字体文件中的所有字符都具有实际映射的字符是否重要。 Aka,我看到很多空白占位符矩形。
  • @Doomsknight:可能,虽然我不时看到那些字体可以正常工作,但我不知道缺少字形的一般问题。可以想象,有些特殊值需要字形(例如,ASCII 32 表示空格),如果缺少该字形,它会破坏 Android 的字体。我还没有发现为什么某些字体会以这种方式静默失败的明确原因(或一组原因)。
  • 我可以将字符从一个字符集中复制到一个新字符集中,并且工作正常。不幸的是,我使用的字体程序具有垃圾复制功能。并且会花费我太长时间来逐一复制。我会继续寻找更好的。不要以为你知道任何。感谢您的回答。这个 1995 字体中的某些东西导致了问题。
  • @Doomsknight:我知道我在 Linux 上使用过字体编辑器,但我没有在我的菜单中看到它,所以我忘记了我使用的是哪一个。而且,我一开始并没有经常使用它,所以我不知道它的功能有多广泛。 TL;DR:抱歉,我没有给你好的建议。
  • @Doomsknight:“你认为平台“Windows Symbol”字符集是问题吗?” - 它的名称中有“Windows”,所以我要责备它。 :-) 关于您的其余评论,我从未在应用程序中使用过符号字体,所以我不知道。对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多