在Android中使用外部字体

63

我想在我的应用程序中使用外部字体。我尝试使用AssetManager添加新的fonts,但没有成功。以下是我的代码:

Typeface face;

face = Typeface.createFromAsset(getAssets(), "font.otf");

textview.setTypeface(face);

但是它没有显示文本...

请帮助我解决这个问题。


1
为了整洁,您可以将字体放在assets/fonts文件夹中并访问Typeface face; face = Typeface.createFromAsset(getAssets(), "fonts/" +"font.otf"); textview.setTypeface(face); - Gogu CelMare
6个回答

69

据我所知,Android不支持OpenType字体。请使用TrueType字体代替。


更新: 显然现在已经支持OpenType,至少在某种程度上。起初它是不支持的,因此您需要在您的应用程序将支持的任何Android版本上全面测试您的字体。


2
是的,根据您的代码,您需要将字体放在资产/目录的根目录下,但除此之外,如果有兼容字体,则应该没有问题。 - CommonsWare
错误信息表明您的模拟器与adb或Eclipse之间存在通信困难——与字体无关。下载http://commonsware.com/Android/Android-src-2_1.zip,您将找到一个Android项目,展示了如何加载TrueType字体。另外请注意,Android 1.6现在似乎可以让您从APK之外加载字体(例如,您单独下载的字体)。 - CommonsWare
如何从库项目中访问字体?它无法正常工作。 - Maxwell
@Maxwell:我不相信库项目的资源可以供使用该库的应用程序使用。 - CommonsWare
我在一些设备上遇到了加粗自定义字体可视化问题(字母带有透明内部区域),所以我通过http://everythingfonts.com/otf-to-ttf将.otf转换为.ttf,解决了这个问题。 - Serhii Nadolynskyi
显示剩余3条评论

12
为了方便访问字体,我们需要以一种方式将其与应用程序捆绑在一起,使得我们的代码随后可以加载它。为此,我们在资产目录中创建一个“Fonts”文件夹。
这可能是您的.xml文件。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
    android:id="@+id/DefaultFontText"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="30sp"
    android:text="Here is some text." />
<TextView
    android:id="@+id/CustomFontText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="30sp"
    android:text="Here is some text.">
    </TextView>
在你的 .java 类中编写以下代码。
Typeface tf = Typeface.createFromAsset(getAssets(),
            "fonts/BPreplay.otf");
    TextView tv = (TextView) findViewById(R.id.CustomFontText);
    tv.setTypeface(tf);

9

Android支持OTF字体(我不确定是从哪个SDK版本开始的,但它肯定适用于1.6版本),我曾经使用过打字机OTF字体一段时间,但渲染效果远不如我最终使用的TTF版本(通过在线字体转换器)。基线到处都是(有些字母比其他字母高了整整2个像素),在像HTC Wildfire这样的LDPI手机上问题会因为像素更大而被极大放大。


1

安卓支持otf和ttf两种字体格式,我都有使用过。

tv3 = (TextView)findViewById(R.id.tv1);
    Typeface typeFace = Typeface.createFromAsset(getAssets(), "fonts/TRAJANPRO-BOLD.OTF");
    tv3.setTypeface(typeFace);

这是我用于英语和本地语言的步骤


1

这很不错,但是将1000多台电视更换为他们自己的定制电视... 不太方便。 - egorikem

1

我曾经遇到过同样的问题。我的字体在安卓上也无法使用,但我需要它能够工作。使用字体编辑器,我将我的字体中的字符复制到了 Android-src-2_1 中 FontSampler 示例自带的字体中。这样就完美解决了。

虽然我承认从知识产权的角度来看,我的方法有些可疑,但实际上我并没有使用原始字体,因为所有字符都被替换了,所有对旧字体的引用也被替换了。我曾尝试“查看”两种字体的定义方式,但是让所有字体变量匹配也不起作用。所以最终,我使用原始字体的框架作为新字体的模板。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接