Android字体:从资产中创建Typeface

43

我有一个自定义视图,它会将文本绘制到Canvas上。我想要将font更改为存储在assets文件夹中的字体。

我正在使用Android Studio,所以我创建了一个src/main/assets文件夹,并在其中放置了我的ttf文件。

Paint txt = new Paint()
Typeface font = Typeface.createFromAsset(getAssets(), "robotobold.ttf");
txt.setTypeface(font);

问题是Android Studio无法识别我的自定义视图中的getAssets(),但它可以在我的活动中识别它。我尝试从我的Activity中传递Typeface,但当我这样做时,它不会更改字体


1
一个建议,如果你想要从assets应用自定义字体,最好创建一个继承TextView的自定义类,在其中设置字体并在xml布局中使用它,这样,在运行时你就不需要为所有的TextView应用字体。 - Manjunath
发现一个库的使用,其中包含多个视图,如TextView、EditText、Button等等。http://stackoverflow.com/a/42001474/4446392 - Chathura Jayanath
7个回答

70
你可以使用ViewgetContext()方法来获取当前Context,然后用它来获取assets
Typeface font = Typeface.createFromAsset(getContext().getAssets(), "robotobold.ttf");

34

首先,您必须将assets文件夹放在project中,而不是src/main中。然后,在assets文件夹中创建一个名为fonts的文件夹。接着,把具体的字体类型ttf文件放在其中。您可以像以下这样在代码中使用字体类型:

Typeface type = Typeface.createFromAsset(getAssets(),"fonts/filename.ttf");
textview.setTypeface(type);

谢谢。我一直在尝试使用“/fonts/…”,但是android.os无法获取字体。去掉破折号后,android系统就能够识别字体文件了。 - sivi
嘿,你说的“在你的项目内”是什么意思? 应用程序找不到字体,我已经把它们放在“/src/main/assets/font”中了。 - Sercan Samet Savran

5

创建了一个名为src/main/assets的文件夹,并将字体文件放在其中。

在Activity中

Typeface font = Typeface.createFromAsset(getAssets(),  "Mukta-Regular.ttf");
tv.setTypeface(font);

在Fragment中

Typeface.createFromAsset(getActivity().getAssets(), "Mukta-Regular.ttf");
tv.setTypeface(font);

1
为了在我的项目中重复使用字体,我创建了一个充满字体方法的类,这样我就不必每次都创建新的字体。
我称这个类为FontClass,在这个类中,有一个方法用于每种我需要使用的字体,例如:
public static Typeface getOpenSansRegular(Context c){
    return Typeface.createFromAsset(c.getAssets(), "OpenSans-Light.ttf");
}

然后我可以像这样使用它们:
TextView text = (TextView) findViewById(R.id.textview);
text.setTypeface(FontClass.getOpenSansRegular(getApplicationContext());

2
那如何防止每次都创建新的字体? - weston

0
我的错误在于添加了这一行


Typeface mFont = Typeface.createFromAsset(this.getAssets(), "abc.ttf");

在 onCreate() 之前


0
    Typeface robo = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Roboto-Thin.ttf");

0
你需要将你的资产文件夹放在“项目”文件夹中,而不是“src”文件夹中。你已经把字体文件放在了"src/main/assets/robotobold.ttf",所以它无法正常工作。你需要像这样放置它“/assets/robotobold.ttf”。

我一开始也是这样做的,但后来发现了这个链接:https://dev59.com/BGQn5IYBdhLWcg3wcm57 - Caleb Bramwell
不,这就是我为什么要问这个问题的原因。 - Caleb Bramwell

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